Compare commits

...

129 Commits
v1.0.0 ... main

Author SHA1 Message Date
690a14b77c
(l10n) Update Italian and Spanish Translations
These translations were written by the typical contributors, they just are not being submitted via a pull request and I entered them in manually instead.
2025-06-24 13:00:09 -04:00
草莓蛋糕
07f7392ed1
(l10n) Update Norwegian Translations (#37) 2025-06-18 16:04:23 -04:00
DDinghoya
24a8b2b0bc
(l10n) Update Korean Translations (#36) 2025-06-12 13:36:43 -04:00
63800eac77
(l10n) Minor fix for translation source files 2025-06-05 09:05:51 -04:00
Gloria Goertz
a8dfcd3fe1
(l10n) Update German Translations (#35) 2025-06-05 08:59:37 -04:00
rougets
5ac3f4d385
(l10n) Update French Translations (#34) 2025-06-05 08:59:07 -04:00
N•I•L
b7e6929405
Updated Romanian Translations (#33) 2025-06-05 08:58:19 -04:00
dd189f31b1
Updated config to use Application Support on macOS
NUSGet will now also create .config if it doesn't exist on Linux, though I really can't see that ever happening.
2025-06-05 08:50:51 -04:00
27680626fa
Update translation files 2025-05-31 00:19:12 -04:00
cffa8f79ff
Fix background of theme options QMenu 2025-05-27 21:08:24 -04:00
109e3dc25a
Allow setting theme color theme from the menu bar
This functions essentially the same as the language selector. The language selector now also checks the currently set option on launch, and both the language and theme selectors spawn a popup prompting the user to restart NUSGet after selecting a new value.
2025-05-27 14:44:48 -04:00
db6dc65791
Work in progress language selection support
Still need to add a popup telling you that NUSGet needs to be restarted after changing the language, and having it load the selected language in the selection menu so that it's checked on launch.
2025-05-26 21:50:04 -04:00
e8d6a19d03
Disable debug line that was setting progress bar to busy on launch 2025-05-25 01:02:57 -04:00
811e2ef01f
Added progress bar to show download progress 2025-05-25 00:58:55 -04:00
4a08bd47cd
Allow overriding the color scheme with the THEME environment variable 2025-05-21 12:53:32 -04:00
f29964be53
Another quick style fix for light theme on Windows 2025-05-20 23:16:01 -04:00
1af938decd
Improved light theme based on testing on Linux/Windows 2025-05-20 23:07:24 -04:00
a4679be043
Added an experimental light theme and automatic system theme detection 2025-05-20 22:26:11 -04:00
7caa7775ff
Force correct coloring so that text is always legible on all system themes
Since NUSGet only supports a dark theme right now, but your system may use a light theme, the OS may recolor text on screen to be black on black, which is obviously bad for readability. All text will now be white, so you can always read it.
And hey, maybe there will be a proper light theme soon!
2025-05-20 21:11:29 -04:00
07579d7361
Improve illegal character removal
Now removes the NTFS-forbidden characters on all platforms, as some may still cause issues depending on your OS and FS. These characters are also now removed during the actual download process, so they'll still appear in the WAD name box, but will be stripped out before the file is created.
2025-05-20 13:54:27 -04:00
9b4addc8a5
Remove illegal characters from WAD names on Windows 2025-05-20 09:08:07 -04:00
LNLenost
a1bfcd5f8b
Update Italian translations (#31)
* Delete resources/translations/nusget_it.ts

* new translations
2025-05-20 08:52:37 -04:00
c748400cd3
Improved UI spacing consistency between languages 2025-05-15 14:22:10 -04:00
d3653e3138
Add DarkMatterCore to README, minor translation cleanup 2025-05-13 19:01:09 -04:00
Pablo Curiel
3588b3cc54
Add Spanish localization (#30)
Other changes include:

* NUSGet.py: add translation file name fallback under Windows to fix a previously unhandled edge case (tested by me, provided by @NinjaCheetah himself).
* NUSGet.py: fix translation key lookups for strings that need to be formatted at runtime.

* ui_AboutDialog.py: fix translation key lookups for strings that need to be formatted at runtime.
* ui_AboutDialog.py: add myself to the list of translation contributors.

* Translations: update source and translation strings across all localization files to reflect the fixes mentioned above.
* Translations: update source string locations and add a new unfinished translation to all localization files (as a result of running update_translations.py).
2025-05-13 17:57:28 -04:00
rougets
c8737ad507
Update French translations (#29)
* l10n: update French translation file

* l10n: update MainWindow French translations

* l10n: add AboutNUSGet French translations
2025-05-12 18:34:26 -04:00
f76ad67108
Fix image prefix path on Windows 2025-05-12 18:30:50 -04:00
2557ad236e
Added custom information icon, should fix clipping on Windows 2025-05-12 18:22:05 -04:00
a4ee311d73
Explain testing languages in TRANSLATING.md 2025-05-12 11:59:37 -04:00
0bf0880b84
Update translation directions 2025-05-12 11:49:31 -04:00
5a8439906a
Fix for help menu on Windows, dropdown still has graphical issues 2025-05-11 23:51:21 -04:00
69299ad956
Help menu style now based on dropdown style 2025-05-11 23:20:57 -04:00
bc8592178c
Override Windows changing text colors inappropriately 2025-05-11 22:41:58 -04:00
1ee30146e5
Fixed dropdown styling once and for all 2025-05-11 22:21:53 -04:00
N•I•L
3a6ef23fb9
Update Romanian translations (#28) 2025-05-11 20:01:07 -04:00
草莓蛋糕
8e87f6b067
norwegian translation update (#27)
* norwegian translation updates

* mistake fix :c
2025-05-10 19:13:37 -04:00
0e7dd5815e
Improve dropdown styling 2025-05-09 13:51:12 -04:00
0eb003d599
Keep "About NUSGet" and "About Qt" under the application menu on macOS
Defined menu roles for those items so that Qt knows they belong under "NUSGet" when on macOS. This worked automatically somehow in English, but when loading a localization they'd be relocated to "Help" like they are on Windows and Linux. They'll now stay in the correct place for all languages.
2025-05-09 12:56:26 -04:00
4b0a03cc97
Base translation update, ensures that .ts files match sources
This really shouldn't matter much, but I just want to make sure that translations are done on up-to-date .ts files. Pushing these will make sure anyone who updates their fork gets them and nothing will get missed if they don't run update_translations.py.
2025-05-09 11:11:35 -04:00
DDinghoya
674b1b0106
Update Korean translations (#26) 2025-05-09 11:08:50 -04:00
Gloria Goertz
40acae51ea
Update German translations (#25) 2025-05-09 08:22:49 -04:00
db9b0d665d
Stylesheet patch to make tree scrollbar padding consistent 2025-05-08 21:31:21 -04:00
782191b60b
Added missing French credit (very sorry rougets) 2025-05-08 20:39:04 -04:00
51529c2d3b
Pin Nutika to latest 2.6.x release to fix distribution issue on Windows 2025-05-08 20:32:03 -04:00
0a458a80e0
Fix styling of vertical scrollbar in tree views 2025-05-08 20:16:41 -04:00
2b4a8a97e1
Added hover colors to scroll bars 2025-05-06 23:37:58 -04:00
d5cddfc4c0
Added QSS for custom scroll bars
Also enabled the Wii U NUS by default again, because that got missed before. Whoops.
2025-05-06 22:36:55 -04:00
6997ba759f
Added more custom QSS, getting close to finished 2025-05-06 21:58:26 -04:00
917b9f665a
Slightly increase window size, improve about dialog 2025-05-06 18:30:33 -04:00
249ba861ff
Added custom QSS to make NUSGet look nice and pretty (still WIP)
Massive thanks to Isla and Alex from WiiLink for making all the styling I'm using here.
2025-05-05 21:53:52 -04:00
5a42cc5bd7
Added About NUSGet and About Qt dialogs 2025-05-04 19:20:48 -04:00
4f993a3a62
Fix setting custom download dir to cwd when canceling file dialog 2025-04-22 21:50:27 -04:00
a3d8dc7887
Added support for custom download directories 2025-04-22 21:46:15 -04:00
bcb86bc4b0
Added support for disabling auto-updates via a new config file 2025-04-21 23:27:54 -04:00
Aep
1e0fda7407
Change Region Select danger description (#24) 2025-04-12 17:26:18 -04:00
e96d8932d0
Generate WAD name from title name rather than requiring dedicated key 2025-02-23 19:31:12 -05:00
dcb1cdebca
(db) Fixed name for "Everybody Votes Channel" and added missing version 2025-02-23 18:50:31 -05:00
33bea6a560
UPDATE VERSION 2025-02-18 21:29:42 -05:00
d1570711ac
Minor update required for libWiiPy v0.6.0 compatibility 2025-02-18 20:11:12 -05:00
449a680d32
Add safeguards to system Qt library loading on Linux
Also made minor update for libWiiPy v0.6.0 compatibility
2025-02-18 20:10:27 -05:00
rougets
35989d038a
Add French translations (#23) 2025-01-20 13:31:41 -05:00
bf313eedf3
Update README.md 2025-01-16 21:18:52 -05:00
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
LNLenost
85763cae60
New Italian translations :D (#10)
* Delete resources/translations/nusget_it.ts (old translation)

* Uploaded new Italian translation
2024-11-12 16:51:13 -05:00
a1b071b9c6
Merge pull request #9 from NotImplementedLife/main
Added Romanian translation
2024-11-07 14:30:01 -05:00
NotImplementedLife
96e2f5fa0d added Romanian translation 2024-11-07 20:08:00 +02:00
ffac804ada
Update python-build.yml
Now uploads non-onefile build for Windows, since on Windows the "folder with executable and dependencies" distribution strategy is pretty typical and wouldn't have the speed penalty of self-extraction that the onefile has.
2024-11-06 22:59:26 -05:00
74acfff007
Merge pull request #8 from yeah-its-gloria/main 2024-10-31 13:20:18 -04:00
yeah-its-gloria
6ae2a71e5c
Fix some dumb mistakes and add more translation comments 2024-10-31 15:47:48 +01:00
b655dd161b
Merge pull request #7 from yeah-its-gloria/main
German translation
2024-10-31 10:36:39 -04:00
yeah-its-gloria
3700154578
Add German translation 2024-10-30 19:52:38 +01:00
a272fbc097
Bump macOS version used for GitHub Actions to macos-latest 2024-10-29 23:01:30 -04:00
3a8dfb95a1
Added guide for translation and new script to build translations 2024-10-29 22:54:47 -04:00
58d3f7bd3e
Merge pull request #6 from yeah-its-gloria/main 2024-10-22 06:55:59 -04:00
yeah-its-gloria
f55cb05703
Apply UI fixes 2024-10-22 09:46:58 +02:00
yeah-its-gloria
33b30b4aa5
Clean up the UI 2024-10-21 23:44:27 +02:00
yeah-its-gloria
dd79be0b48
Fix version lookup
Checking regions was pretty superfluous anyway, since it only served to *potentially* speed up the lookup.
2024-10-21 23:22:51 +02:00
yeah-its-gloria
9c15eac1fd
Verify titles
Name archives properly using the database
Fix UI problems on macOS
2024-10-21 14:03:07 +02:00
yeah-its-gloria
0dbe28914d
Add batch downloading with NUSD scripts 2024-10-19 18:07:42 +02:00
bc1858a5a5
Add region to WAD file names if title is not region free 2024-08-22 21:48:38 -04:00
0ca2cc272a
Improved how title loading is handled and improved databases 2024-08-21 22:39:50 -04:00
ac42de6efc
Added last missing translations for message boxes 2024-08-21 19:37:59 -04:00
e2decf8d6f
Wrote script to update ts files since the real one is broken 2024-08-21 19:34:08 -04:00
bcf82a011f
NUSGet now checks for updates on startup 2024-08-21 19:04:39 -04:00
1b4324e9b8
Update README with platform-specific usage information 2024-08-21 18:20:08 -04:00
cbbac55743
Added option to patch downloaded IOSes 2024-08-17 23:36:45 -04:00
adc8be9cbb
Added "Hidden Channels" category to Wii/vWii databases 2024-08-13 21:30:03 -04:00
8e326aeb56
Fixed English text not appearing 2024-08-12 21:14:12 -04:00
807e632505
Improved translation handling and fixed word wrapping for checkboxes 2024-08-12 18:55:28 -04:00
911c01a066
Merge pull request #3 from LNLenost/main
Added Italian translation, created issue templates
2024-08-12 17:17:23 -04:00
LNLenost
f4c61ed020
Created issue templates 2024-08-09 11:42:13 +02:00
LNLenost
6d1e53c777
Added Italian translation 2024-08-09 11:38:35 +02:00
LNLenost
9829ae0365
Delete resources/translations/nusget_it.ts since it was all in english 2024-08-09 11:37:53 +02:00
f21357c01d
Minor README fixes 2024-07-22 03:01:35 -04:00
439aebbdb8
Added Linux packaging files and added linux-install to Makefile 2024-07-21 20:11:14 -04:00
bf09f3b18e
Small GitHub Actions fix for the Nutika binary no longer being named 'nuitka3' 2024-07-21 19:28:13 -04:00
7f788ae36c
Update GitHub Actions workflow to remove .bin from the end of the Linux binary's name 2024-07-17 21:58:09 -04:00
96cab930f0
Minor database correction 2024-07-17 15:02:35 -04:00
7518a5e663
Merge pull request #2 from rolfiee/main
fix typos in norwegian translation.
2024-07-06 07:48:05 +10:00
Rolfie
8193fe029b
fix typos in norwegian translation. 2024-07-05 02:46:51 +02:00
62467bb616
Removed compiled translations and added step to build them 2024-07-04 06:32:24 +10:00
ca81c2e6d3
Added Norwegian translation, blanks for other common languages 2024-07-04 06:13:46 +10:00
47904c72be
Made more strings translatable, including error messages 2024-07-03 07:42:36 +10:00
dc82790aef
Add base for translating the NUSGet interface via Qt Linguist 2024-07-03 07:11:25 +10:00
2db66af177
Updated wording in interface, small database corrections 2024-07-01 01:05:12 -04:00
50 changed files with 19924 additions and 1051 deletions

26
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,26 @@
---
name: Bug report
about: Create a report to help us improve NUSGet.
title: ''
labels: bug
assignees: ''
---
### Describe the bug
### Steps to Reproduce
### Screenshot(s) (if applicable)
### System information:
- **OS and version:**
- **NUSGet version:**
If you're running the app from source, provide the below information:
- **Are you compiling NUSGet, or running the Python script directly?**
- **Python version:**
- **Installed libWiiPy version:**

View File

@ -0,0 +1,10 @@
---
name: Feature request
about: Suggest an idea for NUSGet!
title: ''
labels: enhancement
assignees: ''
---
**Your idea...**

View File

@ -1,5 +1,4 @@
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
# This workflow will install Python dependencies and then build NUSGet for all platforms
name: Python application
@ -20,56 +19,83 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install ccache for Nuitka
run: sudo apt update && sudo apt install -y ccache libicu70
- name: Set up Python 3.11
run: |
sudo apt update && \
sudo apt install -y ccache patchelf
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.11"
python-version: "3.12"
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Build Package
run: |
nuitka3 --show-progress --include-data-dir=data=data --include-data-dir=resources=resources --assume-yes-for-downloads --onefile --plugin-enable=pyside6 NUSGet.py
run: make all
- name: Prepare Package for Upload
run: |
mv NUSGet.bin ~/NUSGet.bin
mv NUSGet ~/NUSGet
cd ~
tar cvf NUSGet.tar NUSGet.bin
tar cvf NUSGet.tar NUSGet
- name: Upload Package
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4
with:
path: ~/NUSGet.tar
name: NUSGet-linux-bin
name: NUSGet-Linux-bin
build-macos:
build-macos-x86:
runs-on: macos-12
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.11"
python-version: "3.12"
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Build Package
run: |
nuitka3 --show-progress --include-data-dir=data=data --include-data-dir=resources=resources --assume-yes-for-downloads --standalone --plugin-enable=pyside6 NUSGet.py --macos-create-app-bundle --macos-app-icon=resources/icon.png
run: ARCH_FLAGS=--macos-target-arch=x86_64 make all
- name: Prepare Package for Upload
run: |
mv NUSGet.app ~/NUSGet.app
cd ~
tar cvf NUSGet.tar NUSGet.app
- name: Upload Package
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4
with:
path: ~/NUSGet.tar
name: NUSGet-macos-bin
name: NUSGet-macOS-x86_64-bin
build-macos-arm64:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Build Package
run: ARCH_FLAGS=--macos-target-arch=arm64 make all
- name: Prepare Package for Upload
run: |
mv NUSGet.app ~/NUSGet.app
cd ~
tar cvf NUSGet.tar NUSGet.app
- name: Upload Package
uses: actions/upload-artifact@v4
with:
path: ~/NUSGet.tar
name: NUSGet-macOS-arm64-bin
build-windows:
@ -79,20 +105,23 @@ jobs:
- uses: actions/checkout@v4
- name: Enable Developer Command Prompt
uses: ilammy/msvc-dev-cmd@v1.13.0
- name: Set up Python 3.11
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.11"
python-version: "3.12"
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Build Package
run: |
nuitka --show-progress --include-data-dir=data=data --include-data-dir=resources=resources --assume-yes-for-downloads --onefile --windows-icon-from-ico=resources/icon.png --plugin-enable=pyside6 NUSGet.py --windows-console-mode=disable
run: .\Build.ps1
- name: Upload Package
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4
with:
path: D:\a\NUSGet\NUSGet\NUSGet.dist
name: NUSGet-Windows-bin
- name: Upload Onefile Package
uses: actions/upload-artifact@v4
with:
path: D:\a\NUSGet\NUSGet\NUSGet.exe
name: NUSGet-windows-bin
name: NUSGet-Windows-onefile-bin

5
.gitignore vendored
View File

@ -27,6 +27,8 @@ main.dist/
NUSGet.build/
NUSGet.dist/
NUSGet.onefile-build/
NUSGet
NUSGet.app/
.installed.cfg
*.egg
MANIFEST
@ -174,3 +176,6 @@ remakewad.pl
# Also awful macOS files
*._*
*.DS_Store
# Compiled Qt files
*.qm

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
}
}

20
Makefile Normal file
View File

@ -0,0 +1,20 @@
CC=python -m nuitka
ARCH_FLAGS?=
all:
python build_translations.py
$(CC) --show-progress --assume-yes-for-downloads NUSGet.py $(ARCH_FLAGS) -o NUSGet
install:
rm -rd /opt/NUSGet/
install -d /opt/NUSGet
cp -r ./NUSGet.dist/* /opt/NUSGet/
chmod 755 /opt/NUSGet/
install ./packaging/icon.png /opt/NUSGet/NUSGet.png
install ./packaging/NUSGet.desktop /usr/share/applications
clean:
rm NUSGet
rm -rd NUSGet.build/
rm -rd NUSGet.dist/
rm -rd NUSGet.onefile-build/

1114
NUSGet.py

File diff suppressed because it is too large Load Diff

16
NUSGet.pyproject Normal file
View File

@ -0,0 +1,16 @@
{
"files": [
"NUSGet.py",
"./modules/core.py",
"./qt/ui/MainMenu.ui",
"./qt/py/ui_AboutDialog.py",
"./resources/translations/nusget_es.ts",
"./resources/translations/nusget_no.ts",
"./resources/translations/nusget_nb.ts",
"./resources/translations/nusget_fr.ts",
"./resources/translations/nusget_it.ts",
"./resources/translations/nusget_de.ts",
"./resources/translations/nusget_ro.ts",
"./resources/translations/nusget_ko.ts"
]
}

View File

@ -1,61 +1,86 @@
# NUSGet
A modern and supercharged NUS downloader built with Python and Qt6. Powered by libWiiPy and libTWLPy.
[![Python application](https://github.com/NinjaCheetah/NUSGet/actions/workflows/python-build.yml/badge.svg)](https://github.com/NinjaCheetah/NUSGet/actions/workflows/python-build.yml)
The name is a play on NuGet, the .NET package manager. Thank you [@Janni9009](https://github.com/Janni9009) for the name idea!
<div align="center">
<img src="https://github.com/user-attachments/assets/156eb949-93aa-4453-b7a0-99b784ec0c8c" alt="The icon for NUSGet" width=256 height=256>
<h1>NUSGet</h1>
<p>A modern and supercharged NUS downloader built with Python and Qt6.</p>
<p>Powered by libWiiPy and libTWLPy.</p>
<a href="https://github.com/NinjaCheetah/NUSGet/actions/workflows/python-build.yml">
<img src="https://github.com/NinjaCheetah/NUSGet/actions/workflows/python-build.yml/badge.svg">
</a>
</div>
![Linux Screenshot](https://github.com/user-attachments/assets/f9e0e6c4-6a04-4c2b-bffd-7a1dc58671ff)
## Features
NUSDGet allows you to download any content from the Nintendo Update Servers. Free content (content with a Ticket freely available on the servers) can be decrypted or packed directly into an installable archive (WAD/TAD).
NUSGet allows you to download any content from the Nintendo Update Servers. Free content (content with a Ticket freely available on the servers) can be decrypted or packed directly into an installable archive (WAD/TAD).
NUSGet also offers the ability to create vWii WADs that can be installed from within vWii mode, since the content directly from the update servers is only designed to be installed from Wii U mode.
The following features are available for all supported consoles:
- Downloading encrypted contents (files like `00000000`, `00000001`, etc.) directly from the update servers for any title.
- Creating decrypted contents (*.app files) from the encrypted contents on the servers. Only supported for free titles.
- Scripting support, allowing you to perform batch downloads of any titles for the Wii, vWii, or DSi in one script. (See `example-script.json` for an example of the scripting format.)
**For Wii and vWii titles only:**
- "Pack installable archive (WAD/TAD)": Pack the encrypted contents, TMD, and Ticket into a WAD file that can be installed on a Wii or in Dolphin Emulator. Only supported for free titles.
**For vWii titles only:**
- "Pack for vWii mode instead of Wii U mode": Re-encrpyt the Title Key in a vWii title's Ticket before packing a WAD, so that the WAD can be installed from inside the vWii on a Wii U. **This also creates WADs that can be installed directly in Dolphin, allowing for running the vWii System Menu in Dolphin without a vWii NAND dump!**
- "Re-encrypt title using the Wii Common Key": Re-encrypt the Title Key in a vWii title's Ticket before packing the WAD, so that the WAD can be installed via a normal WAD manager on the vWii, and can be extracted with legacy tools. **This also creates WADs that can be installed directly in Dolphin, allowing for running the vWii System Menu in Dolphin without a vWii NAND dump!**
**For DSi titles only:**
- "Pack installable archive (WAD/TAD)": Pack the encrypted contents, TMD, and Ticket into a TAD file that can be installed on a TAD or in a DSi-capable emulator. Only supported for free titles. For real hardware, these titles can be installed using [@rvtr](https://github.com/rvtr)'s handy [TAD Delivery Tool](https://github.com/rvtr/TDT).
## Using NUSGet
For basic usage on all platforms, you can download the latest release for your operating system from [here](https://github.com/NinjaCheetah/NUSGet/releases/latest), and then run the executable.
**Platform-Specific Notes:**
- **macOS:** To use NUSGet on macOS, you'll need to either open NUSGet.app using right-click -> Open, or by using the terminal command `xattr -d com.apple.quarantine NUSGet.app`. After doing either of those things once, you'll be able to double-click NUSGet to open it like you normally would for an app. Note that changes in macOS Sequoia require using the latter method.
- **Windows:** On Windows, you'll likely need to allow NUSGet.exe in your antivirus program. This includes Windows Defender, which is almost guaranteed to prevent the app from being run. This is not because NUSGet is malicious in any way, it's just that NUSGet isn't popular enough to be "known" to Windows, and I don't have the expensive signing certificate necessary to work around this. If you're in doubt, you can look at all of NUSGet's code in this repository.
- **Linux:** No special information applies on Linux, however you can build NUSGet yourself if you'd like to have it as an installed application with an icon that will appear in your favorite application launcher. See [here](https://github.com/NinjaCheetah/NUSGet?tab=readme-ov-file#for-linux-users) for more information.
## Building
### System Requirements
- **Windows:** Python 3.11 (Requires Windows 8.1 or later)
- **Linux:** Python 3.11
- **macOS:** Python 3.11 (Requires macOS 10.9 or later, however macOS 11.0 or later may be required for library support)
- **Windows:** Python 3.12 (Requires Windows 8.1 or later)
- **Linux:** Python 3.12
- **macOS:** Python 3.12 (Requires macOS 10.9 or later, however macOS 11.0 or later may be required for library support)
**Python 3.12 is not supported at this time.**
First, make sure you're inside a venv, and then install the required dependencies:
```shell
pip install --upgrade -r requirements.txt
```
After that, follow the directions for your platform.
First, install the required dependencies:
```
pip install -r requirements.txt
```
Then, use the command for your platform to build an executable with Nuitka:
**Windows**
```
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
### 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
make all
```
**Linux**
Optionally, **on Linux**, you can install NUSGet so that it's available system-wide. This will install it into `/opt/NUSGet/`.
```shell
sudo make install
```
nuitka3 --show-progress --include-data-dir=data=data --include-data-dir=resources=resources --assume-yes-for-downloads --onefile --plugin-enable=pyside6 NUSGet.py
On macOS, you can instead put the application bundle in `/Applications/` just like any other 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.
```shell
.\Build.ps1
```
**macOS**
```
nuitka3 --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
```
## Translations
A huge thanks to all the wonderful translators who've helped make NUSGet available to more people!
- **French:** [@rougets](https://github.com/rougets)
- **German:** [@yeah-its-gloria](https://github.com/yeah-its-gloria)
- **Italian:** [@LNLenost](https://github.com/LNLenost)
- **Korean:** [@DDinghoya](https://github.com/DDinghoya)
- **Norwegian:** [@Rolfie](https://github.com/rolfiee)
- **Romanian:** [@NotImplementedLife](https://github.com/NotImplementedLife)
- **Spanish:** [@DarkMatterCore](https://github.com/DarkMatterCore)
The result will be a single binary named `NUSGet` that contains everything required to run NUSGet. No dependencies are needed on the target system.
If your language isn't present or is out of date, and you'd like to contribute, you can check out [TRANSLATING.md](https://github.com/NinjaCheetah/NUSGet/blob/main/TRANSLATING.md) for directions on how to translate NUSGet.
## Why this and not NUSD?
NUS Downloader (Nintendo Update Server Downloader), is an old tool for downloading titles from the Nintendo Update Servers for the Wii and DSi. Originally released in 2009, and effectively last updated in 2011, it stills works today, however it definitely shows its age, and is in need of a refresh. One of the major shortcomings of NUSD is that it only supports Windows, as most of the tools for the Wii from that era are written in C# and use the .NET Framework, especially since they tend to rely on the C# library libWiiSharp. NUSD also has far more limited support for DSi titles, and no support whatsoever for vWii titles.
## Additional Thanks
The name is a play on NuGet, the .NET package manager. Thank you [@Janni9009](https://github.com/Janni9009) for the name idea!
With my introduction of [libWiiPy](https://github.com/NinjaCheetah/libWiiPy), there's now a work-in-progress Python library designed to eventually have feature parity with libWiiSharp. At this point in time, the library is featured enough that every piece of libWiiSharp that NUSD relied on is now available in libWiiPy, so I decided to put that to use and create a replacement for it. NUSGet offers nearly all the same features as NUSD (currently there is no support for the DSi servers or for scripting), but is built on top of a modern library with a modern graphical framework, that being Qt6. A major benefit of this rewrite is that its fully cross-platform, and is natively compiled for Windows, Linux, and macOS.
Thanks to all those who contributed to libWiiSharp and NUSD, without which this project would not exist.

78
TRANSLATING.md Normal file
View File

@ -0,0 +1,78 @@
# Translating NUSGet
To translate NUSGet into your language, first make sure that you have NUSGet's dependencies installed:
- [Git](https://git-scm.com/)
- [Python](https://python.org) (make sure to install a version listed as compatible in the README)
### Step 1: Fork and Prepare the Repository
To fork the repository, either click the "Fork" button on the repository's main page, or [click here](https://github.com/NinjaCheetah/NUSGet/fork).
Then, you'll need to clone your new fork locally and enter it:
```shell
git clone https://github.com/<your-username>/NUSGet
cd NUSGet/
```
Then, create and activate a venv (depending on your platform, you may need to specify `python3` rather than `python`):
```shell
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS, Linux, and other Unix-likes
source .venv/bin/activate
```
Finally, install NUSGet's dependencies:
```shell
pip install --upgrade -r requirements.txt
```
### Step 2: Add Your Language
Open `NUSGet.pyproject` in your editor of choice, and check for your language in it. If a line for your language doesn't exist, create a new entry following the format `"./resources/translations/nusget_XX.ts"`, where `XX` is the two-letter code that represents your language.
### Step 3: Update Translation Files
To update the `.ts` files that store the translations and to create them for any newly added languages, run:
```shell
python update_translations.py
```
This ensures that you're working on an up-to-date version of the strings in the app.
### Step 4: Launch Qt Linguist and Load the Translations
Qt Linguist is included as part of the `PySide6` package you installed during Step 1. To launch Qt Linguist, use the appropriate command for your platform, replacing `<ver>` with the version of Python you installed (for example, `3.12`).
```shell
# Windows
.venv\lib\python<ver>\site-packages\PySide6\linguist.exe
# macOS
open .venv/lib/python<ver>/site-packages/PySide6/Linguist.app
# Linux and other Unix-likes
./.venv/lib/python<ver>/site-packages/PySide6/linguist
```
If you have Qt Linguist installed system-wide already, you can use that instead. These steps are included primarily for those who don't, since installing the Qt Platform Tools on Windows or macOS requires having a Qt account.
Once you've launched Qt Linguist, you can open the `.ts` file for your language in it.
### Step 5: Translate!
### Step 6: Test Your Translations
If your current system language is the one you're NUSGet translating into, then you can just run:
```shell
python NUSGet.py
```
and the app should open in your language.
If your system language does not match the language you're translating to, you can specify a language override, like this:
```shell
LANG=xx_XX.UTF-8 python NUSGet.py
```
where `xx` is the two-letter language code, such as `ko` for Korean, and `XX` is the country code, such as `KR` for Korea. All together, that would give you:
```shell
LANG=ko_KR.UTF-8 python NUSGet.py
```
which would open NUSGet with the Korean translations loaded.
### Step 7: Push and Merge Your Translations
When you're done translating, commit your translations and push them to GitHub. Then, open a pull request on the original repository, and you're all done!

26
build_translations.py Normal file
View File

@ -0,0 +1,26 @@
# "build_translations.py", licensed under the MIT license
# Copyright 2024-2025 NinjaCheetah
# This script exists to work around an issue in PySide6 where the "pyside6-project build" command incorrectly places
# translation files in the root of the project directory while building.
import json
import pathlib
import subprocess
LRELEASE_CMD = "pyside6-lrelease"
pyproject_file = pathlib.Path("NUSGet.pyproject")
pyproject = json.load(open(pyproject_file, "r"))
files = []
for key in pyproject["files"]:
files.append(pathlib.Path(key))
ts_files = []
for file in files:
if file.suffix == ".ts":
ts_files.append(file)
for translation in ts_files:
cmd = [LRELEASE_CMD] + [translation] + ["-qm"] + [translation.with_suffix(".qm")]
subprocess.run(cmd, cwd=str(pyproject_file.parent))

View File

@ -6,11 +6,10 @@
"Versions": {
"World": [256, 512]
},
"Ticket": true,
"TAD Name": "Nintendo-DS-Cartridge-Whitelist-NUS"
"Ticket": true
},
{
"Name": "Launcher (System Menu)",
"Name": "Launcher",
"TID": "00030017484E41XX",
"Versions": {
"USA/NTSC": [512, 768, 1024, 1280, 1536, 1792],
@ -21,7 +20,6 @@
"Australia/NZ": [512, 768, 1024, 1280, 1536, 1792]
},
"Ticket": true,
"TAD Name": "Launcher-NUS",
"Danger": "The Launcher (DSi Menu) is a critical part of the DSi's operation, and should not be modified unless you have Unlaunch installed."
},
{
@ -35,8 +33,7 @@
"China": [4, 5, 6, 7, 8, 9],
"Australia/NZ": [3, 4, 5, 6, 7, 8, 9]
},
"Ticket": true,
"TAD Name": "Version-Data-NUS"
"Ticket": true
},
{
"Name": "WiFi Firmware",
@ -45,8 +42,7 @@
"World": [256, 512]
},
"Ticket": true,
"TAD Name": "WiFi-Firmware-NUS",
"Danger": "The WiFi Firmware is the firmware that runs on the DSi's WiFi chip, and should not be modified. WiFi will not work properly if this title is missing or damaged."
"Danger": "The WiFi Firmware is the firmware that runs on the DSi's WiFi chip, and should not be modified. Your console WILL be bricked if this title is damaged or missing."
}
],
"System Apps": [
@ -56,8 +52,7 @@
"Versions": {
"World": [256]
},
"Ticket": true,
"TAD Name": "DS-Download-Play-NUS"
"Ticket": true
},
{
"Name": "Flipnote Studio",
@ -67,8 +62,7 @@
"Europe/PAL": [0],
"Japan": [512]
},
"Ticket": true,
"TAD Name": "Flipnote-Studio-NUS"
"Ticket": true
},
{
"Name": "Nintendo 3DS Transfer Tool",
@ -80,8 +74,7 @@
"Korea": [256],
"Australia/NZ": [512, 768]
},
"Ticket": false,
"TAD Name": "Nintendo-3DS-Transfer-Tool-NUS"
"Ticket": false
},
{
"Name": "Nintendo DSi Browser",
@ -91,8 +84,7 @@
"Europe/PAL": [768],
"Japan": [768]
},
"Ticket": true,
"TAD Name": "Nintendo-DSi-Browser-NUS"
"Ticket": true
},
{
"Name": "Nintendo DSi Camera",
@ -103,8 +95,7 @@
"Japan": [256, 768, 1024],
"Australia/NZ": [768, 1024]
},
"Ticket": true,
"TAD Name": "Nintendo-DSi-Camera-NUS"
"Ticket": true
},
{
"Name": "Nintendo DSi Shop",
@ -117,8 +108,7 @@
"China": [768],
"Australia/NZ": [1536, 1792, 2048, 2304, 2560, 2816, 3072]
},
"Ticket": true,
"TAD Name": "Nintendo-DSi-Shop-NUS"
"Ticket": true
},
{
"Name": "Nintendo DSi Sound",
@ -129,8 +119,7 @@
"Japan": [256, 512],
"Australia/NZ": [256, 512]
},
"Ticket": true,
"TAD Name": "Nintendo-DSi-Sound-NUS"
"Ticket": true
},
{
"Name": "Nintendo Zone",
@ -141,8 +130,7 @@
"Japan": [512, 768],
"Australia/NZ": [512, 768]
},
"Ticket": true,
"TAD Name": "Nintendo-DSi-Sound-NUS"
"Ticket": true
},
{
"Name": "System Settings",
@ -155,8 +143,7 @@
"China": [768],
"Australia/NZ": [512, 768]
},
"Ticket": true,
"TAD Name": "System-Settings-NUS"
"Ticket": true
}
],
"DSiWare": [

View File

@ -7,8 +7,7 @@
"World": [6, 7]
},
"Ticket": true,
"WAD Name": "BC-NAND-NUS",
"Danger": "BC-NAND is required for the Wii U to be able to boot any vWii titles. DO NOT modify it, or your Wii U will no longer be able to load into the vWii without restoring it from Wii U mode."
"Danger": "BC-NAND is required for the Wii U to boot Wii titles. DO NOT modify it, or your Wii U will no longer be able to enter Wii mode."
},
{
"Name": "BC-WFS",
@ -17,8 +16,7 @@
"World": [1]
},
"Ticket": true,
"WAD Name": "BC-WFS-NUS",
"Danger": "BC-WFS is required for the Wii U to be able to boot Dragon Quest X Online. While not generally essential, this is a system title and should not be modified."
"Danger": "BC-WFS is required for the Wii U to be able to boot Dragon Quest X Online. Do NOT modify it, or your Wii U may experience issues with Wii mode."
},
{
"Name": "System Menu",
@ -29,8 +27,18 @@
"Japan": [512, 544, 608]
},
"Ticket": true,
"WAD Name": "vWii-System-Menu",
"Danger": "The System Menu is a critical part of the vWii's operation, and should not be modified. If it is deleted, it will need to be restored from Wii U mode to be able to access the vWii again."
"Danger": "The System Menu is a critical part of the vWii's operation, and should not be modified. If you intend to modify it, you should have Preloader installed, or else you may not be able to use the vWii.",
"Public Versions": {
"512": "4.3J - Wii U v1.0.0J",
"513": "4.3U - Wii U v1.0.0U",
"514": "4.3E - Wii U v1.0.0E",
"544": "4.3J - Wii U v4.0.0J",
"545": "4.3U - Wii U v4.0.0U",
"546": "4.3E - Wii U v4.0.0E",
"608": "4.3J - Wii U v5.2.0J",
"609": "4.3U - Wii U v5.2.0U",
"610": "4.3E - Wii U v5.2.0E"
}
}
],
"System Channels": [
@ -40,20 +48,7 @@
"Versions": {
"World": [6]
},
"Ticket": true,
"WAD Name": "Mii-Channel-NUS"
},
{
"Name": "Region Select",
"TID": "0007000848414CXX",
"Versions": {
"USA/NTSC": [2],
"Europe/PAL": [2],
"Japan": [2]
},
"Ticket": true,
"WAD Name": "Region-Select-NUS",
"Danger": "\"Region Select\" is a hidden channel used during the Wii's initial setup. If this title is damaged or missing, you will not be able to set up your Wii again after a factory reset. This title will need to be reinstalled to fix your console."
"Ticket": true
},
{
"Name": "Shopping Channel",
@ -61,8 +56,7 @@
"Versions": {
"World": [21]
},
"Ticket": true,
"WAD Name": "Shopping-Channel-NUS"
"Ticket": true
},
{
"Name": "Return to Wii U Menu",
@ -71,7 +65,6 @@
"World": [0]
},
"Ticket": true,
"WAD Name": "Return-to-Wii-U-Menu-NUS",
"Danger": "\"Return to Wii U Menu\" is the channel launched from the vWii menu to reboot your console back into Wii U mode. While it generally should not be modified, modifying or removing it will not prevent the vWii from working."
},
{
@ -82,8 +75,20 @@
"Europe/PAL": [0, 1, 2, 3, 4, 5],
"Japan": [0, 1, 2, 3, 5]
},
"Ticket": true
}
],
"Hidden Channels": [
{
"Name": "Region Select",
"TID": "0007000848414CXX",
"Versions": {
"USA/NTSC": [2],
"Europe/PAL": [2],
"Japan": [2]
},
"Ticket": true,
"WAD Name": "Wii-Electronic-Manual-NUS"
"Danger": "\"Region Select\" is a hidden channel used by WiiConnect24 services such as Everybody Votes Channel, for the user regions."
},
{
"Name": "Wii System Transfer (WagonCompat)",
@ -94,7 +99,6 @@
"Japan": [29, 31]
},
"Ticket": true,
"WAD Name": "Wii-System-Transfer-WC-NUS",
"Danger": "Note: It is currently unknown how this channel works, but it is involved somehow in the Wii to vWii transfer process. It is recommended to not modify it. Also note that this is separate from the normal, non-hidden channel \"Wii System Transfer Tool\" that works alongside \"Wii U Transfer Tool\" on a source Wii."
}
],
@ -107,8 +111,7 @@
"Europe/PAL": [516],
"Japan": [516]
},
"Ticket": false,
"WAD Name": "Wii-System-Transfer-Tool-WNP-NUS"
"Ticket": false
}
],
"IOS": [
@ -118,8 +121,7 @@
"Versions": {
"World": [1290]
},
"Ticket": true,
"WAD Name": "IOS9-64-vWii"
"Ticket": true
},
{
"Name": "IOS 12",
@ -127,8 +129,7 @@
"Versions": {
"World": [782]
},
"Ticket": true,
"WAD Name": "IOS12-64-vWii"
"Ticket": true
},
{
"Name": "IOS 13",
@ -136,8 +137,7 @@
"Versions": {
"World": [1288]
},
"Ticket": true,
"WAD Name": "IOS13-64-vWii"
"Ticket": true
},
{
"Name": "IOS 14",
@ -145,8 +145,7 @@
"Versions": {
"World": [1288]
},
"Ticket": true,
"WAD Name": "IOS14-64-vWii"
"Ticket": true
},
{
"Name": "IOS 15",
@ -154,8 +153,7 @@
"Versions": {
"World": [1288]
},
"Ticket": true,
"WAD Name": "IOS15-64-vWii"
"Ticket": true
},
{
"Name": "IOS 17",
@ -163,8 +161,7 @@
"Versions": {
"World": [1288]
},
"Ticket": true,
"WAD Name": "IOS17-64-vWii"
"Ticket": true
},
{
"Name": "IOS 21",
@ -172,8 +169,7 @@
"Versions": {
"World": [1295]
},
"Ticket": true,
"WAD Name": "IOS21-64-vWii"
"Ticket": true
},
{
"Name": "IOS 22",
@ -181,8 +177,7 @@
"Versions": {
"World": [1550]
},
"Ticket": true,
"WAD Name": "IOS22-64-vWii"
"Ticket": true
},
{
"Name": "IOS 28",
@ -190,8 +185,7 @@
"Versions": {
"World": [2063]
},
"Ticket": true,
"WAD Name": "IOS28-64-vWii"
"Ticket": true
},
{
"Name": "IOS 31",
@ -199,8 +193,7 @@
"Versions": {
"World": [3864]
},
"Ticket": true,
"WAD Name": "IOS31-64-vWii"
"Ticket": true
},
{
"Name": "IOS 33",
@ -208,8 +201,7 @@
"Versions": {
"World": [3864]
},
"Ticket": true,
"WAD Name": "IOS33-64-vWii"
"Ticket": true
},
{
"Name": "IOS 34",
@ -217,8 +209,7 @@
"Versions": {
"World": [3864]
},
"Ticket": true,
"WAD Name": "IOS34-64-vWii"
"Ticket": true
},
{
"Name": "IOS 35",
@ -226,8 +217,7 @@
"Versions": {
"World": [3864]
},
"Ticket": true,
"WAD Name": "IOS35-64-vWii"
"Ticket": true
},
{
"Name": "IOS 36",
@ -235,8 +225,7 @@
"Versions": {
"World": [3864]
},
"Ticket": true,
"WAD Name": "IOS36-64-vWii"
"Ticket": true
},
{
"Name": "IOS 37",
@ -244,8 +233,7 @@
"Versions": {
"World": [5919]
},
"Ticket": true,
"WAD Name": "IOS37-64-vWii"
"Ticket": true
},
{
"Name": "IOS 38",
@ -253,8 +241,7 @@
"Versions": {
"World": [4380]
},
"Ticket": true,
"WAD Name": "IOS38-64-vWii"
"Ticket": true
},
{
"Name": "IOS 41",
@ -262,8 +249,7 @@
"Versions": {
"World": [3863]
},
"Ticket": true,
"WAD Name": "IOS41-64-vWii"
"Ticket": true
},
{
"Name": "IOS 43",
@ -271,8 +257,7 @@
"Versions": {
"World": [3863]
},
"Ticket": true,
"WAD Name": "IOS43-64-vWii"
"Ticket": true
},
{
"Name": "IOS 45",
@ -280,8 +265,7 @@
"Versions": {
"World": [3863]
},
"Ticket": true,
"WAD Name": "IOS45-64-vWii"
"Ticket": true
},
{
"Name": "IOS 46",
@ -289,8 +273,7 @@
"Versions": {
"World": [3863]
},
"Ticket": true,
"WAD Name": "IOS46-64-vWii"
"Ticket": true
},
{
"Name": "IOS 48",
@ -298,8 +281,7 @@
"Versions": {
"World": [4380]
},
"Ticket": true,
"WAD Name": "IOS48-64-vWii"
"Ticket": true
},
{
"Name": "IOS 53",
@ -307,8 +289,7 @@
"Versions": {
"World": [5919]
},
"Ticket": true,
"WAD Name": "IOS53-64-vWii"
"Ticket": true
},
{
"Name": "IOS 55",
@ -316,8 +297,7 @@
"Versions": {
"World": [5919]
},
"Ticket": true,
"WAD Name": "IOS55-64-vWii"
"Ticket": true
},
{
"Name": "IOS 56",
@ -325,8 +305,7 @@
"Versions": {
"World": [5918]
},
"Ticket": true,
"WAD Name": "IOS56-64-vWii"
"Ticket": true
},
{
"Name": "IOS 57",
@ -334,8 +313,7 @@
"Versions": {
"World": [6175]
},
"Ticket": true,
"WAD Name": "IOS57-64-vWii"
"Ticket": true
},
{
"Name": "IOS 58",
@ -343,8 +321,7 @@
"Versions": {
"World": [6432]
},
"Ticket": true,
"WAD Name": "IOS58-64-vWii"
"Ticket": true
},
{
"Name": "IOS 59",
@ -352,8 +329,7 @@
"Versions": {
"World": [7201, 8737, 9249]
},
"Ticket": true,
"WAD Name": "IOS59-64-vWii"
"Ticket": true
},
{
"Name": "IOS 62",
@ -361,8 +337,7 @@
"Versions": {
"World": [6430, 6686, 6942]
},
"Ticket": true,
"WAD Name": "IOS62-64-vWii"
"Ticket": true
},
{
"Name": "IOS 80",
@ -370,8 +345,7 @@
"Versions": {
"World": [7200]
},
"Ticket": true,
"WAD Name": "IOS80-64-vWii"
"Ticket": true
}
]
}
}

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"
}
]

32
modules/config.py Normal file
View File

@ -0,0 +1,32 @@
# "modules/config.py", licensed under the MIT license
# Copyright 2024-2025 NinjaCheetah & Contributors
import os
import json
import pathlib
import platform
def get_config_file() -> pathlib.Path:
if platform.system() == "Windows":
config_dir = pathlib.Path(os.environ.get('APPDATA'), "NUSGet")
elif platform.system() == "Darwin":
config_dir = pathlib.Path(os.environ['HOME'], "Library", "Application Support", "NUSGet")
else:
if os.environ.get('XDG_CONFIG_HOME'):
config_dir = pathlib.Path(os.environ.get('XDG_CONFIG_HOME'), "NUSGet")
else:
config_dir = pathlib.Path(os.environ['HOME'], ".config", "NUSGet")
config_dir.mkdir(exist_ok=True, parents=True)
return config_dir.joinpath("config.json")
def save_config(config_data: dict) -> None:
config_file = get_config_file()
print(f"writing data: {config_data}")
open(config_file, "w").write(json.dumps(config_data, indent=4))
def update_setting(config_data: dict, setting: str, value: any) -> None:
config_data[setting] = value
save_config(config_data)

87
modules/core.py Normal file
View File

@ -0,0 +1,87 @@
# "modules/core.py", licensed under the MIT license
# Copyright 2024-2025 NinjaCheetah & Contributors
import requests
from dataclasses import dataclass
from typing import List
from PySide6.QtCore import Qt, QSize
from PySide6.QtWidgets import QStyledItemDelegate
# This is required to make the dropdown look correct with the custom styling. A little fuzzy on the why, but it has to
# do with how Qt handles rendering the dropdown items. The sizing has to be overridden so that they don't overlap.
class ComboBoxItemDelegate(QStyledItemDelegate):
def sizeHint(self, option, index):
return QSize(option.rect.width(), 33)
@dataclass
class TitleData:
# Class to store all data for a Title.
tid: str
name: str
version: str
ticket: bool
region: str
category: str
danger: str
@dataclass
class BatchTitleData:
# Class to store all data for a Title in a batch operation.
tid: str
version: int
console: str
archive_name: str
@dataclass
class BatchResults:
# Class to store the results of a batch download.
code: int
warning_titles: List[str]
failed_titles: List[str]
def connect_label_to_checkbox(label, checkbox):
def toggle_checkbox(event):
if checkbox.isEnabled() and event.button() == Qt.LeftButton:
checkbox.toggle()
label.mousePressEvent = toggle_checkbox
def connect_is_enabled_to_checkbox(items, chkbox):
for item in items:
if chkbox.isChecked():
item.setEnabled(True)
else:
item.setEnabled(False)
def fixup_qmenu_background(menu):
# These fixes are required to not have a square background poking out from behind the rounded corners of a QMenu.
menu.setWindowFlags(menu.windowFlags() | Qt.FramelessWindowHint)
menu.setWindowFlags(menu.windowFlags() | Qt.NoDropShadowWindowHint)
menu.setAttribute(Qt.WA_TranslucentBackground)
def check_nusget_updates(app, current_version: str, progress_callback=None) -> str | None:
# Simple function to make a request to the GitHub API and then check if the latest available version is newer.
gh_api_request = requests.get(url="https://api.github.com/repos/NinjaCheetah/NUSGet/releases/latest", stream=True)
if gh_api_request.status_code != 200:
progress_callback.emit(app.translate("MainWindow", "\n\nCould not check for updates."))
else:
api_response = gh_api_request.json()
new_version: str = api_response["tag_name"].replace('v', '')
new_version_split = new_version.split('.')
current_version_split = current_version.split('.')
for place in range(len(new_version_split)):
if new_version_split[place] < current_version_split[place]:
return None
elif new_version_split[place] > current_version_split[place]:
progress_callback.emit(app.translate("MainWindow", "\n\nThere's a newer version of NUSGet available!"))
return new_version
progress_callback.emit(app.translate("MainWindow", "\n\nYou're running the latest release of NUSGet."))
return None

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(0, 1, f"Batch download finished.")
return BatchResults(result, warning_titles, failed_titles)

119
modules/download_dsi.py Normal file
View File

@ -0,0 +1,119 @@
# "modules/download_dsi.py", licensed under the MIT license
# Copyright 2024-2025 NinjaCheetah
import pathlib
import libTWLPy
def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_tad_chkbox: bool, keep_enc_chkbox: bool,
decrypt_contents_chkbox: bool, use_local_chkbox: bool, tad_file_name: str,
progress_callback=None):
# Actual NUS download function that runs in a separate thread, but DSi flavored.
# Immediately knock out any invalidly formatted Title IDs.
if len(tid) != 16:
return -1
# An error here is acceptable, because it may just mean the box is empty. Or the version string is nonsense.
# Either way, just fall back on downloading the latest version of the title.
try:
title_version = int(version)
except ValueError:
title_version = None
# Set variables for these two options so that their state can be compared against the user's choices later.
pack_tad_enabled = pack_tad_chkbox
decrypt_contents_enabled = decrypt_contents_chkbox
# Create a new libTWLPy Title.
title = libTWLPy.Title()
# Make a directory for this title if it doesn't exist.
title_dir = out_folder.joinpath(tid)
title_dir.mkdir(exist_ok=True)
# Announce the title being downloaded, and the version if applicable.
if title_version is not None:
progress_callback.emit(0, 0, f"Downloading title {tid} v{title_version}, please wait...")
else:
progress_callback.emit(0, 0, f"Downloading title {tid} vLatest, please wait...")
progress_callback.emit(-1, -1, " - Downloading and parsing TMD...")
# Download a specific TMD version if a version was specified, otherwise just download the latest TMD.
try:
if title_version is not None:
title.load_tmd(libTWLPy.download_tmd(tid, title_version))
else:
title.load_tmd(libTWLPy.download_tmd(tid))
title_version = title.tmd.title_version
# If libTWLPy returns an error, that means that either the TID or version doesn't exist, so return code -2.
except ValueError:
return -2
# Make a directory for this version if it doesn't exist.
version_dir = title_dir.joinpath(str(title_version))
version_dir.mkdir(exist_ok=True)
# Write out the TMD to a file.
version_dir.joinpath(f"tmd.{title_version}").write_bytes(title.tmd.dump())
# Use a local ticket, if one exists and "use local files" is enabled.
if use_local_chkbox and version_dir.joinpath("tik").exists():
progress_callback.emit(-1, -1, " - Parsing local copy of Ticket...")
title.load_ticket(version_dir.joinpath("tik").read_bytes())
else:
progress_callback.emit(-1, -1, " - Downloading and parsing Ticket...")
try:
title.load_ticket(libTWLPy.download_ticket(tid))
version_dir.joinpath("tik").write_bytes(title.ticket.dump())
except ValueError:
# If libTWLPy returns an error, then no ticket is available. Log this, and disable options requiring a
# ticket so that they aren't attempted later.
progress_callback.emit(-1, -1, " - No Ticket is available!")
pack_tad_enabled = False
decrypt_contents_enabled = False
# Load the content record from the TMD, and download the content it lists. DSi titles only have one content.
title.load_content_records()
content_file_name = f"{title.tmd.content_record.content_id:08X}"
# Check for a local copy of the current content if "use local files" is enabled, and use it.
if use_local_chkbox and version_dir.joinpath(content_file_name).exists():
progress_callback.emit(-1, -1, " - Using local copy of content")
content = version_dir.joinpath(content_file_name).read_bytes()
else:
progress_callback.emit(-1, -1, f" - Downloading content (Content ID: {title.tmd.content_record.content_id}, Size: "
f"{title.tmd.content_record.content_size} bytes)...")
content = libTWLPy.download_content(tid, title.tmd.content_record.content_id)
progress_callback.emit(-1, -1, " - Done!")
# If keep encrypted contents is on, write out the content after its downloaded.
if keep_enc_chkbox is True:
version_dir.joinpath(content_file_name).write_bytes(content)
title.content.content = content
# If decrypt local contents is still true, decrypt the content and write out the decrypted file.
if decrypt_contents_enabled is True:
try:
progress_callback.emit(-1, -1, f" - Decrypting content (Content ID: {title.tmd.content_record.content_id})...")
dec_content = title.get_content()
content_file_name = f"{title.tmd.content_record.content_id:08X}.app"
version_dir.joinpath(content_file_name).write_bytes(dec_content)
except ValueError:
# If libWiiPy throws an error during decryption, return code -3. This should only be possible if using
# local encrypted contents that have been altered at present.
return -3
# If pack TAD is still true, pack the TMD, ticket, and content into a TAD.
if pack_tad_enabled is True:
# Get the TAD certificate chain, courtesy of libTWLPy.
progress_callback.emit(-1, -1, " - Building certificate...")
title.tad.set_cert_data(libTWLPy.download_cert())
# Use a typed TAD name if there is one, and auto generate one based on the TID and version if there isn't.
progress_callback.emit(-1, -1, "Packing TAD...")
if tad_file_name != "" and tad_file_name is not None:
# Batch downloads may insert -vLatest, so if it did we can fill in the real number now.
tad_file_name = tad_file_name.replace("-vLatest", f"-v{title_version}")
if tad_file_name[-4:].lower() != ".tad":
tad_file_name += ".tad"
else:
tad_file_name = f"{tid}-v{title_version}.tad"
# Certain special characters are prone to breaking things, so strip them from the file name before actually
# opening the file for writing. On some platforms (like macOS), invalid characters get replaced automatically,
# but on Windows the file will just fail to be written out at all.
tad_file_name = tad_file_name.translate({ord(c): None for c in '/\\:*"?<>|'})
# Have libTWLPy dump the TAD, and write that data out.
version_dir.joinpath(tad_file_name).write_bytes(title.dump_tad())
progress_callback.emit(0, 1, "Download complete!")
# This is where the variables come in. If the state of these variables doesn't match the user's choice by this
# point, it means that they enabled decryption or TAD packing for a title that doesn't have a ticket. Return
# code 1 so that a warning popup is shown informing them of this.
if (not pack_tad_enabled and pack_tad_chkbox) or (not decrypt_contents_enabled and decrypt_contents_chkbox):
return 1
return 0

151
modules/download_wii.py Normal file
View File

@ -0,0 +1,151 @@
# "modules/download_wii.py", licensed under the MIT license
# Copyright 2024-2025 NinjaCheetah & Contributors
import pathlib
import libWiiPy
def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_wad_chkbox: bool, keep_enc_chkbox: bool,
decrypt_contents_chkbox: bool, wiiu_nus_chkbox: bool, use_local_chkbox: bool,
repack_vwii_chkbox: bool, patch_ios: bool, wad_file_name: str, progress_callback=None):
def progress_update(done, total):
progress_callback.emit(done, total, None)
# Actual NUS download function that runs in a separate thread.
# Immediately knock out any invalidly formatted Title IDs.
if len(tid) != 16:
return -1
# An error here is acceptable, because it may just mean the box is empty. Or the version string is nonsense.
# Either way, just fall back on downloading the latest version of the title.
try:
title_version = int(version)
except ValueError:
title_version = None
# Set variables for these two options so that their state can be compared against the user's choices later.
pack_wad_enabled = pack_wad_chkbox
decrypt_contents_enabled = decrypt_contents_chkbox
# Check whether we're going to be using the (faster) Wii U NUS or not.
wiiu_nus_enabled = wiiu_nus_chkbox
# Create a new libWiiPy Title.
title = libWiiPy.title.Title()
# Make a directory for this title if it doesn't exist.
title_dir = out_folder.joinpath(tid)
title_dir.mkdir(exist_ok=True)
# Announce the title being downloaded, and the version if applicable.
if title_version is not None:
progress_callback.emit(0, 0, f"Downloading title {tid} v{title_version}, please wait...")
else:
progress_callback.emit(-1, -1, f"Downloading title {tid} vLatest, please wait...")
progress_callback.emit(-1, -1, " - Downloading and parsing TMD...")
# Download a specific TMD version if a version was specified, otherwise just download the latest TMD.
try:
if title_version is not None:
title.load_tmd(libWiiPy.title.download_tmd(tid, title_version, wiiu_endpoint=wiiu_nus_enabled, progress=progress_update))
else:
title.load_tmd(libWiiPy.title.download_tmd(tid, wiiu_endpoint=wiiu_nus_enabled, progress=progress_update))
title_version = title.tmd.title_version
# If libWiiPy returns an error, that means that either the TID or version doesn't exist, so return code -2.
except ValueError:
return -2
# Make a directory for this version if it doesn't exist.
version_dir = title_dir.joinpath(str(title_version))
version_dir.mkdir(exist_ok=True)
# Write out the TMD to a file.
version_dir.joinpath(f"tmd.{title_version}").write_bytes(title.tmd.dump())
# Use a local ticket, if one exists and "use local files" is enabled.
if use_local_chkbox and version_dir.joinpath("tik").exists():
progress_callback.emit(-1, -1, " - Parsing local copy of Ticket...")
title.load_ticket(version_dir.joinpath("tik").read_bytes())
else:
progress_callback.emit(-1, -1, " - Downloading and parsing Ticket...")
try:
title.load_ticket(libWiiPy.title.download_ticket(tid, wiiu_endpoint=wiiu_nus_enabled, progress=progress_update))
version_dir.joinpath("tik").write_bytes(title.ticket.dump())
except ValueError:
# If libWiiPy returns an error, then no ticket is available. Log this, and disable options requiring a
# ticket so that they aren't attempted later.
progress_callback.emit(0, 0, " - No Ticket is available!")
pack_wad_enabled = False
decrypt_contents_enabled = False
# Load the content records from the TMD, and begin iterating over the records.
title.load_content_records()
content_list = []
for content in range(len(title.tmd.content_records)):
# Generate the correct file name by converting the content ID into hex.
content_file_name = f"{title.tmd.content_records[content].content_id:08X}"
# Check for a local copy of the current content if "use local files" is enabled, and use it.
if use_local_chkbox is True and version_dir.joinpath(content_file_name).exists():
progress_callback.emit(-1, -1, f" - Using local copy of content {content + 1} of {len(title.tmd.content_records)}")
content_list.append(version_dir.joinpath(content_file_name).read_bytes())
else:
progress_callback.emit(0, 0, f" - Downloading content {content + 1} of {len(title.tmd.content_records)} "
f"(Content ID: {title.tmd.content_records[content].content_id}, Size: "
f"{title.tmd.content_records[content].content_size} bytes)...")
content_list.append(libWiiPy.title.download_content(tid, title.tmd.content_records[content].content_id,
wiiu_endpoint=wiiu_nus_enabled, progress=progress_update))
progress_callback.emit(-1, -1, " - Done!")
# If keep encrypted contents is on, write out each content after its downloaded.
if keep_enc_chkbox is True:
version_dir.joinpath(content_file_name).write_bytes(content_list[content])
title.content.content_list = content_list
# If decrypt local contents is still true, decrypt each content and write out the decrypted file.
if decrypt_contents_enabled is True:
try:
for content in range(len(title.tmd.content_records)):
progress_callback.emit(-1, -1, f" - Decrypting content {content + 1} of {len(title.tmd.content_records)} "
f"(Content ID: {title.tmd.content_records[content].content_id})...")
dec_content = title.get_content_by_index(content)
content_file_name = f"{title.tmd.content_records[content].content_id:08X}.app"
version_dir.joinpath(content_file_name).write_bytes(dec_content)
except ValueError:
# If libWiiPy throws an error during decryption, return code -3. This should only be possible if using
# local encrypted contents that have been altered at present.
return -3
# If pack WAD is still true, pack the TMD, ticket, and contents all into a WAD.
if pack_wad_enabled is True:
# If the option to pack for vWii mode instead of Wii U mode is enabled, then the Title Key needs to be
# re-encrypted with the common key instead of the vWii key, so that the title can be installed from within
# vWii mode. (vWii mode does not have access to the vWii key, only Wii U mode has that.)
if repack_vwii_chkbox is True and (tid[3] == "7" or tid[7] == "7"):
progress_callback.emit(-1, -1, " - Re-encrypting Title Key with the common key...")
title_key_common = libWiiPy.title.encrypt_title_key(title.ticket.get_title_key(), 0, title.tmd.title_id)
title.ticket.common_key_index = 0
title.ticket.title_key_enc = title_key_common
# Get the WAD certificate chain, courtesy of libWiiPy.
progress_callback.emit(-1, -1, " - Building certificate...")
title.load_cert_chain(libWiiPy.title.download_cert_chain(wiiu_endpoint=wiiu_nus_enabled))
# Use a typed WAD name if there is one, and auto generate one based on the TID and version if there isn't.
progress_callback.emit(-1, -1, " - Packing WAD...")
if wad_file_name != "" and wad_file_name is not None:
# Batch downloads may insert -vLatest, so if it did we can fill in the real number now.
wad_file_name = wad_file_name.replace("-vLatest", f"-v{title_version}")
if wad_file_name[-4:].lower() != ".wad":
wad_file_name += ".wad"
else:
wad_file_name = f"{tid}-v{title_version}.wad"
# If enabled (after we make sure it's an IOS), apply all main IOS patches.
if patch_ios and (tid[:8] == "00000001" and int(tid[-2:], 16) > 2):
progress_callback.emit(-1, -1, " - Patching IOS...")
ios_patcher = libWiiPy.title.IOSPatcher()
ios_patcher.load(title)
patch_count = ios_patcher.patch_all()
if patch_count > 0:
progress_callback.emit(-1, -1, f" - Applied {patch_count} patches!")
else:
progress_callback.emit(-1, -1, " - No patches could be applied! Is this a stub IOS?")
title = ios_patcher.dump()
# Append "-PATCHED" to the end of the WAD file name to make it clear that it was modified.
wad_file_name = wad_file_name[:-4] + "-PATCHED" + wad_file_name[-4:]
# Certain special characters are prone to breaking things, so strip them from the file name before actually
# opening the file for writing. On some platforms (like macOS), invalid characters get replaced automatically,
# but on Windows the file will just fail to be written out at all.
wad_file_name = wad_file_name.translate({ord(c): None for c in '/\\:*"?<>|'})
# Have libWiiPy dump the WAD, and write that data out.
version_dir.joinpath(wad_file_name).write_bytes(title.dump_wad())
progress_callback.emit(0, 1, "Download complete!")
# This is where the variables come in. If the state of these variables doesn't match the user's choice by this
# point, it means that they enabled decryption or WAD packing for a title that doesn't have a ticket. Return
# code 1 so that a warning popup is shown informing them of this.
if (not pack_wad_enabled and pack_wad_chkbox) or (not decrypt_contents_enabled and decrypt_contents_chkbox):
return 1
return 0

79
modules/language.py Normal file
View File

@ -0,0 +1,79 @@
# "modules/language.py", licensed under the MIT license
# Copyright 2024-2025 NinjaCheetah & Contributors
from modules.config import update_setting
from PySide6.QtCore import QLocale, QTranslator
LANGS = {
"en": "English",
"es": "Español",
"de": "Deutsch",
"fr": "Français",
"it": "Italiano",
"no": "Norsk",
"ro": "Românǎ",
"ko": "한국어",
}
def set_language(config_data: dict, lang: str) -> None:
# Match the selected language. These names will NOT be translated since they represent each language in that
# language, but the "System (Default)" option will, so that will match the default case.
match lang:
case "English":
print("setting language to English")
update_setting(config_data, "language", "en")
case "Español":
print("setting language to Spanish")
update_setting(config_data, "language", "es")
case "Deutsch":
print("setting language to German")
update_setting(config_data, "language", "de")
case "Français":
print("setting language to French")
update_setting(config_data, "language", "fr")
case "Italiano":
print("setting language to Italian")
update_setting(config_data, "language", "it")
case "Norsk":
print("setting language to Norwegian")
update_setting(config_data, "language", "no")
case "Română":
print("setting language to Romanian")
update_setting(config_data, "language", "ro")
case "한국어":
print("setting language to Korean")
update_setting(config_data, "language", "ko")
case _:
print("setting language to system (default)")
update_setting(config_data, "language", "")
def get_language(translator: QTranslator, config_data: dict, path: str) -> QTranslator:
try:
lang = config_data["language"]
except KeyError:
lang = ""
# A specific language was set in the app's settings.
if lang != "":
# If the target language is English, then return an empty translator because that's the default.
if lang == "en":
return translator
if translator.load(QLocale(lang), 'nusget', '_', path):
return translator
else:
# If we get here, then the saved language is invalid, so clear it and run again to use the system language.
update_setting(config_data, "language", "")
return get_language(translator, config_data, path)
else:
# Unix-likes and Windows handle this differently, apparently. Unix-likes will try `nusget_xx_XX.qm` and then
# fall back on just `nusget_xx.qm` if the region-specific translation for the language can't be found. On
# Windows, no such fallback exists, and so this code manually implements that fallback, since for languages like
# Spanish NUSGet doesn't use region-specific translations.
locale = QLocale.system()
if not translator.load(QLocale.system(), 'nusget', '_', path):
base_locale = QLocale(locale.language())
translator.load(base_locale, 'nusget', '_', path)
return translator

100
modules/theme.py Normal file
View File

@ -0,0 +1,100 @@
# "modules/theme.py", licensed under the MIT license
# Copyright 2024-2025 NinjaCheetah & Contributors
import os
import platform
import subprocess
from modules.config import update_setting
def is_dark_theme_windows():
# This has to be here so that Python doesn't try to import it on non-Windows.
import winreg
try:
registry = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
key = winreg.OpenKey(registry, r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize")
# This value is "AppsUseLightTheme" so a "1" is light and a "0" is dark. Side note: I hate the Windows registry.
value, _ = winreg.QueryValueEx(key, "AppsUseLightTheme")
return value == 0
except Exception:
return False
def is_dark_theme_macos():
# macOS is weird. If the dark theme is on, then `defaults read -g AppleInterfaceStyle` returns "Dark". If the light
# theme is on, then trying to read this key fails and returns an error instead.
try:
result = subprocess.run(
["defaults", "read", "-g", "AppleInterfaceStyle"],
capture_output=True, text=True
)
return "Dark" in result.stdout
except Exception:
return False
def is_dark_theme_linux():
try:
import subprocess
result = subprocess.run(
["gsettings", "get", "org.gnome.desktop.interface", "gtk-theme"],
capture_output=True, text=True
)
# Looking for *not* "Light", because I want any theme that isn't light to be dark. An example of this is my own
# KDE Plasma setup on my desktop, where I use the "Breeze" GTK theme and want dark NUSGet to be used in that
# case.
return not "light" in result.stdout.lower()
except Exception:
return False
def is_dark_theme(config_data: dict):
# Theming priority order:
# 1. `THEME` environment variable
# 2. Theme saved in config.json
# 3. The system theme
# 4. Light, if all else fails (though personally I'd prefer dark)
#
# First, check for an environment variable overriding the theme, and use that if it exists.
try:
if os.environ["THEME"].lower() == "light":
return False
elif os.environ["THEME"].lower() == "dark":
return True
else:
print(f"Unknown theme specified: \"{os.environ['THEME']}\"")
except KeyError:
pass
# If the theme wasn't overridden, read the user's preference in config.json.
try:
match config_data["theme"]:
case "light":
return False
case "dark":
return True
case _:
pass
except KeyError:
pass
# If a theme wasn't set (or the theme is "system"), then check for the system theme.
system = platform.system()
if system == "Windows":
return is_dark_theme_windows()
elif system == "Darwin":
return is_dark_theme_macos()
else:
return is_dark_theme_linux()
def set_theme(config_data: dict, theme: str) -> None:
match theme:
case "light":
print("setting theme to light")
update_setting(config_data, "theme", "light")
case "dark":
print("setting theme to dark")
update_setting(config_data, "theme", "dark")
case _:
print("setting theme to system (default)")
update_setting(config_data, "theme", "")

161
modules/tree.py Normal file
View File

@ -0,0 +1,161 @@
# "modules/tree.py", licensed under the MIT license
# Copyright 2024-2025 NinjaCheetah
from modules.core import TitleData
from PySide6.QtCore import QAbstractItemModel, QModelIndex, Qt, QSortFilterProxyModel
from PySide6.QtGui import QIcon
class TreeItem:
def __init__(self, data, parent=None, metadata=None):
self.data = data
self.parent = parent
self.children = []
self.metadata = metadata
def add_child(self, item):
self.children.append(item)
def child(self, row):
return self.children[row]
def child_count(self):
return len(self.children)
def column_count(self):
return len(self.data)
def data_at(self, column):
if 0 <= column < len(self.data):
return self.data[column]
return None
def row(self):
if self.parent:
return self.parent.children.index(self)
return 0
class NUSGetTreeModel(QAbstractItemModel):
def __init__(self, data, parent=None, root_name=""):
super().__init__(parent)
self.root_item = TreeItem([root_name])
self.setup_model_data(data, self.root_item)
def setup_model_data(self, title, parent):
if isinstance(title, dict):
for key, value in title.items():
if isinstance(value, list):
key_item = TreeItem([key, ""], parent)
parent.add_child(key_item)
for entry in value:
tid = entry.get("TID")
name = entry.get("Name")
versions = entry.get("Versions", {})
if tid:
tid_item = TreeItem([f"{tid} - {name}", ""], key_item, entry.get("Ticket"))
key_item.add_child(tid_item)
for region, version_list in versions.items():
region_item = TreeItem([region, ""], tid_item)
tid_item.add_child(region_item)
for version in version_list:
danger = entry.get("Danger") if entry.get("Danger") is not None else ""
metadata = TitleData(entry.get("TID"), entry.get("Name"), version,
entry.get("Ticket"), region, key, danger)
public_versions = entry.get("Public Versions")
if public_versions is not None:
try:
public_ver = public_versions[str(version)]
version_str = f"v{version} ({public_ver})"
except KeyError:
version_str = f"v{version}"
else:
version_str = f"v{version}"
version_item = TreeItem([version_str, ""], region_item, metadata)
region_item.add_child(version_item)
def rowCount(self, parent=QModelIndex()):
if parent.isValid():
parent_item = parent.internalPointer()
else:
parent_item = self.root_item
return parent_item.child_count()
def columnCount(self, parent=QModelIndex()):
return self.root_item.column_count()
def data(self, index, role=Qt.DisplayRole):
if not index.isValid():
return None
item = index.internalPointer()
if role == Qt.DisplayRole:
item = index.internalPointer()
return item.data_at(index.column())
if role == Qt.DecorationRole and index.column() == 0:
# Check for icons based on the "Ticket" metadata only at the TID level
if item.metadata is not None and isinstance(item.metadata, bool):
if item.metadata is True:
return QIcon.fromTheme("dialog-ok")
else:
return QIcon.fromTheme("dialog-cancel")
return None
def headerData(self, section, orientation, role=Qt.DisplayRole):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self.root_item.data_at(section)
return None
def index(self, row, column, parent=QModelIndex()):
if not self.hasIndex(row, column, parent):
return QModelIndex()
if not parent.isValid():
parent_item = self.root_item
else:
parent_item = parent.internalPointer()
child_item = parent_item.child(row)
if child_item:
return self.createIndex(row, column, child_item)
return QModelIndex()
def parent(self, index):
if not index.isValid():
return QModelIndex()
child_item = index.internalPointer()
parent_item = child_item.parent
if parent_item == self.root_item:
return QModelIndex()
return self.createIndex(parent_item.row(), 0, parent_item)
class TIDFilterProxyModel(QSortFilterProxyModel):
def filterAcceptsRow(self, source_row, source_parent):
source_model = self.sourceModel()
index = source_model.index(source_row, 0, source_parent)
item = index.internalPointer()
filter_text = self.filterRegularExpression().pattern().lower()
# If the item matches what the user searched for.
if item and filter_text in item.data_at(0).lower():
return True
# Check if children match, though I don't think this matters because the children of a title will always just
# be regions.
for i in range(source_model.rowCount(index)):
if self.filterAcceptsRow(i, index):
return True
# Keep the regions and versions under those for any titles that matched, so you can actually download from the
# search results.
parent_item = index.parent().internalPointer() if index.parent().isValid() else None
if parent_item and filter_text in parent_item.data_at(0).lower():
return True
else:
grandparent_item = index.parent().parent().internalPointer() if index.parent().parent().isValid() else None
if grandparent_item and filter_text in grandparent_item.data_at(0).lower():
return True
return False

9
packaging/NUSGet.desktop Normal file
View File

@ -0,0 +1,9 @@
[Desktop Entry]
Name=NUSGet
Exec=/opt/NUSGet/NUSGet.bin %U
Terminal=false
Type=Application
Icon=/opt/NUSGet/NUSGet.png
StartupWMClass=NUSGet
Comment=A modern and supercharged NUS downloader built with Python and Qt6.
Categories=Utility;

BIN
packaging/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

113
qt/py/ui_AboutDialog.py Normal file
View File

@ -0,0 +1,113 @@
# "qt/py/ui_AboutDialog.py", licensed under the MIT license
# Copyright 2024-2025 NinjaCheetah and Contributors
# Thanks Isla and Alex for making such a nice about dialog that I could then "borrow" :p
import os
import pathlib
import webbrowser
from PySide6.QtCore import Qt, QCoreApplication
from PySide6.QtWidgets import QDialog, QLabel, QVBoxLayout, QPushButton
from PySide6.QtGui import QIcon
class AboutNUSGet(QDialog):
def __init__(self, versions):
super().__init__()
self.setWindowTitle(self.tr("About NUSGet"))
self.setFixedWidth(450)
self.setFixedHeight(500)
# Create main layout
self.layout = QVBoxLayout()
self.layout.setSpacing(4)
self.layout.setContentsMargins(30, 20, 30, 20)
# Logo
logo_label = QLabel()
icon = QIcon(str(pathlib.Path(os.path.dirname(__file__)).parents[1].joinpath("resources", "icon.png")))
logo_pixmap = icon.pixmap(96, 96)
logo_label.setPixmap(logo_pixmap)
logo_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
# Title
title_label = QLabel(self.tr("NUSGet"))
title_label.setProperty("class", "title")
title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
# NUSGet Version
version_label = QLabel(self.tr("Version {nusget_version}").format(nusget_version=versions[0]))
version_label.setProperty("class", "version")
version_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
# Library Versions
libraries_label = QLabel(self.tr("Using libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}")
.format(libwiipy_version=versions[1], libtwlpy_version=versions[2]))
libraries_label.setProperty("class", "version")
libraries_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
# Copyright
copyright_label = QLabel(self.tr("© 2024-2025 NinjaCheetah & Contributors"))
copyright_label.setProperty("class", "copyright")
copyright_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
# Add header section
self.layout.addWidget(logo_label)
self.layout.addWidget(title_label)
self.layout.addWidget(version_label)
self.layout.addWidget(libraries_label)
self.layout.addWidget(copyright_label)
self.layout.addSpacing(15)
# External links layout
links_layout = QVBoxLayout()
# GitHub button
self.github_button = QPushButton(self.tr("View Project on GitHub"))
self.github_button.clicked.connect(lambda: webbrowser.open("https://github.com/NinjaCheetah/NUSGet"))
links_layout.addWidget(self.github_button)
# Add the links layout to main layout
self.layout.addLayout(links_layout)
self.layout.addSpacing(15)
# Add a horizontal line
line = QLabel()
line.setStyleSheet("background-color: #444444; height: 1px;")
line.setFixedHeight(1)
self.layout.addWidget(line)
self.layout.addSpacing(10)
# Team members header
team_header = QLabel(self.tr("Translations"))
team_header.setProperty("class", "header")
self.layout.addWidget(team_header)
self.layout.addSpacing(5)
# Team members with roles
self.people = {
"rougets": QLabel(self.tr(
"French (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a>")),
"yeah-its-gloria": QLabel(self.tr(
"German (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a>")),
"LNLenost": QLabel(self.tr(
"Italian (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a>")),
"DDinghoya": QLabel(self.tr(
"Korean (\ud55c\uad6d\uc5b4): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a>")),
"rolfiee": QLabel(self.tr(
"Norwegian (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a>")),
"NotImplementedLife": QLabel(self.tr(
"Romanian (Rom\u00e2n\u0103): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a>")),
"DarkMatterCore": QLabel(self.tr(
"Spanish (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a>"))
}
# Add team members to layout
for credit in self.people.values():
credit.setOpenExternalLinks(True)
credit.setContentsMargins(15, 0, 0, 0)
self.layout.addWidget(credit)
# Add spacer at the bottom
self.layout.addStretch()
self.setLayout(self.layout)

View File

@ -3,7 +3,7 @@
################################################################################
## Form generated from reading UI file 'MainMenu.ui'
##
## Created by: Qt User Interface Compiler version 6.7.0
## Created by: Qt User Interface Compiler version 6.9.0
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
@ -11,60 +11,127 @@
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QHBoxLayout,
QHeaderView, QLabel, QLayout, QLineEdit,
QMainWindow, QMenuBar, QPushButton, QSizePolicy,
QSpacerItem, QTabWidget, QTextBrowser, QTreeWidget,
QTreeWidgetItem, QVBoxLayout, QWidget)
from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
QCursor, QFont, QFontDatabase, QGradient,
QIcon, QImage, QKeySequence, QLinearGradient,
QPainter, QPalette, QPixmap, QRadialGradient,
QTransform)
from PySide6.QtWidgets import (QApplication, QComboBox, QHBoxLayout, QHeaderView,
QLabel, QLayout, QLineEdit, QMainWindow,
QMenu, QMenuBar, QProgressBar, QPushButton,
QSizePolicy, QSpacerItem, QTabWidget, QTextBrowser,
QTreeView, QVBoxLayout, QWidget)
from qt.py.ui_WrapCheckboxWidget import WrapCheckboxWidget
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(1010, 625)
MainWindow.setMinimumSize(QSize(1010, 625))
MainWindow.setMaximumSize(QSize(1010, 625))
MainWindow.resize(1010, 675)
MainWindow.setMinimumSize(QSize(1010, 675))
MainWindow.setMaximumSize(QSize(1010, 675))
self.action_about = QAction(MainWindow)
self.action_about.setObjectName(u"action_about")
icon = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.HelpAbout))
self.action_about.setIcon(icon)
self.action_about.setMenuRole(QAction.MenuRole.ApplicationSpecificRole)
self.action_about_qt = QAction(MainWindow)
self.action_about_qt.setObjectName(u"action_about_qt")
self.action_about_qt.setIcon(icon)
self.action_about_qt.setMenuRole(QAction.MenuRole.ApplicationSpecificRole)
self.action_language_system = QAction(MainWindow)
self.action_language_system.setObjectName(u"action_language_system")
self.action_language_system.setCheckable(True)
self.action_language_system.setChecked(False)
self.action_language_english = QAction(MainWindow)
self.action_language_english.setObjectName(u"action_language_english")
self.action_language_english.setCheckable(True)
self.action_language_english.setText(u"English")
self.action_language_spanish = QAction(MainWindow)
self.action_language_spanish.setObjectName(u"action_language_spanish")
self.action_language_spanish.setCheckable(True)
self.action_language_spanish.setText(u"Espa\u00f1ol")
self.action_language_german = QAction(MainWindow)
self.action_language_german.setObjectName(u"action_language_german")
self.action_language_german.setCheckable(True)
self.action_language_german.setText(u"Deutsch")
self.action_language_french = QAction(MainWindow)
self.action_language_french.setObjectName(u"action_language_french")
self.action_language_french.setCheckable(True)
self.action_language_french.setText(u"Fran\u00e7ais")
self.action_language_italian = QAction(MainWindow)
self.action_language_italian.setObjectName(u"action_language_italian")
self.action_language_italian.setCheckable(True)
self.action_language_italian.setText(u"Italiano")
self.action_language_norwegian = QAction(MainWindow)
self.action_language_norwegian.setObjectName(u"action_language_norwegian")
self.action_language_norwegian.setCheckable(True)
self.action_language_norwegian.setText(u"Norsk")
self.action_language_romanian = QAction(MainWindow)
self.action_language_romanian.setObjectName(u"action_language_romanian")
self.action_language_romanian.setCheckable(True)
self.action_language_romanian.setText(u"Rom\u00e2n\u0103")
self.action_language_korean = QAction(MainWindow)
self.action_language_korean.setObjectName(u"action_language_korean")
self.action_language_korean.setCheckable(True)
self.action_language_korean.setText(u"\ud55c\uad6d\uc5b4")
self.action_theme_system = QAction(MainWindow)
self.action_theme_system.setObjectName(u"action_theme_system")
self.action_theme_system.setCheckable(True)
self.action_theme_light = QAction(MainWindow)
self.action_theme_light.setObjectName(u"action_theme_light")
self.action_theme_light.setCheckable(True)
self.action_theme_dark = QAction(MainWindow)
self.action_theme_dark.setObjectName(u"action_theme_dark")
self.action_theme_dark.setCheckable(True)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.horizontalLayout_3 = QHBoxLayout(self.centralwidget)
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
self.horizontalLayout_3.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint)
self.vertical_layout_trees = QVBoxLayout()
self.vertical_layout_trees.setObjectName(u"vertical_layout_trees")
self.label_2 = QLabel(self.centralwidget)
self.label_2.setObjectName(u"label_2")
font = QFont()
font.setBold(True)
self.label_2.setFont(font)
self.tree_filter_layout = QHBoxLayout()
self.tree_filter_layout.setObjectName(u"tree_filter_layout")
self.tree_filter_input = QLineEdit(self.centralwidget)
self.tree_filter_input.setObjectName(u"tree_filter_input")
sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.tree_filter_input.sizePolicy().hasHeightForWidth())
self.tree_filter_input.setSizePolicy(sizePolicy)
self.vertical_layout_trees.addWidget(self.label_2)
self.tree_filter_layout.addWidget(self.tree_filter_input)
self.tree_filter_reset_btn = QPushButton(self.centralwidget)
self.tree_filter_reset_btn.setObjectName(u"tree_filter_reset_btn")
sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed)
sizePolicy1.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0)
sizePolicy1.setHeightForWidth(self.tree_filter_reset_btn.sizePolicy().hasHeightForWidth())
self.tree_filter_reset_btn.setSizePolicy(sizePolicy1)
self.tree_filter_layout.addWidget(self.tree_filter_reset_btn)
self.vertical_layout_trees.addLayout(self.tree_filter_layout)
self.platform_tabs = QTabWidget(self.centralwidget)
self.platform_tabs.setObjectName(u"platform_tabs")
sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.platform_tabs.sizePolicy().hasHeightForWidth())
self.platform_tabs.setSizePolicy(sizePolicy)
sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Expanding)
sizePolicy2.setHorizontalStretch(0)
sizePolicy2.setVerticalStretch(0)
sizePolicy2.setHeightForWidth(self.platform_tabs.sizePolicy().hasHeightForWidth())
self.platform_tabs.setSizePolicy(sizePolicy2)
self.platform_tabs.setMinimumSize(QSize(410, 0))
self.platform_tabs.setMaximumSize(QSize(410, 16777215))
self.wii_tab = QWidget()
self.wii_tab.setObjectName(u"wii_tab")
self.verticalLayout_2 = QVBoxLayout(self.wii_tab)
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.wii_title_tree = QTreeWidget(self.wii_tab)
__qtreewidgetitem = QTreeWidgetItem()
__qtreewidgetitem.setText(0, u"1");
self.wii_title_tree.setHeaderItem(__qtreewidgetitem)
self.wii_title_tree = QTreeView(self.wii_tab)
self.wii_title_tree.setObjectName(u"wii_title_tree")
self.wii_title_tree.setColumnCount(1)
self.wii_title_tree.header().setVisible(False)
self.wii_title_tree.header().setMinimumSectionSize(49)
self.wii_title_tree.header().setDefaultSectionSize(100)
self.wii_title_tree.header().setStretchLastSection(False)
self.verticalLayout_2.addWidget(self.wii_title_tree)
@ -73,16 +140,8 @@ class Ui_MainWindow(object):
self.vwii_tab.setObjectName(u"vwii_tab")
self.verticalLayout_4 = QVBoxLayout(self.vwii_tab)
self.verticalLayout_4.setObjectName(u"verticalLayout_4")
self.vwii_title_tree = QTreeWidget(self.vwii_tab)
__qtreewidgetitem1 = QTreeWidgetItem()
__qtreewidgetitem1.setText(0, u"1");
self.vwii_title_tree.setHeaderItem(__qtreewidgetitem1)
self.vwii_title_tree = QTreeView(self.vwii_tab)
self.vwii_title_tree.setObjectName(u"vwii_title_tree")
self.vwii_title_tree.setColumnCount(1)
self.vwii_title_tree.header().setVisible(False)
self.vwii_title_tree.header().setMinimumSectionSize(49)
self.vwii_title_tree.header().setDefaultSectionSize(100)
self.vwii_title_tree.header().setStretchLastSection(False)
self.verticalLayout_4.addWidget(self.vwii_title_tree)
@ -91,14 +150,8 @@ class Ui_MainWindow(object):
self.dsi_tab.setObjectName(u"dsi_tab")
self.verticalLayout = QVBoxLayout(self.dsi_tab)
self.verticalLayout.setObjectName(u"verticalLayout")
self.dsi_title_tree = QTreeWidget(self.dsi_tab)
__qtreewidgetitem2 = QTreeWidgetItem()
__qtreewidgetitem2.setText(0, u"1");
self.dsi_title_tree.setHeaderItem(__qtreewidgetitem2)
self.dsi_title_tree = QTreeView(self.dsi_tab)
self.dsi_title_tree.setObjectName(u"dsi_title_tree")
self.dsi_title_tree.setHeaderHidden(True)
self.dsi_title_tree.header().setMinimumSectionSize(49)
self.dsi_title_tree.header().setStretchLastSection(False)
self.verticalLayout.addWidget(self.dsi_title_tree)
@ -111,7 +164,7 @@ class Ui_MainWindow(object):
self.vertical_layout_controls = QVBoxLayout()
self.vertical_layout_controls.setObjectName(u"vertical_layout_controls")
self.vertical_layout_controls.setSizeConstraint(QLayout.SetDefaultConstraint)
self.vertical_layout_controls.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint)
self.horizontal_layout_title_entry = QHBoxLayout()
self.horizontal_layout_title_entry.setObjectName(u"horizontal_layout_title_entry")
self.tid_entry = QLineEdit(self.centralwidget)
@ -145,80 +198,153 @@ class Ui_MainWindow(object):
self.vertical_layout_controls.addLayout(self.horizontal_layout_title_entry)
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.download_btn = QPushButton(self.centralwidget)
self.download_btn.setObjectName(u"download_btn")
sizePolicy3 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Fixed)
sizePolicy3.setHorizontalStretch(0)
sizePolicy3.setVerticalStretch(0)
sizePolicy3.setHeightForWidth(self.download_btn.sizePolicy().hasHeightForWidth())
self.download_btn.setSizePolicy(sizePolicy3)
self.vertical_layout_controls.addWidget(self.download_btn)
self.horizontalLayout.addWidget(self.download_btn)
self.script_btn = QPushButton(self.centralwidget)
self.script_btn.setObjectName(u"script_btn")
sizePolicy.setHeightForWidth(self.script_btn.sizePolicy().hasHeightForWidth())
self.script_btn.setSizePolicy(sizePolicy)
self.horizontalLayout.addWidget(self.script_btn)
self.vertical_layout_controls.addLayout(self.horizontalLayout)
self.horizontalLayout_5 = QHBoxLayout()
self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
self.horizontalLayout_5.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize)
self.verticalLayout_7 = QVBoxLayout()
self.verticalLayout_7.setSpacing(4)
self.verticalLayout_7.setObjectName(u"verticalLayout_7")
self.verticalLayout_7.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize)
self.label_3 = QLabel(self.centralwidget)
self.label_3.setObjectName(u"label_3")
font = QFont()
font.setBold(True)
self.label_3.setFont(font)
self.verticalLayout_7.addWidget(self.label_3)
self.pack_archive_chkbox = QCheckBox(self.centralwidget)
self.pack_archive_chkbox.setObjectName(u"pack_archive_chkbox")
self.pack_archive_checkbox = WrapCheckboxWidget(self.centralwidget)
self.pack_archive_checkbox.setObjectName(u"pack_archive_checkbox")
self.verticalLayout_7.addWidget(self.pack_archive_chkbox)
self.verticalLayout_7.addWidget(self.pack_archive_checkbox)
self.archive_file_entry = QLineEdit(self.centralwidget)
self.archive_file_entry.setObjectName(u"archive_file_entry")
self.archive_file_entry.setEnabled(False)
self.archive_file_entry.setEnabled(True)
self.verticalLayout_7.addWidget(self.archive_file_entry)
self.keep_enc_chkbox = QCheckBox(self.centralwidget)
self.keep_enc_chkbox.setObjectName(u"keep_enc_chkbox")
self.keep_enc_chkbox.setChecked(True)
self.keep_enc_checkbox = WrapCheckboxWidget(self.centralwidget)
self.keep_enc_checkbox.setObjectName(u"keep_enc_checkbox")
self.verticalLayout_7.addWidget(self.keep_enc_chkbox)
self.verticalLayout_7.addWidget(self.keep_enc_checkbox)
self.create_dec_chkbox = QCheckBox(self.centralwidget)
self.create_dec_chkbox.setObjectName(u"create_dec_chkbox")
self.create_dec_checkbox = WrapCheckboxWidget(self.centralwidget)
self.create_dec_checkbox.setObjectName(u"create_dec_checkbox")
self.verticalLayout_7.addWidget(self.create_dec_chkbox)
self.verticalLayout_7.addWidget(self.create_dec_checkbox)
self.use_local_chkbox = QCheckBox(self.centralwidget)
self.use_local_chkbox.setObjectName(u"use_local_chkbox")
self.use_local_chkbox.setEnabled(True)
self.use_local_checkbox = WrapCheckboxWidget(self.centralwidget)
self.use_local_checkbox.setObjectName(u"use_local_checkbox")
self.verticalLayout_7.addWidget(self.use_local_chkbox)
self.verticalLayout_7.addWidget(self.use_local_checkbox)
self.use_wiiu_nus_chkbox = QCheckBox(self.centralwidget)
self.use_wiiu_nus_chkbox.setObjectName(u"use_wiiu_nus_chkbox")
self.use_wiiu_nus_chkbox.setChecked(True)
self.use_wiiu_nus_checkbox = WrapCheckboxWidget(self.centralwidget)
self.use_wiiu_nus_checkbox.setObjectName(u"use_wiiu_nus_checkbox")
self.verticalLayout_7.addWidget(self.use_wiiu_nus_chkbox)
self.verticalLayout_7.addWidget(self.use_wiiu_nus_checkbox)
self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
self.patch_ios_checkbox = WrapCheckboxWidget(self.centralwidget)
self.patch_ios_checkbox.setObjectName(u"patch_ios_checkbox")
self.patch_ios_checkbox.setEnabled(False)
self.verticalLayout_7.addWidget(self.patch_ios_checkbox)
self.verticalSpacer_2 = QSpacerItem(20, 200, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred)
self.verticalLayout_7.addItem(self.verticalSpacer_2)
self.horizontalSpacer = QSpacerItem(300, 0, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)
self.verticalLayout_7.addItem(self.horizontalSpacer)
self.horizontalLayout_5.addLayout(self.verticalLayout_7)
self.verticalLayout_8 = QVBoxLayout()
self.verticalLayout_8.setSpacing(4)
self.verticalLayout_8.setObjectName(u"verticalLayout_8")
self.verticalLayout_8.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize)
self.label_4 = QLabel(self.centralwidget)
self.label_4.setObjectName(u"label_4")
self.label_4.setFont(font)
self.verticalLayout_8.addWidget(self.label_4)
self.pack_vwii_mode_chkbox = QCheckBox(self.centralwidget)
self.pack_vwii_mode_chkbox.setObjectName(u"pack_vwii_mode_chkbox")
self.pack_vwii_mode_chkbox.setEnabled(False)
self.pack_vwii_mode_checkbox = WrapCheckboxWidget(self.centralwidget)
self.pack_vwii_mode_checkbox.setObjectName(u"pack_vwii_mode_checkbox")
self.pack_vwii_mode_checkbox.setEnabled(False)
self.verticalLayout_8.addWidget(self.pack_vwii_mode_chkbox)
self.verticalLayout_8.addWidget(self.pack_vwii_mode_checkbox)
self.verticalSpacer = QSpacerItem(20, 50, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
self.label_2 = QLabel(self.centralwidget)
self.label_2.setObjectName(u"label_2")
self.label_2.setFont(font)
self.verticalLayout_8.addWidget(self.label_2)
self.auto_update_checkbox = WrapCheckboxWidget(self.centralwidget)
self.auto_update_checkbox.setObjectName(u"auto_update_checkbox")
sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred)
sizePolicy4.setHorizontalStretch(0)
sizePolicy4.setVerticalStretch(0)
sizePolicy4.setHeightForWidth(self.auto_update_checkbox.sizePolicy().hasHeightForWidth())
self.auto_update_checkbox.setSizePolicy(sizePolicy4)
self.verticalLayout_8.addWidget(self.auto_update_checkbox)
self.custom_out_dir_checkbox = WrapCheckboxWidget(self.centralwidget)
self.custom_out_dir_checkbox.setObjectName(u"custom_out_dir_checkbox")
self.verticalLayout_8.addWidget(self.custom_out_dir_checkbox)
self.custom_out_dir_entry_row = QHBoxLayout()
self.custom_out_dir_entry_row.setObjectName(u"custom_out_dir_entry_row")
self.custom_out_dir_entry = QLineEdit(self.centralwidget)
self.custom_out_dir_entry.setObjectName(u"custom_out_dir_entry")
self.custom_out_dir_entry.setEnabled(False)
self.custom_out_dir_entry_row.addWidget(self.custom_out_dir_entry)
self.custom_out_dir_btn = QPushButton(self.centralwidget)
self.custom_out_dir_btn.setObjectName(u"custom_out_dir_btn")
self.custom_out_dir_btn.setEnabled(False)
self.custom_out_dir_entry_row.addWidget(self.custom_out_dir_btn)
self.verticalLayout_8.addLayout(self.custom_out_dir_entry_row)
self.verticalSpacer = QSpacerItem(20, 200, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred)
self.verticalLayout_8.addItem(self.verticalSpacer)
self.horizontalSpacer_2 = QSpacerItem(300, 0, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)
self.verticalLayout_8.addItem(self.horizontalSpacer_2)
self.horizontalLayout_5.addLayout(self.verticalLayout_8)
@ -227,19 +353,55 @@ class Ui_MainWindow(object):
self.log_text_browser = QTextBrowser(self.centralwidget)
self.log_text_browser.setObjectName(u"log_text_browser")
self.log_text_browser.setMinimumSize(QSize(0, 312))
self.log_text_browser.setMinimumSize(QSize(0, 222))
self.vertical_layout_controls.addWidget(self.log_text_browser)
self.progress_bar = QProgressBar(self.centralwidget)
self.progress_bar.setObjectName(u"progress_bar")
self.progress_bar.setMinimumSize(QSize(0, 25))
self.progress_bar.setMaximumSize(QSize(16777215, 30))
self.progress_bar.setValue(0)
self.vertical_layout_controls.addWidget(self.progress_bar)
self.horizontalLayout_3.addLayout(self.vertical_layout_controls)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 1010, 29))
self.menubar.setGeometry(QRect(0, 0, 1010, 21))
self.menu_help = QMenu(self.menubar)
self.menu_help.setObjectName(u"menu_help")
self.menu_options = QMenu(self.menubar)
self.menu_options.setObjectName(u"menu_options")
self.menu_options_language = QMenu(self.menu_options)
self.menu_options_language.setObjectName(u"menu_options_language")
self.menu_options_theme = QMenu(self.menu_options)
self.menu_options_theme.setObjectName(u"menu_options_theme")
MainWindow.setMenuBar(self.menubar)
self.menubar.addAction(self.menu_options.menuAction())
self.menubar.addAction(self.menu_help.menuAction())
self.menu_help.addAction(self.action_about)
self.menu_help.addAction(self.action_about_qt)
self.menu_help.addSeparator()
self.menu_options.addAction(self.menu_options_language.menuAction())
self.menu_options.addAction(self.menu_options_theme.menuAction())
self.menu_options_language.addAction(self.action_language_system)
self.menu_options_language.addAction(self.action_language_english)
self.menu_options_language.addAction(self.action_language_spanish)
self.menu_options_language.addAction(self.action_language_german)
self.menu_options_language.addAction(self.action_language_french)
self.menu_options_language.addAction(self.action_language_italian)
self.menu_options_language.addAction(self.action_language_norwegian)
self.menu_options_language.addAction(self.action_language_romanian)
self.menu_options_language.addAction(self.action_language_korean)
self.menu_options_theme.addAction(self.action_theme_system)
self.menu_options_theme.addAction(self.action_theme_light)
self.menu_options_theme.addAction(self.action_theme_dark)
self.retranslateUi(MainWindow)
self.platform_tabs.setCurrentIndex(0)
@ -251,7 +413,14 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.label_2.setText(QCoreApplication.translate("MainWindow", u"Available Titles", None))
self.action_about.setText(QCoreApplication.translate("MainWindow", u"About NUSGet", None))
self.action_about_qt.setText(QCoreApplication.translate("MainWindow", u"About Qt", None))
self.action_language_system.setText(QCoreApplication.translate("MainWindow", u"System (Default)", None))
self.action_theme_system.setText(QCoreApplication.translate("MainWindow", u"System (Default)", None))
self.action_theme_light.setText(QCoreApplication.translate("MainWindow", u"Light", None))
self.action_theme_dark.setText(QCoreApplication.translate("MainWindow", u"Dark", None))
self.tree_filter_input.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Search", None))
self.tree_filter_reset_btn.setText(QCoreApplication.translate("MainWindow", u"Clear", None))
self.platform_tabs.setTabText(self.platform_tabs.indexOf(self.wii_tab), QCoreApplication.translate("MainWindow", u"Wii", None))
self.platform_tabs.setTabText(self.platform_tabs.indexOf(self.vwii_tab), QCoreApplication.translate("MainWindow", u"vWii", None))
self.platform_tabs.setTabText(self.platform_tabs.indexOf(self.dsi_tab), QCoreApplication.translate("MainWindow", u"DSi", None))
@ -262,20 +431,25 @@ class Ui_MainWindow(object):
self.label_5.setText(QCoreApplication.translate("MainWindow", u"Console:", None))
self.console_select_dropdown.setCurrentText("")
self.download_btn.setText(QCoreApplication.translate("MainWindow", u"Start Download", None))
self.script_btn.setText(QCoreApplication.translate("MainWindow", u"Run Script", None))
self.label_3.setText(QCoreApplication.translate("MainWindow", u"General Settings", None))
self.pack_archive_chkbox.setText(QCoreApplication.translate("MainWindow", u"Pack installable archive (WAD/TAD)", None))
self.archive_file_entry.setPlaceholderText(QCoreApplication.translate("MainWindow", u"File Name", None))
self.keep_enc_chkbox.setText(QCoreApplication.translate("MainWindow", u"Keep encrypted contents", None))
self.create_dec_chkbox.setText(QCoreApplication.translate("MainWindow", u"Create decrypted contents (*.app)", None))
self.use_local_chkbox.setText(QCoreApplication.translate("MainWindow", u"Use local files, if they exist", None))
self.use_wiiu_nus_chkbox.setText(QCoreApplication.translate("MainWindow", u"Use the Wii U NUS (faster, only effects Wii/vWii)", None))
self.label_4.setText(QCoreApplication.translate("MainWindow", u"vWii Title Settings", None))
self.pack_vwii_mode_chkbox.setText(QCoreApplication.translate("MainWindow", u"Pack for vWii mode instead of Wii U mode", None))
self.label_2.setText(QCoreApplication.translate("MainWindow", u"App Settings", None))
self.custom_out_dir_entry.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Output Path", None))
self.custom_out_dir_btn.setText(QCoreApplication.translate("MainWindow", u"Select...", None))
self.log_text_browser.setMarkdown("")
self.log_text_browser.setHtml(QCoreApplication.translate("MainWindow", u"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p></body></html>", None))
"hr { height: 1px; border-width: 0; }\n"
"li.unchecked::marker { content: \"\\2610\"; }\n"
"li.checked::marker { content: \"\\2612\"; }\n"
"</style></head><body style=\" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;\"><br /></p></body></html>", None))
self.menu_help.setTitle(QCoreApplication.translate("MainWindow", u"Help", None))
self.menu_options.setTitle(QCoreApplication.translate("MainWindow", u"Options", None))
self.menu_options_language.setTitle(QCoreApplication.translate("MainWindow", u"Language", None))
self.menu_options_theme.setTitle(QCoreApplication.translate("MainWindow", u"Theme", None))
# retranslateUi

View File

@ -0,0 +1,47 @@
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QCheckBox, QHBoxLayout, QLabel, QWidget, QSizePolicy, QLayout
class WrapCheckboxWidget(QWidget):
def __init__(self, text, parent=None):
super().__init__(parent)
self.setAttribute(Qt.WA_StyledBackground, True)
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
self.checkbox = QCheckBox("")
size_policy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed)
size_policy.setHorizontalStretch(0)
size_policy.setVerticalStretch(0)
size_policy.setHeightForWidth(self.checkbox.sizePolicy().hasHeightForWidth())
self.checkbox.setSizePolicy(size_policy)
self.label = QLabel(text)
self.label.setAlignment(Qt.AlignVCenter | Qt.AlignLeft)
self.label.setWordWrap(True)
self.label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
self.label.setContentsMargins(0, 0, 0, 0)
layout = QHBoxLayout(self)
layout.setContentsMargins(5, 5, 5, 5)
layout.setSizeConstraint(QLayout.SetMinimumSize)
layout.addWidget(self.checkbox)
layout.addWidget(self.label)
# Connect signals so that clicking the label still changes the state of the checkbox.
def toggle_checkbox(event):
if self.checkbox.isEnabled() and event.button() == Qt.LeftButton:
self.checkbox.toggle()
self.label.mousePressEvent = toggle_checkbox
# Bind checkbox stuff for easier access.
self.toggled = self.checkbox.toggled
def isChecked(self):
return self.checkbox.isChecked()
def setChecked(self, checked):
self.checkbox.setChecked(checked)
def setEnabled(self, enabled):
super().setEnabled(enabled)
self.checkbox.setEnabled(enabled)
self.label.setEnabled(enabled)

185
qt/ui/AboutNUSGet.ui Normal file
View File

@ -0,0 +1,185 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AboutNUSGet</class>
<widget class="QDialog" name="AboutNUSGet">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="outer_layout">
<item>
<layout class="QVBoxLayout" name="icon_layout">
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QLabel" name="icon_lbl">
<property name="maximumSize">
<size>
<width>75</width>
<height>75</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="details_layout">
<item>
<widget class="QLabel" name="about_title_lbl">
<property name="font">
<font>
<pointsize>15</pointsize>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>About NUSGet</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="version_lbl">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Placeholder Version String</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="detail_text_lbl">
<property name="text">
<string>Copyright (c) 2024-2025 NinjaCheetah &amp; Contributors</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QTextBrowser" name="textBrowser">
<property name="html">
<string>&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:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:700;&quot;&gt;Translations&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;German (Deutsch): &lt;a href=&quot;https://github.com/yeah-its-gloria&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#3586ff;&quot;&gt;yeah-its-gloria&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Italian (Italiano): &lt;a href=&quot;https://github.com/LNLenost&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#3586ff;&quot;&gt;LNLenost&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Korean (한국어): &lt;a href=&quot;https://github.com/DDinghoya&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#3586ff;&quot;&gt;DDinghoya&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Norwegian (Norsk): &lt;a href=&quot;https://github.com/rolfiee&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#3586ff;&quot;&gt;rolfiee&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Romanian (Română): &lt;a href=&quot;https://github.com/NotImplementedLife&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#3586ff;&quot;&gt;NotImplementedLife&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Close</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AboutNUSGet</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AboutNUSGet</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

508
qt/ui/MainMenu.ui Normal file → Executable file
View File

@ -7,19 +7,19 @@
<x>0</x>
<y>0</y>
<width>1010</width>
<height>625</height>
<height>675</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>1010</width>
<height>625</height>
<height>675</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1010</width>
<height>625</height>
<height>675</height>
</size>
</property>
<property name="windowTitle">
@ -27,20 +27,40 @@
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
</property>
<item>
<layout class="QVBoxLayout" name="vertical_layout_trees">
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Available Titles</string>
</property>
</widget>
<layout class="QHBoxLayout" name="tree_filter_layout">
<item>
<widget class="QLineEdit" name="tree_filter_input">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="placeholderText">
<string>Search</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="tree_filter_reset_btn">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Clear</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QTabWidget" name="platform_tabs">
@ -71,28 +91,7 @@
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTreeWidget" name="wii_title_tree">
<property name="columnCount">
<number>1</number>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<attribute name="headerMinimumSectionSize">
<number>49</number>
</attribute>
<attribute name="headerDefaultSectionSize">
<number>100</number>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
<widget class="QTreeView" name="wii_title_tree"/>
</item>
</layout>
</widget>
@ -102,28 +101,7 @@
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QTreeWidget" name="vwii_title_tree">
<property name="columnCount">
<number>1</number>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<attribute name="headerMinimumSectionSize">
<number>49</number>
</attribute>
<attribute name="headerDefaultSectionSize">
<number>100</number>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
<widget class="QTreeView" name="vwii_title_tree"/>
</item>
</layout>
</widget>
@ -133,22 +111,7 @@
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTreeWidget" name="dsi_title_tree">
<property name="headerHidden">
<bool>true</bool>
</property>
<attribute name="headerMinimumSectionSize">
<number>49</number>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
<widget class="QTreeView" name="dsi_title_tree"/>
</item>
</layout>
</widget>
@ -159,7 +122,7 @@
<item>
<layout class="QVBoxLayout" name="vertical_layout_controls">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
</property>
<item>
<layout class="QHBoxLayout" name="horizontal_layout_title_entry">
@ -222,21 +185,52 @@
</layout>
</item>
<item>
<widget class="QPushButton" name="download_btn">
<property name="text">
<string>Start Download</string>
</property>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="download_btn">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Start Download</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="script_btn">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Run Script</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetMinimumSize</enum>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="spacing">
<number>4</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetMinimumSize</enum>
</property>
<item>
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -246,16 +240,12 @@
</widget>
</item>
<item>
<widget class="QCheckBox" name="pack_archive_chkbox">
<property name="text">
<string>Pack installable archive (WAD/TAD)</string>
</property>
</widget>
<widget class="WrapCheckboxWidget" name="pack_archive_checkbox" native="true"/>
</item>
<item>
<widget class="QLineEdit" name="archive_file_entry">
<property name="enabled">
<bool>false</bool>
<bool>true</bool>
</property>
<property name="placeholderText">
<string>File Name</string>
@ -263,51 +253,52 @@
</widget>
</item>
<item>
<widget class="QCheckBox" name="keep_enc_chkbox">
<property name="text">
<string>Keep encrypted contents</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
<widget class="WrapCheckboxWidget" name="keep_enc_checkbox" native="true"/>
</item>
<item>
<widget class="QCheckBox" name="create_dec_chkbox">
<property name="text">
<string>Create decrypted contents (*.app)</string>
</property>
</widget>
<widget class="WrapCheckboxWidget" name="create_dec_checkbox" native="true"/>
</item>
<item>
<widget class="QCheckBox" name="use_local_chkbox">
<widget class="WrapCheckboxWidget" name="use_local_checkbox" native="true"/>
</item>
<item>
<widget class="WrapCheckboxWidget" name="use_wiiu_nus_checkbox" native="true"/>
</item>
<item>
<widget class="WrapCheckboxWidget" name="patch_ios_checkbox" native="true">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Use local files, if they exist</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="use_wiiu_nus_chkbox">
<property name="text">
<string>Use the Wii U NUS (faster, only effects Wii/vWii)</string>
</property>
<property name="checked">
<bool>true</bool>
<bool>false</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
<height>200</height>
</size>
</property>
</spacer>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>300</width>
<height>0</height>
</size>
</property>
</spacer>
@ -316,11 +307,16 @@
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_8">
<property name="spacing">
<number>4</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetMinimumSize</enum>
</property>
<item>
<widget class="QLabel" name="label_4">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -330,27 +326,89 @@
</widget>
</item>
<item>
<widget class="QCheckBox" name="pack_vwii_mode_chkbox">
<widget class="WrapCheckboxWidget" name="pack_vwii_mode_checkbox" native="true">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Pack for vWii mode instead of Wii U mode</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>App Settings</string>
</property>
</widget>
</item>
<item>
<widget class="WrapCheckboxWidget" name="auto_update_checkbox" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="WrapCheckboxWidget" name="custom_out_dir_checkbox" native="true"/>
</item>
<item>
<layout class="QHBoxLayout" name="custom_out_dir_entry_row">
<item>
<widget class="QLineEdit" name="custom_out_dir_entry">
<property name="enabled">
<bool>false</bool>
</property>
<property name="placeholderText">
<string>Output Path</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="custom_out_dir_btn">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Select...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
<enum>QSizePolicy::Policy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>50</height>
<height>200</height>
</size>
</property>
</spacer>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>300</width>
<height>0</height>
</size>
</property>
</spacer>
@ -364,7 +422,7 @@
<property name="minimumSize">
<size>
<width>0</width>
<height>312</height>
<height>222</height>
</size>
</property>
<property name="markdown">
@ -372,10 +430,32 @@
</property>
<property name="html">
<string>&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;
&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; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; 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;</string>
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:'.AppleSystemUIFont'; font-size:13pt; 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:'Sans Serif'; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QProgressBar" name="progress_bar">
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>30</height>
</size>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
@ -389,11 +469,179 @@ p, li { white-space: pre-wrap; }
<x>0</x>
<y>0</y>
<width>1010</width>
<height>29</height>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menu_help">
<property name="title">
<string>Help</string>
</property>
<addaction name="action_about"/>
<addaction name="action_about_qt"/>
<addaction name="separator"/>
</widget>
<widget class="QMenu" name="menu_options">
<property name="title">
<string>Options</string>
</property>
<widget class="QMenu" name="menu_options_language">
<property name="title">
<string>Language</string>
</property>
<addaction name="action_language_system"/>
<addaction name="action_language_english"/>
<addaction name="action_language_spanish"/>
<addaction name="action_language_german"/>
<addaction name="action_language_french"/>
<addaction name="action_language_italian"/>
<addaction name="action_language_norwegian"/>
<addaction name="action_language_romanian"/>
<addaction name="action_language_korean"/>
</widget>
<widget class="QMenu" name="menu_options_theme">
<property name="title">
<string>Theme</string>
</property>
<addaction name="action_theme_system"/>
<addaction name="action_theme_light"/>
<addaction name="action_theme_dark"/>
</widget>
<addaction name="menu_options_language"/>
<addaction name="menu_options_theme"/>
</widget>
<addaction name="menu_options"/>
<addaction name="menu_help"/>
</widget>
<action name="action_about">
<property name="icon">
<iconset theme="QIcon::ThemeIcon::HelpAbout"/>
</property>
<property name="text">
<string>About NUSGet</string>
</property>
<property name="menuRole">
<enum>QAction::MenuRole::ApplicationSpecificRole</enum>
</property>
</action>
<action name="action_about_qt">
<property name="icon">
<iconset theme="QIcon::ThemeIcon::HelpAbout"/>
</property>
<property name="text">
<string>About Qt</string>
</property>
<property name="menuRole">
<enum>QAction::MenuRole::ApplicationSpecificRole</enum>
</property>
</action>
<action name="action_language_system">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="text">
<string>System (Default)</string>
</property>
</action>
<action name="action_language_english">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string notr="true">English</string>
</property>
</action>
<action name="action_language_spanish">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string notr="true">Español</string>
</property>
</action>
<action name="action_language_german">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string notr="true">Deutsch</string>
</property>
</action>
<action name="action_language_french">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string notr="true">Français</string>
</property>
</action>
<action name="action_language_italian">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string notr="true">Italiano</string>
</property>
</action>
<action name="action_language_norwegian">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string notr="true">Norsk</string>
</property>
</action>
<action name="action_language_romanian">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string notr="true">Română</string>
</property>
</action>
<action name="action_language_korean">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string notr="true">한국어</string>
</property>
</action>
<action name="action_theme_system">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>System (Default)</string>
</property>
</action>
<action name="action_theme_light">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Light</string>
</property>
</action>
<action name="action_theme_dark">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Dark</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>
<class>WrapCheckboxWidget</class>
<extends>QWidget</extends>
<header>qt/py/ui_WrapCheckboxWidget</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -1,6 +1,7 @@
pyside6
nuitka
libWiiPy
nuitka~=2.6.0
git+https://github.com/NinjaCheetah/libWiiPy
libTWLPy
zstandard
imageio
requests
imageio

3
resources/check.svg Normal file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
<polyline points="20 6 9 17 4 12"></polyline>
</svg>

After

Width:  |  Height:  |  Size: 263 B

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="16"
height="16"
viewBox="0 0 16 16"
version="1.1"
id="svg1"
inkscape:version="1.4 (e7c3feb1, 2024-10-09)"
sodipodi:docname="down_arrow_black.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="57.72"
inkscape:cx="8.0128205"
inkscape:cy="8.3939709"
inkscape:window-width="1512"
inkscape:window-height="834"
inkscape:window-x="0"
inkscape:window-y="38"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
sodipodi:type="star"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.154168;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path1"
inkscape:flatsided="false"
sodipodi:sides="3"
sodipodi:cx="5.0945272"
sodipodi:cy="5.9900498"
sodipodi:r1="1.9104478"
sodipodi:r2="0.95522392"
sodipodi:arg1="1.5707963"
sodipodi:arg2="2.6179939"
inkscape:rounded="0"
inkscape:randomized="0"
d="M 5.0945273,7.9004977 4.2672791,6.4676618 3.4400309,5.034826 l 1.6544964,-10e-8 1.6544963,0 -0.8272482,1.4328359 z"
inkscape:transform-center-y="0.68257261"
transform="matrix(2.3912596,0,0,1.4291353,-4.1823371,-1.2431638)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="16"
height="16"
viewBox="0 0 16 16"
version="1.1"
id="svg1"
inkscape:version="1.4.1 (93de688d07, 2025-03-30)"
sodipodi:docname="down_arrow.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="57.72"
inkscape:cx="8.004158"
inkscape:cy="8.4026334"
inkscape:window-width="1920"
inkscape:window-height="1012"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
sodipodi:type="star"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.154168;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path1"
inkscape:flatsided="false"
sodipodi:sides="3"
sodipodi:cx="5.0945272"
sodipodi:cy="5.9900498"
sodipodi:r1="1.9104478"
sodipodi:r2="0.95522392"
sodipodi:arg1="1.5707963"
sodipodi:arg2="2.6179939"
inkscape:rounded="0"
inkscape:randomized="0"
d="M 5.0945273,7.9004977 4.2672791,6.4676618 3.4400309,5.034826 l 1.6544964,-10e-8 1.6544963,0 -0.8272482,1.4328359 z"
inkscape:transform-center-y="0.68257261"
transform="matrix(2.3912596,0,0,1.4291353,-4.1823371,-1.2431638)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="32"
height="32"
viewBox="0 0 32 32"
version="1.1"
id="svg1"
inkscape:version="1.4.1 (93de688d07, 2025-03-30)"
sodipodi:docname="information_black.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="25.125"
inkscape:cx="16.139303"
inkscape:cy="16.835821"
inkscape:window-width="1920"
inkscape:window-height="1012"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="path1"
style="fill:#000000;stroke:#000000;stroke-width:1.306;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
d="M 16 1.6523438 A 14.346852 14.346854 0 0 0 1.6523438 16 A 14.346852 14.346854 0 0 0 16 30.347656 A 14.346852 14.346854 0 0 0 30.347656 16 A 14.346852 14.346854 0 0 0 16 1.6523438 z M 15.992188 4.7265625 C 16.642424 4.7265625 17.197259 4.94079 17.65625 5.3710938 C 18.124803 5.8013975 18.359375 6.3235594 18.359375 6.9355469 C 18.359375 7.5475344 18.124803 8.0677432 17.65625 8.4980469 C 17.197259 8.9283506 16.642424 9.1445312 15.992188 9.1445312 C 15.341951 9.1445312 14.787116 8.9283506 14.328125 8.4980469 C 13.869134 8.0677432 13.640625 7.5475344 13.640625 6.9355469 C 13.640625 6.3235594 13.869134 5.8013975 14.328125 5.3710938 C 14.787116 4.94079 15.341951 4.7265625 15.992188 4.7265625 z M 13.841797 11.238281 L 18.144531 11.238281 L 18.144531 27.273438 L 13.841797 27.273438 L 13.841797 11.238281 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="32"
height="32"
viewBox="0 0 32 32"
version="1.1"
id="svg1"
inkscape:version="1.4.1 (93de688d07, 2025-03-30)"
sodipodi:docname="information.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="25.125"
inkscape:cx="16.139303"
inkscape:cy="16.79602"
inkscape:window-width="1920"
inkscape:window-height="1012"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="path1"
style="fill:#ffffff;stroke:#ffffff;stroke-width:1.3063;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
d="M 16 1.6523438 A 14.346852 14.346854 0 0 0 1.6523438 16 A 14.346852 14.346854 0 0 0 16 30.347656 A 14.346852 14.346854 0 0 0 30.347656 16 A 14.346852 14.346854 0 0 0 16 1.6523438 z M 15.992188 4.7265625 C 16.642424 4.7265625 17.197259 4.94079 17.65625 5.3710938 C 18.124803 5.8013975 18.359375 6.3235594 18.359375 6.9355469 C 18.359375 7.5475344 18.124803 8.0677432 17.65625 8.4980469 C 17.197259 8.9283506 16.642424 9.1445312 15.992188 9.1445312 C 15.341951 9.1445312 14.787116 8.9283506 14.328125 8.4980469 C 13.869134 8.0677432 13.640625 7.5475344 13.640625 6.9355469 C 13.640625 6.3235594 13.869134 5.8013975 14.328125 5.3710938 C 14.787116 4.94079 15.341951 4.7265625 15.992188 4.7265625 z M 13.841797 11.238281 L 18.144531 11.238281 L 18.144531 27.273438 L 13.841797 27.273438 L 13.841797 11.238281 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="16"
height="16"
viewBox="0 0 16 16"
version="1.1"
id="svg1"
inkscape:version="1.4 (e7c3feb1, 2024-10-09)"
sodipodi:docname="right_arrow_black.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="57.72"
inkscape:cx="6.8866944"
inkscape:cy="7.52772"
inkscape:window-width="1512"
inkscape:window-height="834"
inkscape:window-x="0"
inkscape:window-y="38"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
sodipodi:type="star"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.154168;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path1"
inkscape:flatsided="false"
sodipodi:sides="3"
sodipodi:cx="5.0945272"
sodipodi:cy="5.9900498"
sodipodi:r1="1.9104478"
sodipodi:r2="0.95522392"
sodipodi:arg1="1.5707963"
sodipodi:arg2="2.6179939"
inkscape:rounded="0"
inkscape:randomized="0"
d="M 5.0945273,7.9004977 4.2672791,6.4676618 3.4400309,5.034826 l 1.6544964,-10e-8 1.6544963,0 -0.8272482,1.4328359 z"
transform="matrix(0,-2.3912596,1.4291353,0,-0.56059112,19.499764)"
inkscape:transform-center-x="-0.68257261" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="16"
height="16"
viewBox="0 0 16 16"
version="1.1"
id="svg1"
inkscape:version="1.4 (e7c3feb1, 2024-10-09)"
sodipodi:docname="right_arrow.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="57.72"
inkscape:cx="6.8693694"
inkscape:cy="7.52772"
inkscape:window-width="1512"
inkscape:window-height="836"
inkscape:window-x="0"
inkscape:window-y="38"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
sodipodi:type="star"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.154168;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path1"
inkscape:flatsided="false"
sodipodi:sides="3"
sodipodi:cx="5.0945272"
sodipodi:cy="5.9900498"
sodipodi:r1="1.9104478"
sodipodi:r2="0.95522392"
sodipodi:arg1="1.5707963"
sodipodi:arg2="2.6179939"
inkscape:rounded="0"
inkscape:randomized="0"
d="M 5.0945273,7.9004977 4.2672791,6.4676618 3.4400309,5.034826 l 1.6544964,-10e-8 1.6544963,0 -0.8272482,1.4328359 z"
transform="matrix(0,-2.3912596,1.4291353,0,-0.56059112,19.499764)"
inkscape:transform-center-x="-0.68257261" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="2" width="20" height="20" rx="3"></rect>
</svg>

After

Width:  |  Height:  |  Size: 273 B

436
resources/style_dark.qss Normal file
View File

@ -0,0 +1,436 @@
/* "resources/style.qss" from NUSGet by NinjaCheetah & Contributors */
/* Much of this QSS was written by Alex (https://github.com/Humanoidear) */
/* from WiiLink for the fancy new WiiLink Patcher GUI. Used with permission. */
QMainWindow, QDialog {
background-color: #222222;
}
QMainWindow QLabel {
color: #ffffff;
}
QDialog QLabel {
color: #ffffff;
}
QDialog QLabel[class="title"] {
font-size: 20px;
font-weight: bold;
}
QDialog QLabel[class="version"] {
font-size: 13px;
color: #aaaaaa;
}
QDialog QLabel[class="copyright"] {
font-size: 12px;
color: #888888;
}
QDialog QLabel[class="header"] {
font-size: 14px;
font-weight: bold;
border-bottom: 1px solid #444444;
padding-bottom: 4px;
margin-top: 8px;
}
QMenuBar {
background-color: #2b2b2b;
}
QMenuBar::item:selected {
background-color: rgba(60, 60, 60, 1);
color: white;
}
QMenuBar::item:pressed {
background-color: #1a73e8;
color: white;
}
QMenu {
background-color: #2b2b2b;
border: 1px solid rgba(70, 70, 70, 1);
border-radius: 8px;
padding: 6px 2px;
margin: 4px 0;
color: white;
}
QMenu::item {
padding: 6px 16px 6px 4px;
margin: 2px;
border-radius: 4px;
background-color: transparent;
}
QMenu::item:selected {
background-color: #1a73e8;
color: white;
}
QMenu::icon {
padding: 4px;
}
QRadioButton {
background-color: transparent;
border: 1px solid rgba(70, 70, 70, 1);
border-radius: 8px;
padding: 8px 10px;
font-size: 13px;
font-weight: 500;
color: #ffffff;
}
QRadioButton:hover {
background-color: rgba(60, 60, 60, 1);
border-color: #4a86e8;
}
QRadioButton:checked {
background-color: rgba(26, 115, 232, 0.08);
border: 1px solid #1a73e8;
color: #1a73e8;
}
QRadioButton::indicator {
width: 18px;
height: 18px;
border-radius: 5px;
border: 1px solid #5f6368;
margin-right: 8px;
subcontrol-position: left center;
}
QRadioButton::indicator:checked {
background-color: #1a73e8;
border: 1px solid #1a73e8;
image: url("{IMAGE_PREFIX}/rounded_square.svg");
}
QRadioButton::indicator:hover {
border-color: #1a73e8;
}
QLineEdit {
background-color: transparent;
border: 1px solid rgba(70, 70, 70, 1);
border-radius: 8px;
padding: 6px 10px;
margin: 4px 0px;
font-size: 13px;
color: #ffffff;
selection-background-color: #1a73e8;
}
QLineEdit:focus {
border-color: #1a73e8;
}
QLineEdit:disabled {
background-color: rgba(70, 70, 70, 0.5);
border: 1px solid rgba(100, 100, 100, 0.3);
color: rgba(255, 255, 255, 0.3);
}
QTabWidget::pane {
border: 1px solid rgba(70, 70, 70, 1);
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
border-bottom-left-radius: 8px;
background-color: #2b2b2b;
top: -1px;
}
QTabBar::tab {
background-color: transparent;
border-top: 1px solid rgba(70, 70, 70, 1);
border-left: 1px solid rgba(70, 70, 70, 1);
border-right: 1px solid rgba(70, 70, 70, 1);
border-top-left-radius: 6px;
border-top-right-radius: 6px;
padding: 6px 10px;
font-size: 13px;
font-weight: 500;
color: #ffffff;
}
QTabBar::tab:selected, QTabBar::tab:hover {
background-color: #2b2b2b;
}
QTreeView {
show-decoration-selected: 1;
outline: 0;
background-color: #1a1a1a;
border: 0;
border-radius: 8px;
}
QTreeView QHeaderView::section {
color: white;
background-color: #2b2b2b;
border: 0;
font-weight: 500;
}
QTreeView::item {
color: white;
}
QTreeView::item:hover {
background-color: rgba(60, 60, 60, 1);
}
QTreeView::item:focus {
background-color: rgba(26, 115, 232, 0.08);
}
QTreeView::item:selected {
background-color: #1a73e8;
}
QTreeView QScrollBar:vertical {
margin-top: 16px;
}
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
image: url("{IMAGE_PREFIX}/right_arrow_white.svg");
}
QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {
image: url("{IMAGE_PREFIX}/down_arrow_white.svg");
}
QTextBrowser {
color: white;
background-color: #1a1a1a;
selection-background-color: #1a73e8;
}
QPushButton {
outline: 0;
show-decoration-selected: 1;
background-color: transparent;
border: 1px solid rgba(70, 70, 70, 1);
border-radius: 8px;
padding: 6px 10px;
margin: 4px 0px;
font-size: 13px;
font-weight: 500;
color: #ffffff;
}
QPushButton:hover {
background-color: rgba(60, 60, 60, 1);
border-color: #4a86e8;
}
QPushButton:focus {
background-color: rgba(60, 60, 60, 1);
border-color: #4a86e8;
}
QPushButton:pressed {
background-color: rgba(26, 115, 232, 0.15);
border: 1px solid #1a73e8;
}
QPushButton:disabled {
background-color: rgba(70, 70, 70, 0.5);
border: 1px solid rgba(100, 100, 100, 0.3);
color: rgba(255, 255, 255, 0.3);
}
QComboBox {
background-color: transparent;
combobox-popup: 0;
border: 1px solid rgba(70, 70, 70, 1);
border-radius: 8px;
padding: 6px 10px;
margin: 4px 0px;
font-size: 13px;
font-weight: 500;
color: #ffffff;
}
QComboBox:on {
background-color: rgba(26, 115, 232, 0.15);
border: 1px solid #1a73e8;
}
QComboBox:hover {
background-color: rgba(60, 60, 60, 1);
border-color: #4a86e8;
}
QComboBox:focus {
background-color: rgba(60, 60, 60, 1);
border-color: #4a86e8;
}
QComboBox::drop-down {
border: 0;
width: 24px;
}
QComboBox::down-arrow {
image: url("{IMAGE_PREFIX}/down_arrow_white.svg");
}
QComboBox QAbstractItemView {
background-color: #2b2b2b;
border: 1px solid #444444;
border-radius: 8px;
padding: 4px;
outline: none;
}
QComboBox QAbstractItemView::item {
height: 25px;
border-radius: 4px;
padding: 4px 8px;
margin: 2px 0px;
color: white;
}
QComboBox QAbstractItemView::item:hover {
background-color: #1a73e8;
}
QScrollBar:vertical {
border: 0;
border-radius: 8px;
padding: 2px 0 2px 0;
background-color: #222222;
}
QScrollBar::handle:vertical {
background-color: rgba(60, 60, 60, 1);
margin: 0px 2px 0px 2px;
width: 10px;
border: 1px solid rgba(70, 70, 70, 1);
border-radius: 4px;
}
QScrollBar::handle:vertical:hover {
background-color: rgba(26, 115, 232, 0.4);
}
QScrollBar::add-line:vertical {
height: 0;
subcontrol-position: bottom;
subcontrol-origin: margin;
}
QScrollBar::sub-line:vertical {
height: 0;
subcontrol-position: top;
subcontrol-origin: margin;
}
QScrollBar:horizontal {
border: 0;
border-radius: 8px;
padding: 2px 0 2px 0;
background-color: #222222;
}
QScrollBar::handle:horizontal {
background-color: rgba(60, 60, 60, 1);
margin: 0px 2px 0px 2px;
border: 1px solid rgba(70, 70, 70, 1);
border-radius: 4px;
}
QScrollBar::handle:horizontal:hover {
background-color: rgba(26, 115, 232, 0.4);
}
QScrollBar::add-line:horizontal {
height: 0;
subcontrol-position: bottom;
subcontrol-origin: margin;
}
QScrollBar::sub-line:horizontal {
height: 0;
subcontrol-position: top;
subcontrol-origin: margin;
}
QMessageBox QLabel {
color: white;
}
QProgressBar {
border: 1px solid rgba(70, 70, 70, 1);
border-radius: 8px;
background-color: #1a1a1a;
text-align: center;
color: white;
padding-left: 1px;
}
QProgressBar::chunk {
background-color: qlineargradient(
x1: 0, y1: 0, x2: 1, y2: 0,
stop: 0 #1a73e8, stop: 1 #5596f4
);
border-radius: 5px;
margin: 0.5px;
}
WrapCheckboxWidget {
show-decoration-selected: 1;
outline: 0;
background-color: transparent;
border: 1px solid rgba(70, 70, 70, 1);
border-radius: 8px;
padding: 12px 10px;
font-size: 13px;
font-weight: 500;
color: #ffffff;
}
WrapCheckboxWidget:hover {
background-color: rgba(60, 60, 60, 1);
border-color: #4a86e8;
}
WrapCheckboxWidget:disabled {
background-color: rgba(70, 70, 70, 0.5);
border: 1px solid rgba(100, 100, 100, 0.3);
color: rgba(255, 255, 255, 0.3);
}
WrapCheckboxWidget QLabel:disabled {
color: #919191;
}
WrapCheckboxWidget QCheckBox::indicator {
width: 16px;
height: 16px;
border-radius: 4px;
border: 1px solid #5f6368;
}
WrapCheckboxWidget QCheckBox::indicator:checked {
background-color: #1a73e8;
border: 1px solid #1a73e8;
image: url("{IMAGE_PREFIX}/check.svg");
}
WrapCheckboxWidget QCheckBox::indicator:hover {
border-color: #1a73e8;
}
WrapCheckboxWidget QCheckBox:checked {
color: #1a73e8;
}

444
resources/style_light.qss Normal file
View File

@ -0,0 +1,444 @@
/* "resources/style.qss" from NUSGet by NinjaCheetah & Contributors */
/* Much of this QSS was written by Alex (https://github.com/Humanoidear) */
/* from WiiLink for the fancy new WiiLink Patcher GUI. Used with permission. */
QMainWindow, QDialog {
background-color: #ffffff;
}
QMainWindow QLabel {
color: #000000;
}
QDialog QLabel {
color: #000000;
}
QDialog QLabel[class="title"] {
font-size: 20px;
font-weight: bold;
}
QDialog QLabel[class="version"] {
font-size: 13px;
color: #777777;
}
QDialog QLabel[class="copyright"] {
font-size: 12px;
color: #444444;
}
QDialog QLabel[class="header"] {
font-size: 14px;
font-weight: bold;
border-bottom: 1px solid #111111;
padding-bottom: 4px;
margin-top: 8px;
}
QMenuBar {
background-color: #e3e3e3;
color: #000000;
}
QMenuBar::item:selected {
background-color: rgb(195, 195, 195);
color: #000000;
}
QMenuBar::item:pressed {
background-color: #1a73e8;
color: #ffffff;
}
QMenu {
background-color: #ffffff;
border: 1px solid rgb(163, 163, 163);
border-radius: 8px;
padding: 6px 2px;
margin: 4px 0;
color: #000000;
}
QMenu::item {
padding: 6px 16px 6px 4px;
margin: 2px;
border-radius: 4px;
background-color: transparent;
}
QMenu::item:selected {
background-color: #1a73e8;
color: #ffffff;
}
QMenu::icon {
padding: 4px;
}
QRadioButton {
background-color: transparent;
border: 1px solid rgb(163, 163, 163);
border-radius: 8px;
padding: 8px 10px;
font-size: 13px;
font-weight: 500;
color: #ffffff;
}
QRadioButton:hover {
background-color: rgba(60, 60, 60, 1);
border-color: #4a86e8;
}
QRadioButton:checked {
background-color: rgba(26, 115, 232, 0.08);
border: 1px solid #1a73e8;
color: #1a73e8;
}
QRadioButton::indicator {
width: 18px;
height: 18px;
border-radius: 5px;
border: 1px solid #5f6368;
margin-right: 8px;
subcontrol-position: left center;
}
QRadioButton::indicator:checked {
background-color: #1a73e8;
border: 1px solid #1a73e8;
image: url("{IMAGE_PREFIX}/rounded_square.svg");
}
QRadioButton::indicator:hover {
border-color: #1a73e8;
}
QLineEdit {
background-color: transparent;
border: 1px solid rgb(163, 163, 163);
border-radius: 8px;
padding: 6px 10px;
margin: 4px 0px;
font-size: 13px;
color: #000000;
selection-background-color: #1a73e8;
}
QLineEdit:focus {
border-color: #1a73e8;
}
QLineEdit:disabled {
background-color: rgba(182, 182, 182, 0.5);
border: 1px solid rgba(100, 100, 100, 0.3);
color: rgba(143, 143, 143, 0.3);
}
QTabWidget::pane {
border: 1px solid rgb(163, 163, 163);
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
border-bottom-left-radius: 8px;
background-color: #e3e3e3;
top: -1px;
}
QTabBar::tab {
background-color: transparent;
border-top: 1px solid rgb(163, 163, 163);
border-left: 1px solid rgb(163, 163, 163);
border-right: 1px solid rgb(163, 163, 163);
border-top-left-radius: 6px;
border-top-right-radius: 6px;
padding: 6px 10px;
font-size: 13px;
font-weight: 500;
color: #000000;
}
QTabBar::tab:selected, QTabBar::tab:hover {
background-color: #e3e3e3;
}
QTreeView {
show-decoration-selected: 1;
outline: 0;
background-color: #ffffff;
border: 0;
border-radius: 8px;
}
QTreeView QHeaderView::section {
color: #000000;
background-color: #e3e3e3;
border: 0;
font-weight: 500;
}
QTreeView::item {
color: #000000;
}
QTreeView::item:hover {
background-color: rgb(195, 195, 195);
}
QTreeView::item:focus {
background-color: rgba(26, 115, 232, 0.08);
}
QTreeView::item:selected {
background-color: rgb(127, 182, 255);
}
QTreeView::branch:selected {
background-color: rgb(127, 182, 255);
}
QTreeView QScrollBar:vertical {
margin-top: 16px;
}
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
image: url("{IMAGE_PREFIX}/right_arrow_black.svg");
}
QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {
image: url("{IMAGE_PREFIX}/down_arrow_black.svg");
}
QTextBrowser {
color: #000000;
background-color: #ececec;
selection-background-color: #1a73e8;
selection-color: #ffffff;
}
QPushButton {
outline: 0;
show-decoration-selected: 1;
background-color: transparent;
border: 1px solid rgb(163, 163, 163);
border-radius: 8px;
padding: 6px 10px;
margin: 4px 0px;
font-size: 13px;
font-weight: 500;
color: #000000;
}
QPushButton:hover {
background-color: rgb(195, 195, 195);
border-color: #4a86e8;
}
QPushButton:focus {
background-color: rgb(195, 195, 195);
border-color: #4a86e8;
}
QPushButton:pressed {
background-color: rgba(26, 115, 232, 0.15);
border: 1px solid #1a73e8;
}
QPushButton:disabled {
background-color: rgba(182, 182, 182, 0.5);
border: 1px solid rgba(100, 100, 100, 0.3);
color: rgba(143, 143, 143, 0.3);
}
QComboBox {
background-color: transparent;
combobox-popup: 0;
border: 1px solid rgb(163, 163, 163);
border-radius: 8px;
padding: 6px 10px;
margin: 4px 0px;
font-size: 13px;
font-weight: 500;
color: #000000;
}
QComboBox:on {
background-color: rgba(26, 115, 232, 0.15);
border: 1px solid #1a73e8;
}
QComboBox:hover {
background-color: rgb(195, 195, 195);
border-color: #4a86e8;
}
QComboBox:focus {
background-color: rgb(195, 195, 195);
border-color: #4a86e8;
}
QComboBox::drop-down {
border: 0;
width: 24px;
}
QComboBox::down-arrow {
image: url("{IMAGE_PREFIX}/down_arrow_black.svg");
}
QComboBox QAbstractItemView {
background-color: #ffffff;
border: 1px solid rgb(163, 163, 163);
border-radius: 8px;
padding: 4px;
outline: none;
}
QComboBox QAbstractItemView::item {
height: 25px;
border-radius: 4px;
padding: 4px 8px;
margin: 2px 0px;
color: #000000;
}
QComboBox QAbstractItemView::item:hover {
background-color: #1a73e8;
color: #ffffff;
}
QScrollBar:vertical {
border: 0;
border-radius: 8px;
padding: 2px 0 2px 0;
background-color: #f1f1f1;
}
QScrollBar::handle:vertical {
background-color: #e3e3e3;
margin: 0 2px 0 2px;
width: 10px;
border: 1px solid rgb(163, 163, 163);
border-radius: 4px;
}
QScrollBar::handle:vertical:hover {
background-color: rgba(26, 115, 232, 0.4);
}
QScrollBar::add-line:vertical {
height: 0;
subcontrol-position: bottom;
subcontrol-origin: margin;
}
QScrollBar::sub-line:vertical {
height: 0;
subcontrol-position: top;
subcontrol-origin: margin;
}
QScrollBar:horizontal {
border: 0;
border-radius: 8px;
padding: 2px 0 2px 0;
background-color: #f1f1f1;
}
QScrollBar::handle:horizontal {
background-color: #e3e3e3;
border: 1px solid rgb(163, 163, 163);
margin: 0px 2px 0px 2px;
border: 1px solid rgb(163, 163, 163);
border-radius: 4px;
}
QScrollBar::handle:horizontal:hover {
background-color: rgba(26, 115, 232, 0.4);
}
QScrollBar::add-line:horizontal {
height: 0;
subcontrol-position: bottom;
subcontrol-origin: margin;
}
QScrollBar::sub-line:horizontal {
height: 0;
subcontrol-position: top;
subcontrol-origin: margin;
}
QMessageBox QLabel {
color: #000000;
}
QProgressBar {
border: 1px solid rgb(163, 163, 163);
border-radius: 8px;
background-color: #ececec;
text-align: center;
padding: 1px;
color: black;
}
QProgressBar::chunk {
background-color: qlineargradient(
x1: 0, y1: 0, x2: 1, y2: 0,
stop: 0 #1a73e8, stop: 1 #5596f4
);
border-radius: 5px;
margin: 0.5px;
}
WrapCheckboxWidget {
show-decoration-selected: 1;
outline: 0;
background-color: transparent;
border: 1px solid rgb(163, 163, 163);
border-radius: 8px;
padding: 12px 10px;
font-size: 13px;
font-weight: 500;
color: #000000;
}
WrapCheckboxWidget:hover {
background-color: rgb(195, 195, 195);
border-color: #4a86e8;
}
WrapCheckboxWidget:disabled {
background-color: rgba(182, 182, 182, 0.5);
border: 1px solid rgba(100, 100, 100, 0.3);
color: rgba(255, 255, 255, 0.3);
}
WrapCheckboxWidget QLabel:disabled {
color: rgba(143, 143, 143, 0.3);
}
WrapCheckboxWidget QCheckBox::indicator {
width: 16px;
height: 16px;
border-radius: 4px;
border: 1px solid #5f6368;
}
WrapCheckboxWidget QCheckBox::indicator:checked {
background-color: #1a73e8;
border: 1px solid #1a73e8;
image: url("{IMAGE_PREFIX}/check.svg");
}
WrapCheckboxWidget QCheckBox::indicator:hover {
border-color: #1a73e8;
}
WrapCheckboxWidget QCheckBox:checked {
color: #1a73e8;
}

View File

@ -0,0 +1,533 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de_DE">
<context>
<name>AboutNUSGet</name>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
<source>About NUSGet</source>
<translation>Über NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
<source>NUSGet</source>
<translatorcomment>Translating the name probably doesn&apos;t make much sense, I think</translatorcomment>
<translation>NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
<source>Version {nusget_version}</source>
<translation>Version {nusget_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
<source>Using libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</source>
<translation>Mit libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
<source>© 2024-2025 NinjaCheetah &amp; Contributors</source>
<translation>© 2024-2025 NinjaCheetah &amp; Mitwirkende</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
<source>View Project on GitHub</source>
<translation>Dieses Projekt auf GitHub öffnen</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
<source>Translations</source>
<translation>Übersetzungen</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
<source>French (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</source>
<translation>Französisch (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
<source>German (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</source>
<translation>Deutsch: &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
<source>Italian (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</source>
<translation>Italienisch (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
<source>Korean (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</source>
<translation>Koreanisch (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
<source>Norwegian (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</source>
<translation>Norwegisch (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
<source>Romanian (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</source>
<translation>Rumänisch (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
<source>Spanish (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</source>
<translation>Spanisch (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../../NUSGet.py" line="119"/>
<source>Select a title from the list on the left, or enter a Title ID to begin.
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
By default, titles will be downloaded to a folder named &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translatorcomment>Windows and macOS don&apos;t translate Downloads, and most Linux distributions (with xdg-home-dirs I guess?) don&apos;t either, so we keep it the same</translatorcomment>
<translation>Wähle einen Titel aus der Liste links aus oder gebe eine Title-ID an, um zu beginnen.
Titel, welche in der Liste mit einem Haken markiert sind, haben ein frei verfügbares Ticket und können so entschlüsselt gespeichert und auch in eine WAD oder TAD gepackt werden. Bei anderen Titeln können nur verschlüsselte Inhalte heruntergeladen werden.
Standartmäßig werden alle Inhalte und Archive in einen &quot;NUSGet Downloads&quot;-Ordner im Downloads-Order gespeichert.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="218"/>
<source>Pack installable archive (WAD/TAD)</source>
<translation>Als installierbares Archiv verpacken (WAD/TAD)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="220"/>
<source>Keep encrypted contents</source>
<translatorcomment>&quot;speichern&quot; is more like &quot;save&quot; than &quot;keep&quot;, but &quot;behalten&quot; would sound stupid</translatorcomment>
<translation>Verschlüsselte Inhalte speichern</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="222"/>
<source>Create decrypted contents (*.app)</source>
<translatorcomment>Similar situation as with &quot;Keep encrypted contents&quot;, means more like &quot;Decrypt contents&quot; because it sounds better</translatorcomment>
<translation>Inhalte entschlüsseln (*.app)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="223"/>
<source>Use local files, if they exist</source>
<translation>Vorhandene Dateien nutzen, sofern verfügbar</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="224"/>
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
<translation>Wii U-NUS benutzen (schneller, betrifft nur Wii/vWii)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="226"/>
<source>Apply patches to IOS (Applies to WADs only)</source>
<translation>Patches für IOS anwenden (Betrifft nur WADs)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="227"/>
<source>Re-encrypt title using the Wii Common Key</source>
<translation>Inhalte des Titels mit dem Wii Common-Key neu verschlüsseln</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="228"/>
<source>Check for updates on startup</source>
<translation>Beim Start nach Updates suchen</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="229"/>
<source>Use a custom download directory</source>
<translation>Benutzerspezifischen Downloads-Ordner nutzen</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="305"/>
<source>NUSGet Update Available</source>
<translation>NUSGet-Update verfügbar</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="306"/>
<source>&lt;b&gt;There&apos;s a newer version of NUSGet available!&lt;/b&gt;</source>
<translation>&lt;b&gt;Eine neue version von NUSGet ist verfügbar!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="407"/>
<source>No Output Selected</source>
<translatorcomment>&quot;Output&quot; is quite difficult to translate into anything sensical, so I added &quot;format&quot; to make it specifically refer to the type of output the user wants, which keeps it consistent with the rest of the text</translatorcomment>
<translation>Kein Ausgabeformat ausgewählt</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="408"/>
<source>You have not selected any format to output the data in!</source>
<translation>Es wurde kein Ausgabeformat für die Inhalte ausgewählt!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="410"/>
<source>Please select at least one option for how you would like the download to be saved.</source>
<translation>Bitte wählen Sie mindestens ein Format aus für den herunterzuladenen Titel.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="422"/>
<location filename="../../NUSGet.py" line="628"/>
<source>Invalid Download Directory</source>
<translation>Fehlerhafter Downloads-Ordner</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="423"/>
<source>The specified download directory does not exist!</source>
<translation>Der ausgewählte Downloads-Ordner konnte nicht gefunden werden!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="426"/>
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
<translation>Bitte stellen Sie sicher, dass der Downloads-Ordner existiert und dass Sie Zugriff auf diesen haben.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="456"/>
<source>Invalid Title ID</source>
<translation>Fehlerhafte Title-ID</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="457"/>
<source>&lt;b&gt;The Title ID you have entered is not in a valid format!&lt;/b&gt;</source>
<translation>&lt;b&gt;Die angegebene Title-ID ist fehlerhaft!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="459"/>
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
<translation>Title-IDs müssen aus 16 alphanumerischen Zeichen bestehen. Bitte geben Sie eine korrekte Title-ID ein oder wählen Sie einen Titel aus der Liste links.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="461"/>
<source>Title ID/Version Not Found</source>
<translation>Title-ID/Version nicht gefunden</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="462"/>
<source>&lt;b&gt;No title with the provided Title ID or version could be found!&lt;/b&gt;</source>
<translation>&lt;b&gt;Es konnte kein Titel mit der gegebenen Title-ID bzw. Version gefunden werden!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="464"/>
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
<translation>Bitte stellen Sie sicher, dass Sie eine korrekte Title-ID eingegeben haben und dass die Version auch existiert. Alternativ können Sie diese auch in der Liste links finden.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="466"/>
<source>Content Decryption Failed</source>
<translation>Inhaltsentschlüsselung fehlgeschlagen</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="467"/>
<source>&lt;b&gt;Content decryption was not successful! Decrypted contents could not be created.&lt;/b&gt;</source>
<translation>&lt;b&gt;Die Inhalte konnten nicht entschlüsselt werden.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="470"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &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>Das TMD oder Ticket könnten wohlmöglich beschädigt sein oder stimmen nicht mit dem ausgewählten Titel überein, sofern &quot;Vorhandene Dateien nutzen, sofern verfügbar&quot; aktiviert wurde. Im letzteren Fall sollten Sie versuchen, diese Option auszuschalten und die Inhalte neu herunterzuladen.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="473"/>
<source>Ticket Not Available</source>
<translation>Ticket nicht verfügbar</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="474"/>
<source>&lt;b&gt;No Ticket is Available for the Requested Title!&lt;/b&gt;</source>
<translation>&lt;b&gt;Es konnte kein Ticket für den angegebenen TItel gefunden werden!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="477"/>
<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 konnte kein Ticket für den ausgewählten Titel heruntergeladen werden, jedoch wurde &quot;Als installierbares Archiv verpacken&quot; bzw. &quot;Inhalte entschlüsseln&quot; ausgewählt. Diese Optionen erfordern ein Ticket. Es wurden nur verschlüsselte Inhalte gespeichert.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="479"/>
<source>Unknown Error</source>
<translation>Unbekannter Fehler</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="480"/>
<source>&lt;b&gt;An Unknown Error has Occurred!&lt;/b&gt;</source>
<translation>&lt;b&gt;Ein unbekannter Fehler ist aufgetreten!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="482"/>
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
<translation>Bitte versuchen Sie noch einmal. Sofern das Problem weiter besteht, wenden Sie sich bitte an den Issue-Tracker auf GitHub mit Details dazu, was Sie versucht haben.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="501"/>
<source>Script Issues Occurred</source>
<translation>Script-Fehler aufgetreten</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="502"/>
<source>&lt;b&gt;Some issues occurred while running the download script.&lt;/b&gt;</source>
<translation>&lt;b&gt;Fehler sind während der Ausführung von Scripten aufgetreten.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="504"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation>Bitte schauen Sie im Log nach, welche Fehler aufgetreten sind.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="511"/>
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
<translation>Die angegebenen Titel konnten wegen Fehlern nicht heruntergeladen werden. Bitte stellen Sie sicher, dass die Title-IDs und Versionen im Script korrekt sind.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="521"/>
<source>You enabled &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>Sie haben &quot;Inhalte entschlüsseln&quot; bzw. &quot;Als installierbares Archiv verpacken&quot; ausgewählt, aber die angegebenen Titel im Script haben kein verfügbares Ticket. Sofern &quot;Verschlüsselte Inhalte speichern&quot; aktiv ist, wurden verschlüsselte Daten noch gespeichert.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="540"/>
<source>Script Download Failed</source>
<translation>Script-Download fehlgeschlagen</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="541"/>
<source>Open NUS Script</source>
<translation>NUS-Script öffnen</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="542"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>NUS-Scripts (*.nus *.json)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="552"/>
<source>&lt;b&gt;An error occurred while parsing the script file!&lt;/b&gt;</source>
<translation>&lt;b&gt;Ein Fehler ist beim Lesen des Scripts aufgetreten!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="554"/>
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
<translation>Der Fehler ist bei Linie {lineno}, Zeile {colno} aufgetreten. Bitte überprüfen Sie ihr Script und versuchen Sie es erneut.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="563"/>
<source>&lt;b&gt;An error occurred while parsing Title IDs!&lt;/b&gt;</source>
<translation>&lt;b&gt;Ein Fehler ist beim Lesen der Title-IDs aufgetreten!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="565"/>
<source>The title at index {index} does not have a Title ID!</source>
<translation>Der Titel an Stelle {index} hat keine Title-ID!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="618"/>
<source>Open Directory</source>
<translation>Ordner öffnen</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="629"/>
<source>&lt;b&gt;The specified download directory does not exist!&lt;/b&gt;</source>
<translation>&lt;b&gt;Der angegebene Downloads-Ordner konnte nicht gefunden werden!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="632"/>
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
<translation>Bitte stellen Sie sicher, dass der Downloads-Ordner, den Sie nutzen möchten, existiert und dass Sie darauf auch Zugriffen haben.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="661"/>
<location filename="../../NUSGet.py" line="671"/>
<source>Restart Required</source>
<translation>Neustart erforderlich</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="662"/>
<source>NUSGet must be restarted for the selected language to take effect.</source>
<translation>NUSGet muss erneut gestartet werden, um die ausgewählte Sprache zu nutzen.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="672"/>
<source>NUSGet must be restarted for the selected theme to take effect.</source>
<translation>NUSGet muss erneut gestartet werden, um die ausgewählte Darstellung zu nutzen.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="74"/>
<source>
Could not check for updates.</source>
<translation>
Konnte nicht nach Updates suchen.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="84"/>
<source>
There&apos;s a newer version of NUSGet available!</source>
<translation>
Eine neuere Version von NUSGet ist verfügbar!</translation>
</message>
<message>
<location filename="../../modules/core.py" line="86"/>
<source>
You&apos;re running the latest release of NUSGet.</source>
<translation>
Sie nutzen bereits die neuste Version von NUSGet.</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
<source>MainWindow</source>
<translatorcomment>This isn&apos;t shown to the user</translatorcomment>
<translation>MainWindow</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Search</source>
<translation>Suche</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
<source>Clear</source>
<translation>Leeren</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
<source>Wii</source>
<translation>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>Title-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>Version</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source>
<translation>Konsole:</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source>
<translation>Herunterladen</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source>
<translation>Script ausführen</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source>
<translation>Einstellungen</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
<source>File Name</source>
<translation>Datei-Name</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
<source>vWii Title Settings</source>
<translation>vWii-Titeleinstellungen</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
<source>App Settings</source>
<translation>App-Einstellungen</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
<source>Output Path</source>
<translation>Downloads-Ordner</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
<source>Select...</source>
<translation>Auswählen...</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
<source>&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;.AppleSystemUIFont&apos;; font-size:13pt; 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;.AppleSystemUIFont&apos;; font-size:13pt; 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>
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
<source>Help</source>
<translation>Hilfe</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
<source>Options</source>
<translation>Optionen</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
<source>Language</source>
<translation>Sprache</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
<source>Theme</source>
<translation>Darstellung</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
<source>About NUSGet</source>
<translation>Über NUSGet</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
<source>About Qt</source>
<translation>Über Qt</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
<source>System (Default)</source>
<translation>System (Standart)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
<source>Light</source>
<translation>Hell</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
<source>Dark</source>
<translation>Dunkel</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,530 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="es_ES">
<context>
<name>AboutNUSGet</name>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
<source>About NUSGet</source>
<translation>Acerca de NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
<source>NUSGet</source>
<translation>NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
<source>Version {nusget_version}</source>
<translation>Versión {nusget_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
<source>Using libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</source>
<translation>Usando libWiiPy {libwiipy_version} y libTWLPy {libtwlpy_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
<source>© 2024-2025 NinjaCheetah &amp; Contributors</source>
<translation>© 2024-2025 NinjaCheetah y colaboradores</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
<source>View Project on GitHub</source>
<translation>Ver proyecto en GitHub</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
<source>Translations</source>
<translation>Traducciones</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
<source>French (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</source>
<translation>Francés (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
<source>German (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</source>
<translation>Alemán (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
<source>Italian (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</source>
<translatorcomment>&quot;Italiano&quot; is spelled the same way in both Italian and Spanish.</translatorcomment>
<translation>Italiano: &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
<source>Korean (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</source>
<translation>Coreano (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
<source>Norwegian (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</source>
<translation>Noruego (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
<source>Romanian (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</source>
<translation>Rumano (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
<source>Spanish (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</source>
<translation>Español: &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
<source>Wii</source>
<translatorcomment>Does not change.</translatorcomment>
<translation>Wii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
<source>vWii</source>
<translatorcomment>Does not change.</translatorcomment>
<translation>vWii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
<source>DSi</source>
<translatorcomment>Does not change.</translatorcomment>
<translation>DSi</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
<source>v</source>
<translatorcomment>Does not change.</translatorcomment>
<translation>v</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
<source>MainWindow</source>
<translation>VentanaPrincipal</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Search</source>
<translation>Buscar</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
<source>Clear</source>
<translation>Limpiar</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
<source>Title ID</source>
<translation>ID de título</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="155"/>
<source>Version</source>
<translation>Versión</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source>
<translation>Consola:</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source>
<translation>Iniciar descarga</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source>
<translation>Ejecutar script</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source>
<translation>Configuración general</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
<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;.AppleSystemUIFont&apos;; font-size:13pt; 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></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
<source>Options</source>
<translation>Opciones</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
<source>Language</source>
<translation>Idioma</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
<source>Theme</source>
<translation>Tema</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
<source>About NUSGet</source>
<translation>Acerca de NUSGet</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
<source>System (Default)</source>
<translation>Sistema (por defecto)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
<source>Light</source>
<translation>Claro</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
<source>Dark</source>
<translation>Oscuro</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="218"/>
<source>Pack installable archive (WAD/TAD)</source>
<translation>Generar paquete de instalación (WAD/TAD)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
<source>File Name</source>
<translation>Nombre de archivo</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="220"/>
<source>Keep encrypted contents</source>
<translation>Mantener contenidos encriptados</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="222"/>
<source>Create decrypted contents (*.app)</source>
<translation>Crear contenidos desencriptados (*.app)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="223"/>
<source>Use local files, if they exist</source>
<translation>Usar archivos locales, si existen</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
<source>vWii Title Settings</source>
<translation>Configuración de títulos de vWii</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="227"/>
<source>Re-encrypt title using the Wii Common Key</source>
<translation>Reencriptar título usando la clave común de Wii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
<source>App Settings</source>
<translation>Configuración de aplicación</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="228"/>
<source>Check for updates on startup</source>
<translation>Buscar actualizaciones al inicio</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="229"/>
<source>Use a custom download directory</source>
<translation>Usar ruta de descarga personalizada</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
<source>Select...</source>
<translation>Seleccionar...</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
<source>Help</source>
<translation>Ayuda</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
<source>About Qt</source>
<translation>Acerca de Qt</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
<source>Output Path</source>
<translation>Ruta de descarga</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="226"/>
<source>Apply patches to IOS (Applies to WADs only)</source>
<translation>Aplicar parches a IOS (sólo aplica a WADs)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="305"/>
<source>NUSGet Update Available</source>
<translation>Actualización de NUSGet disponible</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="407"/>
<source>No Output Selected</source>
<translation>Formato de salida no escogido</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="408"/>
<source>You have not selected any format to output the data in!</source>
<translation>¡No has escogido un formato de salida para los datos!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="410"/>
<source>Please select at least one option for how you would like the download to be saved.</source>
<translation>Por favor, selecciona al menos un formato de salida para la descarga.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="422"/>
<location filename="../../NUSGet.py" line="628"/>
<source>Invalid Download Directory</source>
<translation>Directorio de descarga inválido</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="423"/>
<source>The specified download directory does not exist!</source>
<translation>¡El directorio de descarga especificado no existe!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="426"/>
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
<translation>Por favor, asegúrate de que el directorio de descarga especificado existe, y de que tengas permisos para acceder a él.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="456"/>
<source>Invalid Title ID</source>
<translation>ID de título inválido</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="457"/>
<source>&lt;b&gt;The Title ID you have entered is not in a valid format!&lt;/b&gt;</source>
<translation>&lt;b&gt;¡El ID de título introducido no tiene un formato válido!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="462"/>
<source>&lt;b&gt;No title with the provided Title ID or version could be found!&lt;/b&gt;</source>
<translation>&lt;b&gt;¡No se encontró un título que coincida con el ID de título y/o versión proporcionados!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="467"/>
<source>&lt;b&gt;Content decryption was not successful! Decrypted contents could not be created.&lt;/b&gt;</source>
<translation>&lt;b&gt;¡El desencriptado de contenidos falló! No se han podido crear los contenidos desencriptados.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="474"/>
<source>&lt;b&gt;No Ticket is Available for the Requested Title!&lt;/b&gt;</source>
<translatorcomment>&quot;Ticket&quot; may be translated as &quot;billete&quot;, &quot;boleto&quot; or even &quot;tique&quot;, but it is preferable to use the English term here for consistency&apos;s sake.</translatorcomment>
<translation>&lt;b&gt;¡No existe un ticket disponible para el título solicitado!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="480"/>
<source>&lt;b&gt;An Unknown Error has Occurred!&lt;/b&gt;</source>
<translation>&lt;b&gt;¡Ha ocurrido un error desconocido!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="502"/>
<source>&lt;b&gt;Some issues occurred while running the download script.&lt;/b&gt;</source>
<translation>&lt;b&gt;Ocurrieron algunos problemas durante la ejecución del script de descarga.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="552"/>
<source>&lt;b&gt;An error occurred while parsing the script file!&lt;/b&gt;</source>
<translation>&lt;b&gt;¡Ocurrió un error mientras se analizaba el archivo de script!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="563"/>
<source>&lt;b&gt;An error occurred while parsing Title IDs!&lt;/b&gt;</source>
<translation>&lt;b&gt;¡Ocurrió un error mientras se analizaban los IDs de títulos!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="459"/>
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
<translation>Los IDs de títulos tienen que ser cadenas alfanuméricas de 16 dígitos. Por favor, introduce un ID de título con el formato apropiado, o selecciona uno desde el menú a la izquierda.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="119"/>
<source>Select a title from the list on the left, or enter a Title ID to begin.
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
By default, titles will be downloaded to a folder named &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translatorcomment>&quot;Ticket&quot; may be translated as &quot;billete&quot;, &quot;boleto&quot; or even &quot;tique&quot;, but it is preferable to use the English term here for consistency&apos;s sake.</translatorcomment>
<translation>Selecciona un título desde la lista a la izquierda, o introduce un ID de título para empezar.
Los títulos con una marca de verificación son gratuitos, tienen un ticket disponible y pueden ser desencriptados y/o empaquetados a un WAD o TAD. Los títulos con una &quot;X&quot; no cuentan con un ticket, y sólo pueden guardarse sus contenidos encriptados.
Por defecto, los títulos serán descargados a una carpeta llamada &quot;NUSGet Downloads&quot; dentro de tu directorio de descargas.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="224"/>
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
<translation>Usar NUS de Wii U (más rápido, sólo afecta a Wii/vWii)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="306"/>
<source>&lt;b&gt;There&apos;s a newer version of NUSGet available!&lt;/b&gt;</source>
<translation>&lt;b&gt;¡Hay una nueva versión de NUSGet disponible!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="461"/>
<source>Title ID/Version Not Found</source>
<translation>ID de título / versión no disponible</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="464"/>
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
<translation>Por favor, asegúrate de haber introducido un ID de título válido o de seleccionar uno de la base de datos de títulos, y que la versión proporcionada existe para el título que estás tratando de descargar.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="466"/>
<source>Content Decryption Failed</source>
<translation>El desencriptado de contenidos falló</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="470"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &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>
<translatorcomment>&quot;Ticket&quot; may be translated as &quot;billete&quot;, &quot;boleto&quot; or even &quot;tique&quot;, but it is preferable to use the English term here for consistency&apos;s sake.</translatorcomment>
<translation>Tu TMD o ticket puede estar dañado, o puede que no correspondan al contenido que está siendo desencriptado. Si marcaste la casilla &quot;Usar archivos locales, si existen&quot;, prueba con desactivar dicha opción antes de intentar nuevamente la descarga para corregir posibles problemas con los datos locales.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="473"/>
<source>Ticket Not Available</source>
<translatorcomment>&quot;Ticket&quot; may be translated as &quot;billete&quot;, &quot;boleto&quot; or even &quot;tique&quot;, but it is preferable to use the English term here for consistency&apos;s sake.</translatorcomment>
<translation>Ticket no disponible</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="477"/>
<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>
<translatorcomment>&quot;Ticket&quot; may be translated as &quot;billete&quot;, &quot;boleto&quot; or even &quot;tique&quot;, but it is preferable to use the English term here for consistency&apos;s sake.</translatorcomment>
<translation>No se pudo descargar un ticket para el título solicitado, pero has marcado la casilla &quot;Generar paquete de instalación&quot; o &quot;Crear contenidos desencriptados&quot;. Estas opciones no están disponibles para títulos sin un ticket. Sólo se han guardado los contenidos encriptados.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="479"/>
<source>Unknown Error</source>
<translation>Error desconocido</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="482"/>
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
<translation>Por favor, intenta de nuevo. Si el problema persiste, por favor abre un reporte de problema en GitHub detallando lo que intentabas hacer cuando ocurrió este error.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="501"/>
<source>Script Issues Occurred</source>
<translation>Ocurrieron problemas con el script</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="504"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation>Lee el registro para obtener más detalles sobre los problemas que se encontraron.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="511"/>
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
<translation>Los siguientes títulos no pudieron ser descargados debido a un error. Por favor, asegúrate de que el ID de título y la versión listados en el script son válidos.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="521"/>
<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>Marcaste la casilla &quot;Crear contenidos desencriptados&quot; o &quot;Generar paquete de instalación&quot;, pero los siguientes títulos del script no tienen un ticket disponible. Si se marcó su opción, los contenidos encriptados fueron descargados de todas maneras.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="540"/>
<source>Script Download Failed</source>
<translation>La descarga del script falló</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="541"/>
<source>Open NUS Script</source>
<translation>Abrir script de NUS</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="542"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>Scripts de NUS (*.nus, *.json)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="554"/>
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
<translation>Error encontrado en la línea {lineno}, columna {colno}. Por favor, verifica el script e intenta nuevamente.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="565"/>
<source>The title at index {index} does not have a Title ID!</source>
<translation>¡El título con índice {index} no tiene un ID de título!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="618"/>
<source>Open Directory</source>
<translation>Abrir directorio</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="629"/>
<source>&lt;b&gt;The specified download directory does not exist!&lt;/b&gt;</source>
<translation>&lt;b&gt;¡El directorio de descarga especificado no existe!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="632"/>
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
<translation>Por favor, asegúrate de que el directorio de descarga especificado existe, y de que tengas permisos para acceder a él.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="661"/>
<location filename="../../NUSGet.py" line="671"/>
<source>Restart Required</source>
<translation>Reinicio requerido</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="662"/>
<source>NUSGet must be restarted for the selected language to take effect.</source>
<translation>NUSGet tiene que reiniciarse para aplicar el idioma seleccionado.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="672"/>
<source>NUSGet must be restarted for the selected theme to take effect.</source>
<translation>NUSGet tiene que reiniciarse para aplicar el tema seleccionado.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="74"/>
<source>
Could not check for updates.</source>
<translation>
No se pudo buscar actualizaciones.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="84"/>
<source>
There&apos;s a newer version of NUSGet available!</source>
<translation>
¡Hay una nueva versión de NUSGet disponible!</translation>
</message>
<message>
<location filename="../../modules/core.py" line="86"/>
<source>
You&apos;re running the latest release of NUSGet.</source>
<translation>
Estás usando el lanzamiento más reciente de NUSGet.</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,583 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="fr_FR">
<context>
<name>AboutNUSGet</name>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
<source>About NUSGet</source>
<translation>À propos de NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
<source>NUSGet</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
<source>Version {nusget_version}</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
<source>Using libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</source>
<translation>Utilise libWiiPy {libwiipy_version} et libTWLPy {libtwlpy_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
<source>© 2024-2025 NinjaCheetah &amp; Contributors</source>
<translatorcomment>In French, we need to translate both genders for Contributors, just because.</translatorcomment>
<translation>© 2024-2025 NinjaCheetah, contributeurs et contributrices</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
<source>View Project on GitHub</source>
<translation>Voir le projet sur GitHub</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
<source>Translations</source>
<translation>Traductions</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
<source>French (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</source>
<translation>Français: &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
<source>German (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</source>
<translation>Allemand (Deutsch) : &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
<source>Italian (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</source>
<translation>Italien (Italiano) : &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
<source>Korean (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</source>
<translation>Coréen () : &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
<source>Norwegian (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</source>
<translation>Norvégien (Norsk) : &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
<source>Romanian (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</source>
<translation>Roumain (Română) : &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
<source>Spanish (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</source>
<translation>Espagnol (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<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 Downloads&quot; inside your downloads folder.</source>
<translation type="vanished">NUSGet v{nusget_version}
Développé par NinjaCheetah
Alimenté par libWiiPy {libwiipy_version}
Support DSi fourni par libTWLPy {libtwlpy_version}
Choisissez un titre depuis la liste à gauche, ou saisissez un ID de titre pour commencer.
Les titres marqués d&apos;une coche sont gratuits et ont un billet disponible, et peuvent être décryptés et/ou empaquetés dans un fichier WAD ou TAD. Les titres marqués d&apos;une croix n&apos;ont pas de billets, et seul leur contenu crypté peut être enregistré.
Les titres seront téléchargés dans un dossier &quot;NUSGet Downloads&quot;, à l&apos;intérieur de votre dossier de téléchargements.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="305"/>
<source>NUSGet Update Available</source>
<translation>Mise à jour NUSGet disponible</translation>
</message>
<message>
<source>There&apos;s a newer version of NUSGet available!</source>
<translation type="vanished">Une nouvelle version de NUSGet est disponible !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="119"/>
<source>Select a title from the list on the left, or enter a Title ID to begin.
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
By default, titles will be downloaded to a folder named &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation>Choisissez un titre depuis la liste à gauche, ou saisissez un ID de titre pour commencer.
Les titres marqués d&apos;une coche sont gratuits et ont un billet disponible, et peuvent être décryptés et/ou empaquetés dans un fichier WAD ou TAD. Les titres marqués d&apos;une croix n&apos;ont pas de billets, et seul leur contenu crypté peut être enregistré.
Les titres seront téléchargés dans un dossier &quot;NUSGet Downloads&quot;, à l&apos;intérieur de votre dossier de téléchargements.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="224"/>
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
<translation>Utiliser le NUS Wii U (plus rapide, n&apos;affecte que Wii / vWii)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="306"/>
<source>&lt;b&gt;There&apos;s a newer version of NUSGet available!&lt;/b&gt;</source>
<translation>&lt;b&gt;Une nouvelle version de NUSGet est disponible !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="407"/>
<source>No Output Selected</source>
<translation>Aucun format sélectionné</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="408"/>
<source>You have not selected any format to output the data in!</source>
<translation>Veuillez sélectionner un format de sortie pour les données !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="410"/>
<source>Please select at least one option for how you would like the download to be saved.</source>
<translation>Veuillez sélectionner au moins une option de téléchargement.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="422"/>
<location filename="../../NUSGet.py" line="628"/>
<source>Invalid Download Directory</source>
<translation>Dossier de téléchargement invalide</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="423"/>
<source>The specified download directory does not exist!</source>
<translation>Le dossier de téléchargement choisi n&apos;existe pas !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="426"/>
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
<translation>Assurez-vous que votre dossier de téléchargement existe, et que vous avez les droits suffisants pour y accéder.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="456"/>
<source>Invalid Title ID</source>
<translation>ID de titre invalide</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="457"/>
<source>&lt;b&gt;The Title ID you have entered is not in a valid format!&lt;/b&gt;</source>
<translation>&lt;b&gt;L&apos;ID de titre que vous avez saisi a un format invalide !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="462"/>
<source>&lt;b&gt;No title with the provided Title ID or version could be found!&lt;/b&gt;</source>
<translation>&lt;b&gt;Aucun titre trouvé pour l&apos;ID ou la version fourni !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="467"/>
<source>&lt;b&gt;Content decryption was not successful! Decrypted contents could not be created.&lt;/b&gt;</source>
<translation>&lt;b&gt;Le décryptage du contenu a échoué ! Le contenu décrypté ne peut être créé.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="474"/>
<source>&lt;b&gt;No Ticket is Available for the Requested Title!&lt;/b&gt;</source>
<translation>&lt;b&gt;Aucun billet disponible pour le titre demandé !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="480"/>
<source>&lt;b&gt;An Unknown Error has Occurred!&lt;/b&gt;</source>
<translation>&lt;b&gt;Une erreur inconnue est survenue !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="502"/>
<source>&lt;b&gt;Some issues occurred while running the download script.&lt;/b&gt;</source>
<translation>&lt;b&gt;Des erreurs sont survenues pendant l&apos;exécution du script de téléchargement.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="552"/>
<source>&lt;b&gt;An error occurred while parsing the script file!&lt;/b&gt;</source>
<translation>&lt;b&gt;Une erreur est survenue pendant la lecture du script !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="563"/>
<source>&lt;b&gt;An error occurred while parsing Title IDs!&lt;/b&gt;</source>
<translation>&lt;b&gt;Une erreur est survenue à la lecture d&apos;un ID de titre !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="661"/>
<location filename="../../NUSGet.py" line="671"/>
<source>Restart Required</source>
<translation>Redémarrage requis</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="662"/>
<source>NUSGet must be restarted for the selected language to take effect.</source>
<translation>NUSGet doit redémarrer pour appliquer la langue choisie.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="672"/>
<source>NUSGet must be restarted for the selected theme to take effect.</source>
<translation>NUSGet doit redémarrer pour appliquer le thème choisi.</translation>
</message>
<message>
<source>The Title ID you have entered is not in a valid format!</source>
<translation type="vanished">L&apos;ID de titre que vous avez saisi a un format invalide !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="459"/>
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
<translation>Les ID de titre doivent être composés de 16 caractères alphanumériques. Veuillez saisir un ID formaté correctement, ou sélectionnez-en un depuis le menu de gauche.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="461"/>
<source>Title ID/Version Not Found</source>
<translation>ID de titre / Version introuvable</translation>
</message>
<message>
<source>No title with the provided Title ID or version could be found!</source>
<translation type="vanished">Aucun titre trouvé pour l&apos;ID ou la version fourni !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="464"/>
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
<translation>Veuillez vous assurez que vous avez saisi un ID valide, ou sélectionnez-en un depuis la base de données, et que la version fournie existe pour le titre que vous souhaitez télécharger.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="466"/>
<source>Content Decryption Failed</source>
<translation>Échec du décryptage</translation>
</message>
<message>
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
<translation type="vanished">Le décryptage du contenu a échoué ! Le contenu décrypté ne peut être créé.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="470"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &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>Vos métadonnées (TMD) ou le billet sont probablement endommagés, ou ils ne correspondent pas au contenu décrypté. Si vous avez coché &quot;Utiliser des fichiers locaux, s&apos;ils existent&quot;, essayez de désactiver cette option avant d&apos;essayer à nouveau pour résoudre les éventuelles erreurs avec les données locales.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="473"/>
<source>Ticket Not Available</source>
<translation>Billet indisponible</translation>
</message>
<message>
<source>No Ticket is Available for the Requested Title!</source>
<translation type="vanished">Aucun billet disponible pour le titre demandé !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="477"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &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>Un billet ne peut être téléchargé pour le titre demandé, mais vous avez sélectionné &quot;Empaqueter une archive d&apos;installation&quot; ou &quot;Décrypter le contenu&quot;. Ces options sont indisponibles pour les titres sans billet. Seul le contenu crypté a é enregistré.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="479"/>
<source>Unknown Error</source>
<translation>Erreur inconnue</translation>
</message>
<message>
<source>An Unknown Error has Occurred!</source>
<translation type="vanished">Une erreur inconnue est survenue !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="482"/>
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
<translation>Veuillez essayer à nouveau. Si le problème persiste, déclarez un problème sur GitHub en décrivant les actions qui ont provoqué l&apos;erreur.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="501"/>
<source>Script Issues Occurred</source>
<translation>Erreurs survenues dans le script</translation>
</message>
<message>
<source>Some issues occurred while running the download script.</source>
<translation type="vanished">Des erreurs sont survenues pendant l&apos;exécution du script de téléchargement.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="504"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation>Vérifiez le journal pour plus de détails à propos des erreurs rencontrées.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="511"/>
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
<translation>Le téléchargement des titres suivants a échoué. Assurez-vous que les ID de titre et version du script soient valides.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="521"/>
<source>You enabled &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>Vous avez activé &quot;Décrypter le contenu&quot; ou &quot;Empaqueter une archive d&apos;installation&quot;, mais les billets des titres suivants sont indisponibles. Si activé(s), le contenu crypté a é téléchargé.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="540"/>
<source>Script Download Failed</source>
<translation>Échec du script de téléchargement</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="541"/>
<source>Open NUS Script</source>
<translation>Ouvrir un script NUS</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="542"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>Scripts NUS (*.nus *.json)</translation>
</message>
<message>
<source>An error occurred while parsing the script file!</source>
<translation type="vanished">Une erreur est survenue pendant la lecture du script !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="554"/>
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
<translation>Erreur recontrée ligne {lineno}, colonne {colno}. Vérifiez le script et réessayez.</translation>
</message>
<message>
<source>An error occurred while parsing Title IDs!</source>
<translation type="vanished">Une erreur est survenue à la lecture d&apos;un ID de titre !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="565"/>
<source>The title at index {index} does not have a Title ID!</source>
<translation>Le titre à l&apos;index {index} n&apos;a pas d&apos;ID !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="618"/>
<source>Open Directory</source>
<translation>Ouvrir un dossier</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="629"/>
<source>&lt;b&gt;The specified download directory does not exist!&lt;/b&gt;</source>
<translation>&lt;b&gt;Le dossier de téléchargement choisi n&apos;existe pas !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="632"/>
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
<translation>Assurez-vous que votre dossier de téléchargement existe, et que vous avez les droits suffisants pour y accéder.</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
<source>MainWindow</source>
<translation>FenetrePrincipale</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Search</source>
<translation>Rechercher</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
<source>Clear</source>
<translation>Effacer</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
<source>Wii</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
<source>vWii</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
<source>DSi</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
<source>Title ID</source>
<translation>ID du titre</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
<source>v</source>
<translation></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>Console :</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source>
<translation>Télécharger</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source>
<translation>Exécuter le script</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source>
<translation>Configuration</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
<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;.AppleSystemUIFont&apos;; font-size:13pt; 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></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
<source>Options</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
<source>Language</source>
<translation>Langue</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
<source>Theme</source>
<translation>Thème</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
<source>About NUSGet</source>
<translation>À propos de NUSGet</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
<source>System (Default)</source>
<translation>Système (par défaut)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
<source>Light</source>
<translation>Clair</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
<source>Dark</source>
<translation>Sombre</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="218"/>
<source>Pack installable archive (WAD/TAD)</source>
<translation>Empaqueter une archive d&apos;installation (WAD / TAD)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
<source>File Name</source>
<translation>Nom du fichier</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="220"/>
<source>Keep encrypted contents</source>
<translation>Conserver le contenu crypté</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="222"/>
<source>Create decrypted contents (*.app)</source>
<translation>Décrypter le contenu (*.app)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="223"/>
<source>Use local files, if they exist</source>
<translation>Utiliser des fichiers locaux, s&apos;ils existent</translation>
</message>
<message>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
<translation type="vanished">Utiliser le NUS Wii U (plus rapide, n&apos;affecte que Wii / vWii)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="226"/>
<source>Apply patches to IOS (Applies to WADs only)</source>
<translation>Appliquer des modifications aux IOS (WAD uniquement)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
<source>vWii Title Settings</source>
<translation>Titres vWii</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="227"/>
<source>Re-encrypt title using the Wii Common Key</source>
<translation>Encrypter le titre avec la clé commune Wii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
<source>App Settings</source>
<translation>Paramètres</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="228"/>
<source>Check for updates on startup</source>
<translation>Vérifier les mises à jour au démarrage</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="229"/>
<source>Use a custom download directory</source>
<translation>Utiliser un dossier de téléchargement différent</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
<source>Select...</source>
<translation>Choisir</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
<source>Help</source>
<translation>Aide</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
<source>About Qt</source>
<translation>À propos de Qt</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
<source>Output Path</source>
<translation>Dossier de téléchargement</translation>
</message>
<message>
<location filename="../../modules/core.py" line="74"/>
<source>
Could not check for updates.</source>
<translation>
Impossible de vérifier les mises à jour.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="84"/>
<source>
There&apos;s a newer version of NUSGet available!</source>
<translation>
Une nouvelle version de NUSGet est disponible !</translation>
</message>
<message>
<location filename="../../modules/core.py" line="86"/>
<source>
You&apos;re running the latest release of NUSGet.</source>
<translation>
Vous utilisez la dernière version de NUSGet.</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,656 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="it_IT">
<context>
<name>AboutNUSGet</name>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
<source>About NUSGet</source>
<translation>Info su NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
<source>NUSGet</source>
<translation>NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
<source>Version {nusget_version}</source>
<translation>Versione {nusget_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
<source>Using libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</source>
<translation>Versione libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
<source>© 2024-2025 NinjaCheetah &amp; Contributors</source>
<translation>© 2024-2025 NinjaCheetah &amp; Contributori</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
<source>View Project on GitHub</source>
<translation>Vedi il progetto su GitHub</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
<source>Translations</source>
<translation>Traduzioni</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
<source>French (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</source>
<translation>Francese (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
<source>German (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</source>
<translation>Tedesco (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
<source>Italian (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</source>
<translation>Italiano: &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
<source>Korean (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</source>
<translation>Coreano (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
<source>Norwegian (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</source>
<translation>Norvegese (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
<source>Romanian (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</source>
<translation>Rumeno (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
<source>Spanish (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</source>
<translation>Spagnolo (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
<source>MainWindow</source>
<translation>Finestra principale</translation>
</message>
<message>
<source>Available Titles</source>
<translation type="vanished">Titoli disponibili</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Search</source>
<translation>Cerca</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
<source>Clear</source>
<translation>Pulisci</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
<source>Wii</source>
<translation>Wii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="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 Titolo</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>Versione</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source>
<translation>Console:</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source>
<translation>Avvia download</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source>
<translation>Avvia Script</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source>
<translation>Impostazioni generali</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
<source>Options</source>
<translation>Opzioni</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
<source>Language</source>
<translation>Lingua</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
<source>Theme</source>
<translation>Tema</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
<source>About NUSGet</source>
<translation>Info su NUSGet</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
<source>System (Default)</source>
<translation>Sistema (Default)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
<source>Light</source>
<translation>Chiaro</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
<source>Dark</source>
<translation>Scuro</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="218"/>
<source>Pack installable archive (WAD/TAD)</source>
<translation>Archivio installabile (WAD/TAD)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
<source>File Name</source>
<translation>Nome del file</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="220"/>
<source>Keep encrypted contents</source>
<translation>Mantieni contenuti criptati</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="222"/>
<source>Create decrypted contents (*.app)</source>
<translation>Crea contenuto decriptato (*.app)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="223"/>
<source>Use local files, if they exist</source>
<translation>Usa file locali, se esistenti</translation>
</message>
<message>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
<translation type="vanished">Usa il NUS di Wii U (più veloce, riguarda solo Wii/vWii)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
<source>vWii Title Settings</source>
<translation>Impostazioni titoli vWii</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="227"/>
<source>Re-encrypt title using the Wii Common Key</source>
<translation>Cripta titolo usando la Chiave Comune Wii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
<source>App Settings</source>
<translation>Impostazioni app</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="228"/>
<source>Check for updates on startup</source>
<translation>Controlla aggiornamenti all&apos;avvio</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="229"/>
<source>Use a custom download directory</source>
<translation>Usa una cartella di download personalizzata</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
<source>Select...</source>
<translation>Seleziona...</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
<source>&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;.AppleSystemUIFont&apos;; font-size:13pt; 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;.AppleSystemUIFont&apos;; font-size:13pt; 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>
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
<source>Help</source>
<translation>Aiuto</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
<source>About Qt</source>
<translation>Info su Qt</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
<source>Output Path</source>
<translation>Cartella output</translation>
</message>
<message>
<source>&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 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;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>
<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 type="vanished">NUSGet v{nusget_version}
Sviluppato da NinjaCheetah
Funzionante con libWiiPy {libwiipy_version}
DSi support provided by libTWLPy {libtwlpy_version}
Scegli un tittolo dalla lista a sinistra o inserisci un ID Titolo per iniziare.
I titoli marcati da una spunta sono disponibili e hanno un ticket libero, e possono essere decriptati/scaricati come WAD o TAD. I titoli con una X non hanno un ticket e solo il contenuto criptato può essere salvato.
I titoli verranno scaricati nella cartella &quot;NUSGet Downloads&quot; all&apos;interno della cartella Download.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="119"/>
<source>Select a title from the list on the left, or enter a Title ID to begin.
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
By default, titles will be downloaded to a folder named &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation>Scegli un titolo dalla lista a sinistra o inserisci un ID Titolo per iniziare.
I titoli marcati da una spunta sono disponibili e hanno un ticket libero, e possono essere decriptati e/o convertiti in WAD o TAD. I titoli con una X non hanno un ticket e solo il contenuto criptato può essere salvato.
Per impostazione predefinita, i titoli verranno scaricati nella cartella &quot;NUSGet Downloads&quot; all&apos;interno della cartella Download.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="224"/>
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
<translation>Usa il NUS di Wii U (più veloce, influisce solo su Wii/vWii)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="306"/>
<source>&lt;b&gt;There&apos;s a newer version of NUSGet available!&lt;/b&gt;</source>
<translation>&lt;b&gt;È disponibile una nuova versione di NUSGet!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="407"/>
<source>No Output Selected</source>
<translation>Nessun output selezionato</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="408"/>
<source>You have not selected any format to output the data in!</source>
<translation>Non hai selezionato alcun formato in cui esportare i dati!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="410"/>
<source>Please select at least one option for how you would like the download to be saved.</source>
<translation>Per favore scegli almeno un opzione per come vorresti che fosse salvato il download.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="422"/>
<location filename="../../NUSGet.py" line="628"/>
<source>Invalid Download Directory</source>
<translation>Cartella di download non valida</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="423"/>
<source>The specified download directory does not exist!</source>
<translation>La cartella di download specificata non esiste!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="426"/>
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
<translation>Assicurati che la cartella di download specificata esista e che tu abbia i permessi per accedervi.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="456"/>
<source>Invalid Title ID</source>
<translation>ID Titolo invalido</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="457"/>
<source>&lt;b&gt;The Title ID you have entered is not in a valid format!&lt;/b&gt;</source>
<translation>&lt;b&gt;L&apos;ID Titolo che hai inserito non è in un formato valido!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="459"/>
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
<translation>Gli ID del titolo devono essere costituiti da stringhe di 16 cifre di numeri e lettere. Inserire un ID titolo formattato correttamente o selezionarne uno dal menu a sinistra.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="462"/>
<source>&lt;b&gt;No title with the provided Title ID or version could be found!&lt;/b&gt;</source>
<translation>&lt;b&gt;Non è stato trovato alcun titolo con l&apos;ID Titolo o la versione forniti!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="467"/>
<source>&lt;b&gt;Content decryption was not successful! Decrypted contents could not be created.&lt;/b&gt;</source>
<translation>&lt;b&gt;La decriptazione dei contenuti non è riuscita! Non è stato possibile creare i contenuti decriptati.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="474"/>
<source>&lt;b&gt;No Ticket is Available for the Requested Title!&lt;/b&gt;</source>
<translation>&lt;b&gt;Nessun ticket disponibile per il titolo richiesto!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="480"/>
<source>&lt;b&gt;An Unknown Error has Occurred!&lt;/b&gt;</source>
<translation>&lt;b&gt;Si è verificato un errore sconosciuto!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="502"/>
<source>&lt;b&gt;Some issues occurred while running the download script.&lt;/b&gt;</source>
<translation>&lt;b&gt;Si sono verificati alcuni problemi durante l&apos;esecuzione dello script di download.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="552"/>
<source>&lt;b&gt;An error occurred while parsing the script file!&lt;/b&gt;</source>
<translation>&lt;b&gt;Si è verificato un errore durante l&apos;analisi del file script!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="563"/>
<source>&lt;b&gt;An error occurred while parsing Title IDs!&lt;/b&gt;</source>
<translation>&lt;b&gt;Si è verificato un errore durante l&apos;analisi degli ID Titolo!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="661"/>
<location filename="../../NUSGet.py" line="671"/>
<source>Restart Required</source>
<translation>Riavvio necessario</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="662"/>
<source>NUSGet must be restarted for the selected language to take effect.</source>
<translation>NUSGet ha bisogno di essere riavviato per poter cambiare la lingua.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="672"/>
<source>NUSGet must be restarted for the selected theme to take effect.</source>
<translation>NUSGet ha bisogno di essere riavviato per poter cambiare il tema.</translation>
</message>
<message>
<source>The Title ID you have entered is not in a valid format!</source>
<translation type="vanished">L&apos; ID Titolo che hai inserito non è in un formato valido!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="461"/>
<source>Title ID/Version Not Found</source>
<translation>ID Titolo/Versione non trovata</translation>
</message>
<message>
<source>No title with the provided Title ID or version could be found!</source>
<translation type="vanished">Non è stato trovato nessun titolo con l&apos; ID Titolo o versione data!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="464"/>
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
<translation>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>
<location filename="../../NUSGet.py" line="466"/>
<source>Content Decryption Failed</source>
<translation>Decriptazione contenuti fallita</translation>
</message>
<message>
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
<translation type="vanished">La decriptazione dei contenuti non è andata a buon fine! I contenuti decriptadi non sono stati creati.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="470"/>
<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>
</message>
<message>
<location filename="../../NUSGet.py" line="473"/>
<source>Ticket Not Available</source>
<translation>Ticket non disponibile</translation>
</message>
<message>
<source>No Ticket is Available for the Requested Title!</source>
<translation type="vanished">Nessun ticket disponibile per il titolo richiesto!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="477"/>
<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>
</message>
<message>
<location filename="../../NUSGet.py" line="479"/>
<source>Unknown Error</source>
<translation>Errore sconosciuto</translation>
</message>
<message>
<source>An Unknown Error has Occurred!</source>
<translation type="vanished">Errore sconosciuto!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="482"/>
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
<translation>Per favore riprova. Se il problema persiste, apri un issue su GitHub specificando in modo dettagliato cosa volevi fare quando è comparso questo errore.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="501"/>
<source>Script Issues Occurred</source>
<translation>Errore script</translation>
</message>
<message>
<source>Some issues occurred while running the download script.</source>
<translation type="vanished">Ci sono stati degli errori con lo script di download.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="504"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation>Guarda i log per più dettagli sull&apos;errore.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="511"/>
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
<translation>I seguenti titoli non sono stati scaricati a causa di un errore. Controlla che l&apos;ID Titolo e la versione nello script siano validi.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="521"/>
<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>Hai abilitato &quot;Crea contenuto decriptato&quot; o &quot;Archivio installabile&quot;, ma i seguenti titoli nello script non hanno ticket disponibili. Se abilitati, i contenuti criptati sono stati comunque scaricati.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="540"/>
<source>Script Download Failed</source>
<translation>Download script fallito</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="541"/>
<source>Open NUS Script</source>
<translation>Apri script NUS</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="542"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>Scrpit NUS (*.nus *.txt)</translation>
</message>
<message>
<source>An error occurred while parsing the script file!</source>
<translation type="vanished">Ci sono stati degli errori con lo script di download!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="554"/>
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
<translation>Errore riscontrato alla riga {lineno}, colonna {colno}. Controlla nuovamente lo script e riprova.</translation>
</message>
<message>
<source>An error occurred while parsing Title IDs!</source>
<translation type="vanished">Ci sono stati degli errori con GLI id tITOLO!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="565"/>
<source>The title at index {index} does not have a Title ID!</source>
<translation>Il titolo all&apos;indice {index} non ha un ID Titolo!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="618"/>
<source>Open Directory</source>
<translation>Apri cartella</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="629"/>
<source>&lt;b&gt;The specified download directory does not exist!&lt;/b&gt;</source>
<translation>&lt;b&gt;La cartella di download specificata non esiste!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="632"/>
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
<translation>Assicurati che la cartella di download che desideri utilizzare esista e che tu abbia i permessi per accedervi.</translation>
</message>
<message>
<source>Open NUS script</source>
<translation type="vanished">Apri script NUS</translation>
</message>
<message>
<source>NUS Scripts (*.nus *.txt)</source>
<translation type="vanished">Scrpit NUS (*.nus *.txt)</translation>
</message>
<message>
<source>Script Failure</source>
<translation type="vanished">Errore script</translation>
</message>
<message>
<source>Failed to open the script.</source>
<translation type="vanished">Impossibile aprire lo script.</translation>
</message>
<message>
<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}
Sviluppato da NinjaCheetah
Funzionante con libWiiPy {libwiipy_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&quot; all&apos;interno della cartella Download.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="226"/>
<source>Apply patches to IOS (Applies to WADs only)</source>
<translation>Applica patch agli IOS (Solo per le WAD)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="305"/>
<source>NUSGet Update Available</source>
<translation>Aggiornamento di NUSGet disponibile</translation>
</message>
<message>
<source>There&apos;s a newer version of NUSGet available!</source>
<translation type="vanished">Una nuova versione di NUSGet è disponibile!</translation>
</message>
<message>
<location filename="../../modules/core.py" line="74"/>
<source>
Could not check for updates.</source>
<translation>Impossibile trovare eventuali aggiornamenti.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="84"/>
<source>
There&apos;s a newer version of NUSGet available!</source>
<translation>Una nuova versione di NUSGet è disponibile!</translation>
</message>
<message>
<location filename="../../modules/core.py" line="86"/>
<source>
You&apos;re running the latest release of NUSGet.</source>
<translation>
Stai utilizzando l&apos;ultima versione di NUSGet.</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,658 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ko_KR">
<context>
<name>AboutNUSGet</name>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
<source>About NUSGet</source>
<translation>NUSGet </translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
<source>NUSGet</source>
<translation>NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
<source>Version {nusget_version}</source>
<translation> {nusget_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
<source>Using libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</source>
<translation>libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version} </translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
<source>© 2024-2025 NinjaCheetah &amp; Contributors</source>
<translation>© 2024-2025 NinjaCheetah &amp; </translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
<source>View Project on GitHub</source>
<translation>GitHub에서 </translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
<source>Translations</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
<source>French (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</source>
<translation> (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
<source>German (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</source>
<translation> (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
<source>Italian (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</source>
<translation> (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
<source>Korean (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</source>
<translation>: &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
<source>Norwegian (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</source>
<translation> (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
<source>Romanian (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</source>
<translation> (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
<source>Spanish (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</source>
<translation> (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
<source>MainWindow</source>
<translation> </translation>
</message>
<message>
<source>Available Titles</source>
<translation type="vanished"> </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Search</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
<source>Clear</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
<source>Wii</source>
<translation>Wii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
<source>vWii</source>
<translation>vWii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
<source>DSi</source>
<translation>DSi</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
<source>Title ID</source>
<translation> ID</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
<source>v</source>
<translation>v</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="155"/>
<source>Version</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source>
<translation>:</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source>
<translation> </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source>
<translation> </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source>
<translation> </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
<source>Options</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
<source>Language</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
<source>Theme</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
<source>About NUSGet</source>
<translation>NUSGet </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
<source>System (Default)</source>
<translation> ()</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
<source>Light</source>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
<source>Dark</source>
<translation></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="218"/>
<source>Pack installable archive (WAD/TAD)</source>
<translation> (WAD/TAD) </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
<source>File Name</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="220"/>
<source>Keep encrypted contents</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="222"/>
<source>Create decrypted contents (*.app)</source>
<translation> (*.app) </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="223"/>
<source>Use local files, if they exist</source>
<translation> </translation>
</message>
<message>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
<translation type="vanished">Wii U NUS ( Wii/vWii에만 )</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
<source>vWii Title Settings</source>
<translation>vWii </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="227"/>
<source>Re-encrypt title using the Wii Common Key</source>
<translation>Wii </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
<source>App Settings</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="228"/>
<source>Check for updates on startup</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="229"/>
<source>Use a custom download directory</source>
<translation> </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
<source>Select...</source>
<translation>...</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
<source>&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;.AppleSystemUIFont&apos;; font-size:13pt; 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></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
<source>Help</source>
<translation></translation>
</message>
<message>
<source>About</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
<source>About Qt</source>
<translation>Qt </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
<source>Output Path</source>
<translation> </translation>
</message>
<message>
<source>&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 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;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>
<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 type="vanished">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="119"/>
<source>Select a title from the list on the left, or enter a Title ID to begin.
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
By default, titles will be downloaded to a folder named &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation> ID를 .
. WAD TAD에 . X .
&quot;NUSBet Downloads&quot; .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="224"/>
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
<translation>Wii U NUS ( Wii/vWii에만 )</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="306"/>
<source>&lt;b&gt;There&apos;s a newer version of NUSGet available!&lt;/b&gt;</source>
<translation>&lt;b&gt;NUSGet의 !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="407"/>
<source>No Output Selected</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="408"/>
<source>You have not selected any format to output the data in!</source>
<translation> !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="410"/>
<source>Please select at least one option for how you would like the download to be saved.</source>
<translation> .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="422"/>
<location filename="../../NUSGet.py" line="628"/>
<source>Invalid Download Directory</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="423"/>
<source>The specified download directory does not exist!</source>
<translation> !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="426"/>
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
<translation> , .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="456"/>
<source>Invalid Title ID</source>
<translation> ID</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="457"/>
<source>&lt;b&gt;The Title ID you have entered is not in a valid format!&lt;/b&gt;</source>
<translation>&lt;b&gt; ID의 !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="462"/>
<source>&lt;b&gt;No title with the provided Title ID or version could be found!&lt;/b&gt;</source>
<translation>&lt;b&gt; ID !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="467"/>
<source>&lt;b&gt;Content decryption was not successful! Decrypted contents could not be created.&lt;/b&gt;</source>
<translation>&lt;b&gt; ! .&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="474"/>
<source>&lt;b&gt;No Ticket is Available for the Requested Title!&lt;/b&gt;</source>
<translation>&lt;b&gt; !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="480"/>
<source>&lt;b&gt;An Unknown Error has Occurred!&lt;/b&gt;</source>
<translation>&lt;b&gt; !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="502"/>
<source>&lt;b&gt;Some issues occurred while running the download script.&lt;/b&gt;</source>
<translation>&lt;b&gt; .&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="552"/>
<source>&lt;b&gt;An error occurred while parsing the script file!&lt;/b&gt;</source>
<translation>&lt;b&gt; !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="563"/>
<source>&lt;b&gt;An error occurred while parsing Title IDs!&lt;/b&gt;</source>
<translation>&lt;b&gt; ID를 !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="661"/>
<location filename="../../NUSGet.py" line="671"/>
<source>Restart Required</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="662"/>
<source>NUSGet must be restarted for the selected language to take effect.</source>
<translation> NUSGet을 .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="672"/>
<source>NUSGet must be restarted for the selected theme to take effect.</source>
<translation> NUSGet을 .</translation>
</message>
<message>
<source>The Title ID you have entered is not in a valid format!</source>
<translation type="vanished"> ID의 !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="459"/>
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
<translation> ID는 16 . ID를 .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="461"/>
<source>Title ID/Version Not Found</source>
<translation> ID/ </translation>
</message>
<message>
<source>No title with the provided Title ID or version could be found!</source>
<translation type="vanished"> ID !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="464"/>
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
<translation> ID를 , .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="466"/>
<source>Content Decryption Failed</source>
<translation> </translation>
</message>
<message>
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
<translation type="vanished"> ! .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="470"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &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="473"/>
<source>Ticket Not Available</source>
<translation> </translation>
</message>
<message>
<source>No Ticket is Available for the Requested Title!</source>
<translation type="vanished"> !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="477"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &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="479"/>
<source>Unknown Error</source>
<translation> </translation>
</message>
<message>
<source>An Unknown Error has Occurred!</source>
<translation type="vanished"> !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="482"/>
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
<translation> . GitHub에서 .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="501"/>
<source>Script Issues Occurred</source>
<translation> </translation>
</message>
<message>
<source>Some issues occurred while running the download script.</source>
<translation type="vanished"> .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="504"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation> .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="511"/>
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
<translation> . ID와 .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="521"/>
<source>You enabled &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="540"/>
<source>Script Download Failed</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="541"/>
<source>Open NUS Script</source>
<translation>NUS </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="542"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>NUS (*.nus *.json)</translation>
</message>
<message>
<source>An error occurred while parsing the script file!</source>
<translation type="vanished"> !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="554"/>
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
<translation>{lineno} , {colno} . .</translation>
</message>
<message>
<source>An error occurred while parsing Title IDs!</source>
<translation type="vanished"> ID를 !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="565"/>
<source>The title at index {index} does not have a Title ID!</source>
<translation>{index} ID가 !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="618"/>
<source>Open Directory</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="629"/>
<source>&lt;b&gt;The specified download directory does not exist!&lt;/b&gt;</source>
<translation>&lt;b&gt; !&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="632"/>
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
<translation> , .</translation>
</message>
<message>
<source>Open NUS script</source>
<translation type="vanished">NUS </translation>
</message>
<message>
<source>NUS Scripts (*.nus *.txt)</source>
<translation type="vanished">NUS (*.nus *.txt)</translation>
</message>
<message>
<source>Script Failure</source>
<translation type="vanished"> </translation>
</message>
<message>
<source>Failed to open the script.</source>
<translation type="vanished"> .</translation>
</message>
<message>
<source>NUSGet v{nusget_version}
Developed by NinjaCheetah
Powered by libWiiPy {libwiipy_version}
DSi support provided by libTWLPy {libtwlpy_version}
Select a title from the list on the left, or enter a Title ID to begin.
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
Titles will be downloaded to a folder named &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="../../NUSGet.py" line="226"/>
<source>Apply patches to IOS (Applies to WADs only)</source>
<translation>IOS에 (WAD에만 )</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="305"/>
<source>NUSGet Update Available</source>
<translation>NUSGet </translation>
</message>
<message>
<source>There&apos;s a newer version of NUSGet available!</source>
<translation type="vanished">NUSBet의 !</translation>
</message>
<message>
<location filename="../../modules/core.py" line="74"/>
<source>
Could not check for updates.</source>
<translation>
.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="84"/>
<source>
There&apos;s a newer version of NUSGet available!</source>
<translation>
NUSBet의 !</translation>
</message>
<message>
<location filename="../../modules/core.py" line="86"/>
<source>
You&apos;re running the latest release of NUSGet.</source>
<translation>
NUSGet의 .</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,646 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="nb_NO">
<context>
<name>AboutNUSGet</name>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
<source>About NUSGet</source>
<translation>Om NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
<source>NUSGet</source>
<translation>NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
<source>Version {nusget_version}</source>
<translation>Versjon {nusget_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
<source>Using libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</source>
<translation>Bruker libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
<source>© 2024-2025 NinjaCheetah &amp; Contributors</source>
<translation>© 2024-2025 NinjaCheetah &amp; Contributors</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
<source>View Project on GitHub</source>
<translation>Se Prosjektet GitHub</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
<source>Translations</source>
<translation>Oversettelser</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
<source>French (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</source>
<translation>Fransk (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
<source>German (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</source>
<translation>Tysk (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
<source>Italian (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</source>
<translation>Italiensk (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
<source>Korean (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</source>
<translation>Koreansk (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
<source>Norwegian (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</source>
<translation>Norsk (Bokmål): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
<source>Romanian (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</source>
<translation>Rumensk (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
<source>Spanish (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</source>
<translation>Spansk (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
<source>MainWindow</source>
<translation>MainWindow</translation>
</message>
<message>
<source>Available Titles</source>
<translation type="vanished">Tilgjengelige Titler</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Search</source>
<translation>Søk</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
<source>Clear</source>
<translation>Klar</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
<source>Wii</source>
<translation>Wii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="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>Tittel 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>Versjon</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source>
<translation>Konsoll:</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source>
<translation>Start Nedlasting</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source>
<translation>Kjøre Skript</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source>
<translation>Generelle Instillinger</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
<source>Options</source>
<translation>Instillinger</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
<source>Language</source>
<translation>Språk</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
<source>Theme</source>
<translation>Tema</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
<source>About NUSGet</source>
<translation>Om NUSGet</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
<source>System (Default)</source>
<translation>System (Standard)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
<source>Light</source>
<translation>Lys</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
<source>Dark</source>
<translation>Mørk</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="218"/>
<source>Pack installable archive (WAD/TAD)</source>
<translation>Pakke installerbart arkiv (WAD/TAD)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
<source>File Name</source>
<translation>Filnavn</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="220"/>
<source>Keep encrypted contents</source>
<translation>Oppbevar kryptert innhold</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="222"/>
<source>Create decrypted contents (*.app)</source>
<translation>Opprette dekryptert innold (*.app)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="223"/>
<source>Use local files, if they exist</source>
<translation>Bruk lokale filer, hvis de finnes</translation>
</message>
<message>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
<translation type="vanished">Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
<source>vWii Title Settings</source>
<translation>vWii Tittelinstillinger</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="227"/>
<source>Re-encrypt title using the Wii Common Key</source>
<translation>Krypter tittelen nytt ved hjelp av Wii Common Key</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
<source>App Settings</source>
<translation>Appinstillinger</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="228"/>
<source>Check for updates on startup</source>
<translation>Sjekk for oppdateringer ved oppstart</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="229"/>
<source>Use a custom download directory</source>
<translation>Bruke en egendefinert nedlastingsmappe</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
<source>Select...</source>
<translation>Velg...</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
<source>&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;.AppleSystemUIFont&apos;; font-size:13pt; 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;.AppleSystemUIFont&apos;; font-size:13pt; 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>
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
<source>Help</source>
<translation>Hjelp</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
<source>About Qt</source>
<translation>Om Qt</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
<source>Output Path</source>
<translatorcomment>Utgangsbane</translatorcomment>
<translation></translation>
</message>
<message>
<source>&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 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;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>
<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}
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&quot; i nedlastingsmappen din.</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 Downloads&quot; inside your downloads folder.</source>
<translation type="vanished">NUSGet v{nusget_version}
Utviklet av NinjaCheetah
Drevet av libWiiPy {libwiipy_version}
DSi støtte levert av libTWLPy {libtwlpy_version}
Velg en tittel fra listen til venstre, eller skriv inn en Tittel ID for å begynne.
Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypteres og/eller pakkes inn i en WAD eller TAD. Titler med en X ikke har en billett, og bare det krypterte innholdet kan lagres.
Titler er lastes ned til en mappe med navnet &quot;NUSGet Downloads&quot; i nedlastingsmappen din.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="306"/>
<source>&lt;b&gt;There&apos;s a newer version of NUSGet available!&lt;/b&gt;</source>
<translation>&lt;b&gt;Det finnes en nyere versjon av NUSGet tilgjengelig!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="407"/>
<source>No Output Selected</source>
<translation>Ingen Utgang Valgt</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="408"/>
<source>You have not selected any format to output the data in!</source>
<translation>Du ikke har valgt noe format å lagre dataene i!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="410"/>
<source>Please select at least one option for how you would like the download to be saved.</source>
<translation>Velg minst ett valg for hvordan du vil at nedlastingen skal lagres.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="422"/>
<location filename="../../NUSGet.py" line="628"/>
<source>Invalid Download Directory</source>
<translation>Ugyldig Nedlastingsmappe</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="423"/>
<source>The specified download directory does not exist!</source>
<translation>Den angitte nedlastingsmappen finnes ikke!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="426"/>
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
<translation>Kontroller at den angitte nedlastingsmappen finnes, og at du har tillatelse fil å tilgang til den.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="456"/>
<source>Invalid Title ID</source>
<translation>Ugyldig Tittel ID</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="457"/>
<source>&lt;b&gt;The Title ID you have entered is not in a valid format!&lt;/b&gt;</source>
<translation>&lt;b&gt;Tittel IDen du har angitt er ikke i et gyldig format!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="462"/>
<source>&lt;b&gt;No title with the provided Title ID or version could be found!&lt;/b&gt;</source>
<translation>&lt;b&gt;Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="467"/>
<source>&lt;b&gt;Content decryption was not successful! Decrypted contents could not be created.&lt;/b&gt;</source>
<translation>&lt;b&gt;Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="474"/>
<source>&lt;b&gt;No Ticket is Available for the Requested Title!&lt;/b&gt;</source>
<translation>&lt;b&gt;Ingen billett er tilgjengelig for den forespurte tittelen!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="480"/>
<source>&lt;b&gt;An Unknown Error has Occurred!&lt;/b&gt;</source>
<translation>&lt;b&gt;En ukjent feil har oppstått!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="502"/>
<source>&lt;b&gt;Some issues occurred while running the download script.&lt;/b&gt;</source>
<translation>&lt;b&gt;Noen feil oppstod under kjøring av nedlastingsskriptet.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="552"/>
<source>&lt;b&gt;An error occurred while parsing the script file!&lt;/b&gt;</source>
<translation>&lt;b&gt;Det oppstod en feil under parsing av skriptfilen!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="563"/>
<source>&lt;b&gt;An error occurred while parsing Title IDs!&lt;/b&gt;</source>
<translation>&lt;b&gt;Det oppstod en feil under parsing av Tittel IDer!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="661"/>
<location filename="../../NUSGet.py" line="671"/>
<source>Restart Required</source>
<translation>Omstart Nødvendig</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="662"/>
<source>NUSGet must be restarted for the selected language to take effect.</source>
<translation>NUSGet startes nytt for at det valgte språket skal tre i kraft.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="672"/>
<source>NUSGet must be restarted for the selected theme to take effect.</source>
<translation>NUSGet startes nytt for at det valgte temaet skal tre i kraft.</translation>
</message>
<message>
<source>The Title ID you have entered is not in a valid format!</source>
<translation type="vanished">Tittel IDen du har angitt er ikke i et gyldig format!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="459"/>
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
<translation>Tittel IDer være 16-sifrede tall og bokstav strenger. Vennligst skriv inn en korrekt formatert Tittel ID, eller velg en fra menyen til venstre.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="461"/>
<source>Title ID/Version Not Found</source>
<translation>Tittel ID/Versjon Ikke Funnet</translation>
</message>
<message>
<source>No title with the provided Title ID or version could be found!</source>
<translation type="vanished">Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="464"/>
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
<translation>Sjekk at du har oppgitt en gyldig Tittel ID, eller valgt en fra titteldatabasen, og at den angitte versjonen finnes for tittelen du forsøker å laste ned.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="466"/>
<source>Content Decryption Failed</source>
<translation>Dekryptering av Innhold Mislyktes</translation>
</message>
<message>
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
<translation type="vanished">Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="470"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &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>
</message>
<message>
<location filename="../../NUSGet.py" line="473"/>
<source>Ticket Not Available</source>
<translation>Billett Ikke Tilgjengelig</translation>
</message>
<message>
<source>No Ticket is Available for the Requested Title!</source>
<translation type="vanished">Ingen billett er tilgjengelig for den forespurte tittelen!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="477"/>
<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>
</message>
<message>
<location filename="../../NUSGet.py" line="479"/>
<source>Unknown Error</source>
<translation>Ukjent Feil</translation>
</message>
<message>
<source>An Unknown Error has Occurred!</source>
<translation type="vanished">En ukjent feil har oppstått!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="482"/>
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
<translation>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="501"/>
<source>Script Issues Occurred</source>
<translation>Skriptfeil Oppstod</translation>
</message>
<message>
<source>Some issues occurred while running the download script.</source>
<translation type="vanished">Noen feil oppstod under kjøring av nedlastingsskriptet.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="504"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation>Sjekk loggen for mer informasjon om feilene som har oppstått.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="511"/>
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
<translation>Følgende titler kunne ikke lastes ned 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="521"/>
<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="540"/>
<source>Script Download Failed</source>
<translation>Skriptnedlasting Mislyktes</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="541"/>
<source>Open NUS Script</source>
<translation>Åpne NUS Skript</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="542"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>NUS Skript (*.nus *.json)</translation>
</message>
<message>
<source>An error occurred while parsing the script file!</source>
<translation type="vanished">Det oppstod en feil under parsing av skriptfilen!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="554"/>
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
<translation></translation>
</message>
<message>
<source>An error occurred while parsing Title IDs!</source>
<translation type="vanished">Det oppstod en feil under parsing av Tittel IDer!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="565"/>
<source>The title at index {index} does not have a Title ID!</source>
<translation>Tittelen ved indeks {index} har ikke en Tittel ID!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="618"/>
<source>Open Directory</source>
<translation>Åpen Mappe</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="629"/>
<source>&lt;b&gt;The specified download directory does not exist!&lt;/b&gt;</source>
<translation>&lt;b&gt;Den angitte nedlastingsmappen finnes ikke!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="632"/>
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
<translation>Kontroller at den angitte nedlastingsmappen finnes, og at du har tillatelse fil å tilgang til den.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="226"/>
<source>Apply patches to IOS (Applies to WADs only)</source>
<translation>Påfør patcher IOS (gjelder kun WADer)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="119"/>
<source>Select a title from the list on the left, or enter a Title ID to begin.
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
By default, titles will be downloaded to a folder named &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation>Velg en tittel fra listen til venstre, eller skriv inn en Tittel ID for å begynne.
Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypteres og/eller pakkes inn i en WAD eller TAD. Titler med en X ikke har en billett, og bare det krypterte innholdet kan lagres.
Som standard, lastes titler ned til en mappe med navnet &quot;NUSGet Downloads&quot; i nedlastingsmappen din.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="224"/>
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
<translation>Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="305"/>
<source>NUSGet Update Available</source>
<translation>NUSGet Oppdatering Tilgjengelig</translation>
</message>
<message>
<source>There&apos;s a newer version of NUSGet available!</source>
<translation type="vanished">Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
</message>
<message>
<location filename="../../modules/core.py" line="74"/>
<source>
Could not check for updates.</source>
<translation>
Kunne ikke sjekke for oppdateringer.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="84"/>
<source>
There&apos;s a newer version of NUSGet available!</source>
<translation>
Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
</message>
<message>
<location filename="../../modules/core.py" line="86"/>
<source>
You&apos;re running the latest release of NUSGet.</source>
<translation>
Du kjører den nyeste versjonen av NUSGet.</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,646 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="nb_NO">
<context>
<name>AboutNUSGet</name>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
<source>About NUSGet</source>
<translation>Om NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
<source>NUSGet</source>
<translation>NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
<source>Version {nusget_version}</source>
<translation>Versjon {nusget_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
<source>Using libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</source>
<translation>Bruker libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
<source>© 2024-2025 NinjaCheetah &amp; Contributors</source>
<translation>© 2024-2025 NinjaCheetah &amp; Contributors</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
<source>View Project on GitHub</source>
<translation>Se Prosjektet GitHub</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
<source>Translations</source>
<translation>Oversettelser</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
<source>French (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</source>
<translation>Fransk (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
<source>German (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</source>
<translation>Tysk (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
<source>Italian (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</source>
<translation>Italiensk (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
<source>Korean (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</source>
<translation>Koreansk (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
<source>Norwegian (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</source>
<translation>Norsk (Bokmål): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
<source>Romanian (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</source>
<translation>Rumensk (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
<source>Spanish (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</source>
<translation>Spansk (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
<source>MainWindow</source>
<translation>MainWindow</translation>
</message>
<message>
<source>Available Titles</source>
<translation type="vanished">Tilgjengelige Titler</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Search</source>
<translation>Søk</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
<source>Clear</source>
<translation>Klar</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
<source>Wii</source>
<translation>Wii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="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>Tittel 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>Versjon</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source>
<translation>Konsoll:</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source>
<translation>Start Nedlasting</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source>
<translation>Kjøre Skript</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source>
<translation>Generelle Instillinger</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
<source>Options</source>
<translation>Instillinger</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
<source>Language</source>
<translation>Språk</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
<source>Theme</source>
<translation>Tema</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
<source>About NUSGet</source>
<translation>Om NUSGet</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
<source>System (Default)</source>
<translation>System (Standard)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
<source>Light</source>
<translation>Lys</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
<source>Dark</source>
<translation>Mørk</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="218"/>
<source>Pack installable archive (WAD/TAD)</source>
<translation>Pakke installerbart arkiv (WAD/TAD)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
<source>File Name</source>
<translation>Filnavn</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="220"/>
<source>Keep encrypted contents</source>
<translation>Oppbevar kryptert innhold</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="222"/>
<source>Create decrypted contents (*.app)</source>
<translation>Opprette dekryptert innold (*.app)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="223"/>
<source>Use local files, if they exist</source>
<translation>Bruk lokale filer, hvis de finnes</translation>
</message>
<message>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
<translation type="vanished">Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
<source>vWii Title Settings</source>
<translation>vWii Tittelinstillinger</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="227"/>
<source>Re-encrypt title using the Wii Common Key</source>
<translation>Krypter tittelen nytt ved hjelp av Wii Common Key</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
<source>App Settings</source>
<translation>Appinstillinger</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="228"/>
<source>Check for updates on startup</source>
<translation>Sjekk for oppdateringer ved oppstart</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="229"/>
<source>Use a custom download directory</source>
<translation>Bruke en egendefinert nedlastingsmappe</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
<source>Select...</source>
<translation>Velg...</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
<source>&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;.AppleSystemUIFont&apos;; font-size:13pt; 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;.AppleSystemUIFont&apos;; font-size:13pt; 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>
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
<source>Help</source>
<translation>Hjelp</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
<source>About Qt</source>
<translation>Om Qt</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
<source>Output Path</source>
<translatorcomment>Utgangsbane</translatorcomment>
<translation></translation>
</message>
<message>
<source>&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 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;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>
<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}
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&quot; i nedlastingsmappen din.</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 Downloads&quot; inside your downloads folder.</source>
<translation type="vanished">NUSGet v{nusget_version}
Utviklet av NinjaCheetah
Drevet av libWiiPy {libwiipy_version}
DSi støtte levert av libTWLPy {libtwlpy_version}
Velg en tittel fra listen til venstre, eller skriv inn en Tittel ID for å begynne.
Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypteres og/eller pakkes inn i en WAD eller TAD. Titler med en X ikke har en billett, og bare det krypterte innholdet kan lagres.
Titler er lastes ned til en mappe med navnet &quot;NUSGet Downloads&quot; i nedlastingsmappen din.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="306"/>
<source>&lt;b&gt;There&apos;s a newer version of NUSGet available!&lt;/b&gt;</source>
<translation>&lt;b&gt;Det finnes en nyere versjon av NUSGet tilgjengelig!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="407"/>
<source>No Output Selected</source>
<translation>Ingen Utgang Valgt</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="408"/>
<source>You have not selected any format to output the data in!</source>
<translation>Du ikke har valgt noe format å lagre dataene i!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="410"/>
<source>Please select at least one option for how you would like the download to be saved.</source>
<translation>Velg minst ett valg for hvordan du vil at nedlastingen skal lagres.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="422"/>
<location filename="../../NUSGet.py" line="628"/>
<source>Invalid Download Directory</source>
<translation>Ugyldig Nedlastingsmappe</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="423"/>
<source>The specified download directory does not exist!</source>
<translation>Den angitte nedlastingsmappen finnes ikke!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="426"/>
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
<translation>Kontroller at den angitte nedlastingsmappen finnes, og at du har tillatelse fil å tilgang til den.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="456"/>
<source>Invalid Title ID</source>
<translation>Ugyldig Tittel ID</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="457"/>
<source>&lt;b&gt;The Title ID you have entered is not in a valid format!&lt;/b&gt;</source>
<translation>&lt;b&gt;Tittel IDen du har angitt er ikke i et gyldig format!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="462"/>
<source>&lt;b&gt;No title with the provided Title ID or version could be found!&lt;/b&gt;</source>
<translation>&lt;b&gt;Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="467"/>
<source>&lt;b&gt;Content decryption was not successful! Decrypted contents could not be created.&lt;/b&gt;</source>
<translation>&lt;b&gt;Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="474"/>
<source>&lt;b&gt;No Ticket is Available for the Requested Title!&lt;/b&gt;</source>
<translation>&lt;b&gt;Ingen billett er tilgjengelig for den forespurte tittelen!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="480"/>
<source>&lt;b&gt;An Unknown Error has Occurred!&lt;/b&gt;</source>
<translation>&lt;b&gt;En ukjent feil har oppstått!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="502"/>
<source>&lt;b&gt;Some issues occurred while running the download script.&lt;/b&gt;</source>
<translation>&lt;b&gt;Noen feil oppstod under kjøring av nedlastingsskriptet.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="552"/>
<source>&lt;b&gt;An error occurred while parsing the script file!&lt;/b&gt;</source>
<translation>&lt;b&gt;Det oppstod en feil under parsing av skriptfilen!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="563"/>
<source>&lt;b&gt;An error occurred while parsing Title IDs!&lt;/b&gt;</source>
<translation>&lt;b&gt;Det oppstod en feil under parsing av Tittel IDer!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="661"/>
<location filename="../../NUSGet.py" line="671"/>
<source>Restart Required</source>
<translation>Omstart Nødvendig</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="662"/>
<source>NUSGet must be restarted for the selected language to take effect.</source>
<translation>NUSGet startes nytt for at det valgte språket skal tre i kraft.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="672"/>
<source>NUSGet must be restarted for the selected theme to take effect.</source>
<translation>NUSGet startes nytt for at det valgte temaet skal tre i kraft.</translation>
</message>
<message>
<source>The Title ID you have entered is not in a valid format!</source>
<translation type="vanished">Tittel IDen du har angitt er ikke i et gyldig format!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="459"/>
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
<translation>Tittel IDer være 16-sifrede tall og bokstav strenger. Vennligst skriv inn en korrekt formatert Tittel ID, eller velg en fra menyen til venstre.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="461"/>
<source>Title ID/Version Not Found</source>
<translation>Tittel ID/Versjon Ikke Funnet</translation>
</message>
<message>
<source>No title with the provided Title ID or version could be found!</source>
<translation type="vanished">Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="464"/>
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
<translation>Sjekk at du har oppgitt en gyldig Tittel ID, eller valgt en fra titteldatabasen, og at den angitte versjonen finnes for tittelen du forsøker å laste ned.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="466"/>
<source>Content Decryption Failed</source>
<translation>Dekryptering av Innhold Mislyktes</translation>
</message>
<message>
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
<translation type="vanished">Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="470"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &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>
</message>
<message>
<location filename="../../NUSGet.py" line="473"/>
<source>Ticket Not Available</source>
<translation>Billett Ikke Tilgjengelig</translation>
</message>
<message>
<source>No Ticket is Available for the Requested Title!</source>
<translation type="vanished">Ingen billett er tilgjengelig for den forespurte tittelen!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="477"/>
<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>
</message>
<message>
<location filename="../../NUSGet.py" line="479"/>
<source>Unknown Error</source>
<translation>Ukjent Feil</translation>
</message>
<message>
<source>An Unknown Error has Occurred!</source>
<translation type="vanished">En ukjent feil har oppstått!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="482"/>
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
<translation>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="501"/>
<source>Script Issues Occurred</source>
<translation>Skriptfeil Oppstod</translation>
</message>
<message>
<source>Some issues occurred while running the download script.</source>
<translation type="vanished">Noen feil oppstod under kjøring av nedlastingsskriptet.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="504"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation>Sjekk loggen for mer informasjon om feilene som har oppstått.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="511"/>
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
<translation>Følgende titler kunne ikke lastes ned 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="521"/>
<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="540"/>
<source>Script Download Failed</source>
<translation>Skriptnedlasting Mislyktes</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="541"/>
<source>Open NUS Script</source>
<translation>Åpne NUS Skript</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="542"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>NUS Skript (*.nus *.json)</translation>
</message>
<message>
<source>An error occurred while parsing the script file!</source>
<translation type="vanished">Det oppstod en feil under parsing av skriptfilen!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="554"/>
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
<translation></translation>
</message>
<message>
<source>An error occurred while parsing Title IDs!</source>
<translation type="vanished">Det oppstod en feil under parsing av Tittel IDer!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="565"/>
<source>The title at index {index} does not have a Title ID!</source>
<translation>Tittelen ved indeks {index} har ikke en Tittel ID!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="618"/>
<source>Open Directory</source>
<translation>Åpen Mappe</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="629"/>
<source>&lt;b&gt;The specified download directory does not exist!&lt;/b&gt;</source>
<translation>&lt;b&gt;Den angitte nedlastingsmappen finnes ikke!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="632"/>
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
<translation>Kontroller at den angitte nedlastingsmappen finnes, og at du har tillatelse fil å tilgang til den.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="226"/>
<source>Apply patches to IOS (Applies to WADs only)</source>
<translation>Påfør patcher IOS (gjelder kun WADer)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="119"/>
<source>Select a title from the list on the left, or enter a Title ID to begin.
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
By default, titles will be downloaded to a folder named &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation>Velg en tittel fra listen til venstre, eller skriv inn en Tittel ID for å begynne.
Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypteres og/eller pakkes inn i en WAD eller TAD. Titler med en X ikke har en billett, og bare det krypterte innholdet kan lagres.
Som standard, lastes titler ned til en mappe med navnet &quot;NUSGet Downloads&quot; i nedlastingsmappen din.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="224"/>
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
<translation>Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="305"/>
<source>NUSGet Update Available</source>
<translation>NUSGet Oppdatering Tilgjengelig</translation>
</message>
<message>
<source>There&apos;s a newer version of NUSGet available!</source>
<translation type="vanished">Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
</message>
<message>
<location filename="../../modules/core.py" line="74"/>
<source>
Could not check for updates.</source>
<translation>
Kunne ikke sjekke for oppdateringer.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="84"/>
<source>
There&apos;s a newer version of NUSGet available!</source>
<translation>
Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
</message>
<message>
<location filename="../../modules/core.py" line="86"/>
<source>
You&apos;re running the latest release of NUSGet.</source>
<translation>
Du kjører den nyeste versjonen av NUSGet.</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,620 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ro_RO">
<context>
<name>AboutNUSGet</name>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
<source>About NUSGet</source>
<translation>Despre NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
<source>NUSGet</source>
<translation>NUSGet</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
<source>Version {nusget_version}</source>
<translation>Versiunea {nusget_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
<source>Using libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</source>
<translation>Folosește libWiiPy {libwiipy_version} &amp; libTWLPy {libtwlpy_version}</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
<source>© 2024-2025 NinjaCheetah &amp; Contributors</source>
<translation>© 2024-2025 NinjaCheetah &amp; Contributors</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
<source>View Project on GitHub</source>
<translation>Vedeți proiectul pe GitHub</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
<source>Translations</source>
<translation>Traduceri</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
<source>French (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</source>
<translation>Franceză (Français): &lt;a href=https://github.com/rougets style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rougets&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
<source>German (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</source>
<translation>Germană (Deutsch): &lt;a href=https://github.com/yeah-its-gloria style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;yeah-its-gloria&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
<source>Italian (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</source>
<translation>Italiană (Italiano): &lt;a href=https://github.com/LNLenost style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;LNLenost&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
<source>Korean (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</source>
<translation>Coreană (): &lt;a href=https://github.com/DDinghoya style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DDinghoya&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
<source>Norwegian (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</source>
<translation>Norvegiană (Norsk): &lt;a href=https://github.com/rolfiee style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;rolfiee&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
<source>Romanian (Română): &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</source>
<translation>Română: &lt;a href=https://github.com/NotImplementedLife style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;NotImplementedLife&lt;/b&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
<source>Spanish (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</source>
<translation>Spaniolă (Español): &lt;a href=https://github.com/DarkMatterCore style=&apos;color: #4a86e8; text-decoration: none;&apos;&gt;&lt;b&gt;DarkMatterCore&lt;/b&gt;&lt;/a&gt;</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<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}
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 în fișierul dvs. de download.</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 Downloads&quot; inside your downloads folder.</source>
<translation type="vanished">NUSGet v{nusget_version}
Dezvoltat de NinjaCheetah
Operat de libWiiPy {libwiipy_version}
Suport pentru DSi oferit de libTWLPy {libtwlpy_version}
Selectează un titlu din lista din stânga, sau introdu un Title ID pentru a începe.
Titlurile marcate cu bifă sunt gratuite și au un tichet disponibil și pot fi decriptate și/sau incluse într-un WAD sau TAD. Titlurile cu un X nu au tichet, și pot fi salvate doar în formă encriptată.
Titlurile vor fi descărcate într-un folder numit NUSGet Downloads în fișierul dvs. de download.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="305"/>
<source>NUSGet Update Available</source>
<translation>Actualizare NUSGet disponibilă</translation>
</message>
<message>
<source>There&apos;s a newer version of NUSGet available!</source>
<translation type="vanished">O nouă versiune NUSGet este disponibilă!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="119"/>
<source>Select a title from the list on the left, or enter a Title ID to begin.
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
By default, titles will be downloaded to a folder named &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation>Selectați un titlu din lista din stânga, sau introduceți un Title ID pentru a începe.
Titlurile marcate cu bifă sunt libere și au un tichet valabil, ele pot fi decriptate și/sau împachetate într-un WAD sau TAD. Titlurile cu X nu au tichet, și doar conținutul lor criptat poate fi salvat.
Implicit, titlurile vor fi descărcate într-un folder numit NUSGet Downloads în folderul dvs. de descărcări.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="224"/>
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
<translation>Folosiți Wii U NUS (mai rapid, afectează doar Wii/vWii)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="306"/>
<source>&lt;b&gt;There&apos;s a newer version of NUSGet available!&lt;/b&gt;</source>
<translation>&lt;b&gt;O nouă versiune de NUSGet este valabilă!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="407"/>
<source>No Output Selected</source>
<translation>Nu s-a selectat un output</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="408"/>
<source>You have not selected any format to output the data in!</source>
<translation>Nu ați selectat niciun format de ieșire!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="410"/>
<source>Please select at least one option for how you would like the download to be saved.</source>
<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>
<location filename="../../NUSGet.py" line="422"/>
<location filename="../../NUSGet.py" line="628"/>
<source>Invalid Download Directory</source>
<translation>Director de descărcare invalid</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="423"/>
<source>The specified download directory does not exist!</source>
<translation>Directorul de descărcare specificat nu există!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="426"/>
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
<translation> rugăm asigurați directorul de descărcare specificat există, și aveți permisiuni pentru a-l accesa.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="456"/>
<source>Invalid Title ID</source>
<translation>Title ID invalid</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="457"/>
<source>&lt;b&gt;The Title ID you have entered is not in a valid format!&lt;/b&gt;</source>
<translation>&lt;b&gt; Title ID pe care l-ați introdus nu este într-un format valid!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="462"/>
<source>&lt;b&gt;No title with the provided Title ID or version could be found!&lt;/b&gt;</source>
<translation>&lt;b&gt;Nu s-a găsit niciun titlu cu Title ID sau versiunea introdusă!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="467"/>
<source>&lt;b&gt;Content decryption was not successful! Decrypted contents could not be created.&lt;/b&gt;</source>
<translation>&lt;b&gt;Decriptarea conținutului a eșuat! Nu s-a putut crea conținutul decriptat.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="474"/>
<source>&lt;b&gt;No Ticket is Available for the Requested Title!&lt;/b&gt;</source>
<translation>&lt;b&gt;Nu există tichet valabil pentru titlul cerut!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="480"/>
<source>&lt;b&gt;An Unknown Error has Occurred!&lt;/b&gt;</source>
<translation>&lt;b&gt;S-a produs o eroare necunoscută!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="502"/>
<source>&lt;b&gt;Some issues occurred while running the download script.&lt;/b&gt;</source>
<translation>&lt;b&gt;Au apărut câteva probleme la rularea scriptului de descărcare.&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="552"/>
<source>&lt;b&gt;An error occurred while parsing the script file!&lt;/b&gt;</source>
<translation>&lt;b&gt;A apărut o eroare la procesarea fișierului script!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="563"/>
<source>&lt;b&gt;An error occurred while parsing Title IDs!&lt;/b&gt;</source>
<translation>&lt;b&gt;A apărut o eroare la procesarea Title ID-urilor!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="661"/>
<location filename="../../NUSGet.py" line="671"/>
<source>Restart Required</source>
<translation>Repornire necesară</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="662"/>
<source>NUSGet must be restarted for the selected language to take effect.</source>
<translation>NUSGet trebuie repornit pentru ca noua limbă aibă efect.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="672"/>
<source>NUSGet must be restarted for the selected theme to take effect.</source>
<translation>NUSGet trebuie repornit pentru ca noua temă aibă efect.</translation>
</message>
<message>
<source>The Title ID you have entered is not in a valid format!</source>
<translation type="vanished">Title ID pe care l-ați introdus este invalid!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="459"/>
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
<translation>Title ID-urile trebuie 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="461"/>
<source>Title ID/Version Not Found</source>
<translation>Title ID/Versiunea nu a fost găsită</translation>
</message>
<message>
<source>No title with the provided Title ID or version could be found!</source>
<translation type="vanished">Niciun titlu care corespundă cu Title ID-ul sau cu versiunea introdusă nu a fost găsit!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="464"/>
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
<translation> 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="466"/>
<source>Content Decryption Failed</source>
<translation>Decriptarea conținutului a eșuat</translation>
</message>
<message>
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
<translation type="vanished">Decriptarea conținutului nu a reușit. Nu s-a putut crea conținutul decriptat.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="470"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &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="473"/>
<source>Ticket Not Available</source>
<translation>Ticket-ul nu este valabil</translation>
</message>
<message>
<source>No Ticket is Available for the Requested Title!</source>
<translation type="vanished">Niciun Ticket nu este valabil pentru titlul dorit!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="477"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &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="479"/>
<source>Unknown Error</source>
<translation>Eroare necunoscută</translation>
</message>
<message>
<source>An Unknown Error has Occurred!</source>
<translation type="vanished">S-a produs o eroare necunoscută!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="482"/>
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
<translation> 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="501"/>
<source>Script Issues Occurred</source>
<translation>Au apărut probleme cu scriptul</translation>
</message>
<message>
<source>Some issues occurred while running the download script.</source>
<translation type="vanished">Au apărut câteva probleme la rularea scriptului descărcat.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="504"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation>Verificați logurile pentru mai multe detalii despre problemele întâmpinate.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="511"/>
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
<translation>Următoarele titluri nu au putut fi descărcate din cauza unei erori. rugăm asigurați Title ID și versiunea listate în script sunt valide.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="521"/>
<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="540"/>
<source>Script Download Failed</source>
<translation>Descărcarea scriptului a eșuat</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="541"/>
<source>Open NUS Script</source>
<translation>Deschideți script NUS</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="542"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>Scripturi NUS (*.nus *.json)</translation>
</message>
<message>
<source>An error occurred while parsing the script file!</source>
<translation type="vanished">A apărut o eroare la parssarea acestui fișier script!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="554"/>
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
<translation>S-a produs o eroare la linia {lineno}, coloana {colno}. rugăm verificați scriptul și încercați din nou.</translation>
</message>
<message>
<source>An error occurred while parsing Title IDs!</source>
<translation type="vanished">A apărut o eroare la procesarea Title ID-urilor!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="565"/>
<source>The title at index {index} does not have a Title ID!</source>
<translation>Titlul la poziția {index} nu are un Title ID!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="618"/>
<source>Open Directory</source>
<translation>Deschideți folder</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="629"/>
<source>&lt;b&gt;The specified download directory does not exist!&lt;/b&gt;</source>
<translation>&lt;b&gt;Directorul de descărcare specificat nu există!&lt;/b&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="632"/>
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
<translation> rugăm asigurați directorul de descărcare pe care vreți il folosiți există, și aveți permisiunea de a-l accesa.</translation>
</message>
<message>
<source>Open NUS script</source>
<translation type="obsolete">Deschideți script NUS</translation>
</message>
<message>
<source>Script Failure</source>
<translation type="obsolete">Eșuare Script</translation>
</message>
<message>
<source>Failed to open the script.</source>
<translation type="obsolete">Nu s-a putut deschide script-ul.</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
<source>MainWindow</source>
<translation>Fereastra principală</translation>
</message>
<message>
<source>Available Titles</source>
<translation type="obsolete">Titluri valabile</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Search</source>
<translation>Căutați</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
<source>Clear</source>
<translation>Goliți câmpul</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
<source>Wii</source>
<translation>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>Title 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>Versiune</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source>
<translation>Consolă:</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source>
<translation>Începeți descărcarea</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source>
<translation>Rulați script</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source>
<translation>Setări Generale</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
<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;.AppleSystemUIFont&apos;; font-size:13pt; 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></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
<source>Options</source>
<translation>Opțiuni</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
<source>Language</source>
<translation>Limbă</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
<source>Theme</source>
<translation>Temă</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
<source>About NUSGet</source>
<translation>Despre NUSGet</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
<source>System (Default)</source>
<translation>Sistem (Implicit)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
<source>Light</source>
<translation>Luminos</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
<source>Dark</source>
<translation>Întunecat</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="218"/>
<source>Pack installable archive (WAD/TAD)</source>
<translation>Împachetați arhiva instalabilă (WAD/TAD)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
<source>File Name</source>
<translation>Nume fișier</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="220"/>
<source>Keep encrypted contents</source>
<translation>Păstrați conținuturile encriptate</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="222"/>
<source>Create decrypted contents (*.app)</source>
<translation>Creați conținuturi decriptate (*.app)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="223"/>
<source>Use local files, if they exist</source>
<translation>Folosiți fișiere locale, dacă există</translation>
</message>
<message>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
<translation type="vanished">Folosiți Wii U NUS (mai rapid, doar pentru Wii/vWii)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="226"/>
<source>Apply patches to IOS (Applies to WADs only)</source>
<translation>Aplicați patch-uri pentru IOS (se aplică doar pentru WAD-uri)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
<source>vWii Title Settings</source>
<translation>vWII Setări titlu</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="227"/>
<source>Re-encrypt title using the Wii Common Key</source>
<translation>Re-encriptați titlul folosind cheia comună Wii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
<source>App Settings</source>
<translation>Setări aplicație</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="228"/>
<source>Check for updates on startup</source>
<translation>Verificați dacă există actualizări la startup</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="229"/>
<source>Use a custom download directory</source>
<translation>Folosiți un director de descărcare propriu</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
<source>Select...</source>
<translation>Selectează...</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
<source>Help</source>
<translation>Ajutor</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
<source>About Qt</source>
<translation>Despre Qt</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
<source>Output Path</source>
<translation>Cale de ieșire</translation>
</message>
<message>
<location filename="../../modules/core.py" line="74"/>
<source>
Could not check for updates.</source>
<translation>
Nu s-a putut verifica dacă există actualizări.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="84"/>
<source>
There&apos;s a newer version of NUSGet available!</source>
<translation>
O nouă versiune de NUSGet este valabilă!</translation>
</message>
<message>
<location filename="../../modules/core.py" line="86"/>
<source>
You&apos;re running the latest release of NUSGet.</source>
<translation>
Utilizați ultima versiune de NUSGet.</translation>
</message>
</context>
</TS>

30
update_translations.py Normal file
View File

@ -0,0 +1,30 @@
# "update_translations.py", licensed under the MIT license
# Copyright 2024-2025 NinjaCheetah
# This script exists to work around an issue in PySide6 where the "pyside6-project lupdate" command doesn't work as
# expected, as it struggles to parse the paths in the .pyproject file. This does what it's meant to do for it.
import json
import pathlib
import subprocess
LUPDATE_CMD = "pyside6-lupdate"
pyproject_file = pathlib.Path("NUSGet.pyproject")
pyproject = json.load(open(pyproject_file, "r"))
files = []
for key in pyproject["files"]:
files.append(pathlib.Path(key))
source_files = []
ts_files = []
for file in files:
if file.suffix == ".ts":
ts_files.append(file)
elif file.suffix == ".py" or file.suffix == ".ui":
source_files.append(file)
for target in ts_files:
cmd = [LUPDATE_CMD] + [s for s in source_files] + ["-ts"]
cmd.append(target)
subprocess.run(cmd, cwd=str(pyproject_file.parent))