Compare commits
124 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
76c8b806d0 | ||
|
|
61783bc530 | ||
|
|
a3a2a04991 | ||
|
|
b6304fca75 | ||
|
|
5612ae5691 | ||
|
|
657c160599 | ||
|
|
f66494aeb5 | ||
|
|
650e7812e5 | ||
|
|
cca54340a2 | ||
|
|
8161b52e7b | ||
|
|
9390bd3865 | ||
|
|
483be133a5 | ||
|
|
e2022eac4c | ||
|
|
977331c3b2 | ||
|
|
64a40ae672 | ||
|
|
4e5e1a801b | ||
|
|
01e06a79a5 | ||
|
|
c762dafc67 | ||
|
|
fd1d461ea8 | ||
|
|
2e14e4b09b | ||
|
|
fb7b37736b | ||
|
|
12e5069168 | ||
|
|
b81bc51b1c | ||
|
|
e3f846c9ec | ||
|
|
7d5876d881 | ||
|
|
990948b912 | ||
|
|
91a08d36b4 | ||
|
|
abc7a0799d | ||
|
|
ab973a3f99 | ||
|
|
d0179b8719 | ||
|
|
78ecdc014b | ||
|
|
0751fa9a2e | ||
|
|
f05230e870 | ||
|
|
9915307be0 | ||
|
|
62183f4524 | ||
|
|
ca1b31329d | ||
|
|
3a3b8008a1 | ||
|
|
e9f0d2349c | ||
|
|
26f195b54f | ||
|
|
aa48c1696d | ||
|
|
e526f376fe | ||
|
|
78bda75985 | ||
|
|
cf95128f0b | ||
|
|
6dbf48d73c | ||
|
|
1614c8e2e4 | ||
|
|
cdebcad4fe | ||
|
|
54c63d6f3b | ||
|
|
d840a8ddba | ||
|
|
c3b31d0fdd | ||
|
|
dd1a6eb25b | ||
|
|
271fab66f5 | ||
|
|
87642e914e | ||
|
|
45aa7c4e62 | ||
|
|
9b1788d1ec | ||
|
|
389a4cfef5 | ||
|
|
ac06631156 | ||
|
|
bc39e668eb | ||
|
|
e452615c77 | ||
|
|
588eb01379 | ||
|
|
4855a01f1a | ||
|
|
cb7fb0e506 | ||
|
|
cdb38f27a7 | ||
|
|
7804bbbcbc | ||
|
|
5db5f93af1 | ||
|
|
bab4bfce84 | ||
|
|
ec06763e50 | ||
|
|
5e315bd65f | ||
|
|
2edfe91ad6 | ||
|
|
7005118876 | ||
|
|
087d44fb40 | ||
|
|
e3722f2591 | ||
|
|
47855ce7b4 | ||
|
|
ec7caabdbd | ||
|
|
adf0a3b2cd | ||
|
|
f88e354ae8 | ||
|
|
df3d8d3990 | ||
|
|
f01dbf7c67 | ||
|
|
7c273f30f3 | ||
|
|
37890f157d | ||
|
|
a2c9b63dfd | ||
|
|
3df676df0f | ||
|
|
276ee36bfe | ||
|
|
17b622833a | ||
|
|
536c169255 | ||
|
|
38640ea696 | ||
|
|
372399a27d | ||
|
|
483b2b3ce0 | ||
|
|
e0040b625e | ||
|
|
10f079e881 | ||
|
|
4a058d3caf | ||
|
|
986ffdcd9c | ||
|
|
97085ef282 | ||
|
|
d02fbcf282 | ||
|
|
c8ae2a7872 | ||
|
|
79da00e098 | ||
|
|
0edd7c400f | ||
|
|
aa03256fd4 | ||
|
|
8f1084b24f | ||
|
|
55c952a51f | ||
|
|
dd6371997c | ||
|
|
c8c4a273c9 | ||
|
|
0570c14343 | ||
|
|
66f2171995 | ||
|
|
3178f11596 | ||
|
|
e2d9db8928 | ||
|
|
945d1f3ae6 | ||
|
|
0585bec6e5 | ||
|
|
11f4f3000a | ||
|
|
474843915c | ||
|
|
3146b951f2 | ||
|
|
2db9b72416 | ||
|
|
9b4710d386 | ||
|
|
ddf5b94f4d | ||
|
|
ecb2567757 | ||
|
|
b59a162473 | ||
|
|
ef5ff520d1 | ||
|
|
433c2e220c | ||
|
|
98ad2f485b | ||
|
|
9966e57e12 | ||
|
|
c11990e1bd | ||
|
|
9b1c0226e1 | ||
|
|
f38a671a7f | ||
|
|
fe952dc9f2 | ||
|
|
d063ffcb20 |
15
.github/FUNDING.yml
vendored
Normal file
15
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: ITotalJustice
|
||||
patreon: totaljustice
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: totaljustice
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
polar: # Replace with a single Polar username
|
||||
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
|
||||
thanks_dev: # Replace with a single thanks.dev username
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
31
.github/workflows/build_presets.yml
vendored
Normal file
31
.github/workflows/build_presets.yml
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
name: build
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
preset: [MinSizeRel]
|
||||
runs-on: ${{ matrix.os }}
|
||||
container: devkitpro/devkita64:latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
# fetch latest cmake
|
||||
- uses: lukka/get-cmake@latest
|
||||
|
||||
- name: Configure CMake
|
||||
run: |
|
||||
cmake --preset ${{ matrix.preset }} -DUSE_VFS_GC=0
|
||||
|
||||
- name: Build
|
||||
run: cmake --build --preset ${{ matrix.preset }} --parallel 4
|
||||
|
||||
- uses: actions/upload-artifact@master
|
||||
with:
|
||||
name: sphaira-${{ matrix.preset }}
|
||||
path: build/${{ matrix.preset }}/sphaira.nro
|
||||
@@ -42,5 +42,12 @@ function(dkp_fatal_if_not_found var package)
|
||||
endif()
|
||||
endfunction(dkp_fatal_if_not_found var package)
|
||||
|
||||
# disable exceptions and rtti in order to shrink final binary size.
|
||||
add_compile_options(
|
||||
"$<$<COMPILE_LANGUAGE:C>:-fno-exceptions>"
|
||||
"$<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>"
|
||||
"$<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>"
|
||||
)
|
||||
|
||||
add_subdirectory(hbl)
|
||||
add_subdirectory(sphaira)
|
||||
|
||||
16
README.md
16
README.md
@@ -2,10 +2,10 @@
|
||||
|
||||
A homebrew menu for the switch.
|
||||
|
||||
It was built for my usage, as such, features that may seem out of place are included because i found them useful.
|
||||
|
||||
[See the gbatemp thread for more details / discussion](https://gbatemp.net/threads/sphaira-hbmenu-replacement.664523/).
|
||||
|
||||
[We have now have a Discord server!](https://discord.gg/8vZBsrprEc). Please use the issues tab to report bugs, as it is much easier for me to track.
|
||||
|
||||
## showcase
|
||||
|
||||
| | |
|
||||
@@ -26,6 +26,15 @@ please include:
|
||||
- FW version
|
||||
- The bug itself and how to reproduce it
|
||||
|
||||
## ftp
|
||||
|
||||
ftp can be enabled via the network menu. It uses the same config as ftpsrv `/config/ftpsrv/config.ini`. [See here for the full list
|
||||
of all configs available](https://github.com/ITotalJustice/ftpsrv/blob/master/assets/config.ini.template).
|
||||
|
||||
## mtp
|
||||
|
||||
mtp can be enabled via the network menu.
|
||||
|
||||
## file assoc
|
||||
|
||||
sphaira has file assoc support. lets say your app supports loading .png files, then you could write an assoc file, then when using the file browser, clicking on a .png file will launch your app along with the .png file as argv[1]. This was primarly added for rom loading support for emulators / frontends such as retroarch, melonds, mgba etc.
|
||||
@@ -51,3 +60,6 @@ see `assets/romfs/assoc/` for more examples of file assoc entries
|
||||
- libpulsar
|
||||
- minIni
|
||||
- gbatemp
|
||||
- hb-appstore
|
||||
- haze
|
||||
- everyone who has contributed to this project!
|
||||
|
||||
BIN
assets/icon.jpg
BIN
assets/icon.jpg
Binary file not shown.
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 7.6 KiB |
@@ -1,4 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/2048_libretro_libnx.nro
|
||||
supported_extensions=
|
||||
database=2048
|
||||
4
assets/romfs/assoc/DoubleCherryGB_libretro_libnx.ini
Normal file
4
assets/romfs/assoc/DoubleCherryGB_libretro_libnx.ini
Normal file
@@ -0,0 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/DoubleCherryGB_libretro_libnx.nro
|
||||
supported_extensions=cgb|dmg|gb|gbc|sgb
|
||||
database=Nintendo - Game Boy|Nintendo - Game Boy Color
|
||||
4
assets/romfs/assoc/ardens_libretro_libnx.ini
Normal file
4
assets/romfs/assoc/ardens_libretro_libnx.ini
Normal file
@@ -0,0 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/ardens_libretro_libnx.nro
|
||||
supported_extensions=hex|arduboy
|
||||
database=Arduboy Inc - Arduboy
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/arduous_libretro_libnx.nro
|
||||
supported_extensions=hex
|
||||
database=Arduboy
|
||||
database=Arduboy Inc - Arduboy
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/atari800_libretro_libnx.nro
|
||||
supported_extensions=xfd|atr|cdm|cas|bin|a52|zip|atx|car|rom|com|xex
|
||||
supported_extensions=xfd|atr|dcm|cas|bin|a52|zip|atx|car|rom|com|xex|m3u
|
||||
database=Atari - 5200|Atari - 8-bit
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/bluemsx_libretro_libnx.nro
|
||||
supported_extensions=rom|ri|mx1|mx2|col|dsk|cas|sg|sc|sf|m3u
|
||||
database=Microsoft - MSX|Microsoft - MSX2|Coleco - ColecoVision|Sega - SG-1000
|
||||
supported_extensions=rom|ri|mx1|mx2|dsk|col|sg|sc|sf|cas|m3u
|
||||
database=Microsoft - MSX|Microsoft - MSX2|Coleco - ColecoVision|Sega - SG-1000|Spectravideo - SVI-318 - SVI-328
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/citra_libretro_libnx.nro
|
||||
supported_extensions=3ds|3dsx|elf|axf|cci|cxi|app
|
||||
database=Nintendo - Nintendo 3DS
|
||||
4
assets/romfs/assoc/dosbox_pure_libretro_libnx.ini
Normal file
4
assets/romfs/assoc/dosbox_pure_libretro_libnx.ini
Normal file
@@ -0,0 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/dosbox_pure_libretro_libnx.nro
|
||||
supported_extensions=zip|dosz|exe|com|bat|iso|chd|cue|ins|img|ima|vhd|jrc|tc|m3u|m3u8|conf|/
|
||||
database=DOS
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/dosbox_svn_libretro_libnx.nro
|
||||
supported_extensions=exe|com|bat|conf|cue|iso
|
||||
supported_extensions=exe|com|bat|conf|cue|iso|img|/
|
||||
database=DOS
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/fbalpha2012_cps1_libretro_libnx.nro
|
||||
supported_extensions=zip
|
||||
@@ -1,3 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/fbalpha2012_cps2_libretro_libnx.nro
|
||||
supported_extensions=zip
|
||||
@@ -1,3 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/fbalpha2012_libretro_libnx.nro
|
||||
supported_extensions=iso|zip|7z
|
||||
@@ -1,3 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/fbalpha2012_neogeo_libretro_libnx.nro
|
||||
supported_extensions=zip
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/frodo_libretro_libnx.nro
|
||||
supported_extensions=d64|t64|x64|p00|lnx|zip
|
||||
supported_extensions=d64|t64|x64|p00|lnx|lyx|zip
|
||||
database=Commodore - 64
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/fuse_libretro_libnx.nro
|
||||
supported_extensions=tzx|tap|z80|rzx|scl|trd|dsk|zip
|
||||
supported_extensions=tzx|tap|z80|rzx|scl|trd|dsk|dck|sna|szx|zip
|
||||
database=Sinclair - ZX Spectrum +3|Sinclair - ZX Spectrum
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/gme_libretro_libnx.nro
|
||||
supported_extensions=ay|gbs|gym|hes|kss|nsf|nsfe|sap|spc|vgm|vgz|zip
|
||||
@@ -1,3 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/gong_libretro_libnx.nro
|
||||
supported_extensions=
|
||||
4
assets/romfs/assoc/gpsp_libretro_libnx.ini
Normal file
4
assets/romfs/assoc/gpsp_libretro_libnx.ini
Normal file
@@ -0,0 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/gpsp_libretro_libnx.nro
|
||||
supported_extensions=gba|bin
|
||||
database=Nintendo - Game Boy Advance
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/handy_libretro_libnx.nro
|
||||
supported_extensions=lnx|o
|
||||
supported_extensions=lnx|lyx|o
|
||||
database=Atari - Lynx
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/mame2000_libretro_libnx.nro
|
||||
supported_extensions=zip|7z|chd
|
||||
supported_extensions=zip|7z
|
||||
database=MAME 2000
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/mednafen_lynx_libretro_libnx.nro
|
||||
supported_extensions=lnx|o
|
||||
supported_extensions=lnx|lyx|o
|
||||
database=Atari - Lynx
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/minivmac_libretro_libnx.nro
|
||||
supported_extensions=dsk|img|zip|hvf|cmd
|
||||
4
assets/romfs/assoc/mrboom_libretro_libnx.ini
Normal file
4
assets/romfs/assoc/mrboom_libretro_libnx.ini
Normal file
@@ -0,0 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/mrboom_libretro_libnx.nro
|
||||
supported_extensions=desktop
|
||||
database=MrBoom
|
||||
@@ -1,3 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/mu_libretro_libnx.nro
|
||||
supported_extensions=prc|pqa|img|pdb|zip
|
||||
@@ -1,3 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/numero_libretro_libnx.nro
|
||||
supported_extensions=8xp|8xk|8xg
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/pcsx_rearmed_libretro_libnx.nro
|
||||
supported_extensions=bin|cue|img|mdf|pbp|toc|cbn|m3u|ccd|chd
|
||||
supported_extensions=bin|cue|img|mdf|pbp|toc|cbn|m3u|ccd|chd|iso|exe
|
||||
database=Sony - PlayStation
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/pocketcdg_libretro_libnx.nro
|
||||
supported_extensions=cdg
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/ppsspp_libretro_libnx.nro
|
||||
supported_extensions=elf|iso|cso|prx|pbp
|
||||
supported_extensions=elf|iso|cso|prx|pbp|chd
|
||||
database=Sony - PlayStation Portable
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/px68k_libretro_libnx.nro
|
||||
supported_extensions=dim|zip|img|d88|88d|hdm|dup|2hd|xdf|hdf|cmd|m3u
|
||||
supported_extensions=dim|img|d88|88d|hdm|dup|2hd|xdf|hdf|cmd|m3u
|
||||
database=Sharp - X68000
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/quasi88_libretro_libnx.nro
|
||||
supported_extensions=d88|u88|m3u
|
||||
database=NEC - PC-8001 - PC-8801
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/retro8_libretro_libnx.nro
|
||||
supported_extensions=p8|png
|
||||
database=PICO8
|
||||
database=PICO-8
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/stella_libretro_libnx.nro
|
||||
path=/retroarch/cores/stella2023_libretro_libnx.nro
|
||||
supported_extensions=a26|bin
|
||||
database=Atari - 2600
|
||||
@@ -1,3 +0,0 @@
|
||||
[config]
|
||||
path=/retroarch/cores/superbroswar_libretro_libnx.nro
|
||||
supported_extensions=game
|
||||
4
assets/romfs/assoc/vircon32_libretro_libnx.ini
Normal file
4
assets/romfs/assoc/vircon32_libretro_libnx.ini
Normal file
@@ -0,0 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/vircon32_libretro_libnx.nro
|
||||
supported_extensions=v32|V32
|
||||
database=Vircon32
|
||||
@@ -1,4 +1,4 @@
|
||||
[config]
|
||||
path=/retroarch/cores/x1_libretro_libnx.nro
|
||||
supported_extensions=dx1|zip|2d|2hd|tfd|d88|88d|hdm|xdf|dup|tap|cmd
|
||||
database=Sharp X1
|
||||
database=Sharp - X1
|
||||
|
||||
8
assets/romfs/github/ftpsrv.json
Normal file
8
assets/romfs/github/ftpsrv.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"url": "https://github.com/ITotalJustice/ftpsrv",
|
||||
"assets": [
|
||||
{
|
||||
"name": "switch"
|
||||
}
|
||||
]
|
||||
}
|
||||
3
assets/romfs/github/sphaira.json
Normal file
3
assets/romfs/github/sphaira.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"url": "https://github.com/ITotalJustice/sphaira"
|
||||
}
|
||||
3
assets/romfs/github/untitled.json
Normal file
3
assets/romfs/github/untitled.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"url": "https://github.com/ITotalJustice/untitled"
|
||||
}
|
||||
@@ -1,114 +1,255 @@
|
||||
{
|
||||
"Launch": "Start",
|
||||
"[Applet Mode]": "[Applet-Modus]",
|
||||
"No Internet": "Keine Internetverbindung",
|
||||
"Files": "Dateien",
|
||||
"Apps": "Apps",
|
||||
"Store": "Store",
|
||||
"Menu": "Menü",
|
||||
"Options": "Optionen",
|
||||
"Homebrew Options": "Homebrew-Optionen",
|
||||
"OK": "OK",
|
||||
"Back": "Zurück",
|
||||
"Select": "Auswählen",
|
||||
"Open": "Öffnen",
|
||||
"Launch": "Starten",
|
||||
"Info": "Info",
|
||||
"Install": "Installieren",
|
||||
"Delete": "Löschen",
|
||||
"Restart": "Neustart",
|
||||
"Changelog": "Changelog",
|
||||
"Details": "Details",
|
||||
"Update": "Update",
|
||||
"Remove": "Entfernen",
|
||||
"Restore": "Wiederherstellen",
|
||||
"Download": "Download",
|
||||
"Next Page": "Nächste Seite",
|
||||
"Prev Page": "Vorherige Seite",
|
||||
"Unstar": "Favorit entfernen",
|
||||
"Star": "Favorit",
|
||||
"System memory": "System-Speicher",
|
||||
"microSD card": "microSD-Karte",
|
||||
"Sd": "SD",
|
||||
"Image System memory": "System-Speicher Bild",
|
||||
"Image microSD card": "microSD-Karten Bild",
|
||||
"Slow": "Langsam",
|
||||
"Normal": "Normal",
|
||||
"Fast": "Schnell",
|
||||
"Yes": "Ja",
|
||||
"No": "Nein",
|
||||
"Enabled": "Aktiviert",
|
||||
"Disabled": "Deaktiviert",
|
||||
|
||||
"Sort By": "Sortieren nach",
|
||||
"Sort Options": "Sortieroptionen",
|
||||
"Updated": "Aktualisiert",
|
||||
"Size": "Größe",
|
||||
"Alphabetical": "Alphabetisch",
|
||||
"Decending": "Absteigend",
|
||||
"Ascending": "Aufsteigend",
|
||||
"Filter": "Filter",
|
||||
"Sort": "Sortieren",
|
||||
"Order": "Befehl",
|
||||
"Info": "Info",
|
||||
"Delete": "Löschen",
|
||||
"Hide Sphaira": "Sphaira verstecken",
|
||||
"Are you sure you want to delete ": "Sind Sie sicher, dass Sie löschen möchten? ",
|
||||
"Install Forwarder": "Weiterleitung installieren",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ACHTUNG: Der Einbau von Forwardern führt zu einem Verbot!",
|
||||
"Back": "Zurück",
|
||||
"Install": "Installieren",
|
||||
"Fs": "Fs",
|
||||
"App": "App",
|
||||
"Menu": "Speisekarte",
|
||||
"Homebrew": "Homebrew",
|
||||
"FileBrowser": "DateiBrowser",
|
||||
"Open": "Offen",
|
||||
"Theme Options": "Themenoptionen",
|
||||
"Select Theme": "Wählen Sie Thema aus",
|
||||
"Shuffle": "Shuffle",
|
||||
"Order": "Reihenfolge",
|
||||
"Search": "Suchen",
|
||||
"Updated": "Aktualisiert",
|
||||
"Updated (Star)": "Aktualisiert (Favoriten)",
|
||||
"Downloads": "Downloads",
|
||||
"Size": "Größe",
|
||||
"Size (Star)": "Größe (Favoriten)",
|
||||
"Alphabetical": "Alphabetisch",
|
||||
"Alphabetical (Star)": "Alphabetisch (Favoriten)",
|
||||
"Likes": "Likes",
|
||||
"ID": "ID",
|
||||
"Descending": "Absteigend",
|
||||
"Descending (down)": "Absteigend",
|
||||
"Desc": "Abst.",
|
||||
"Ascending": "Aufsteigend",
|
||||
"Ascending (Up)": "Aufsteigend",
|
||||
"Asc": "Aufst.",
|
||||
|
||||
"Menu Options": "Menü-Optionen",
|
||||
"Theme": "Theme",
|
||||
"Theme Options": "Theme-Optionen",
|
||||
"Select Theme": "Theme auswählen",
|
||||
"Shuffle": "Zufällig",
|
||||
"Music": "Musik",
|
||||
"Show Hidden": "Versteckt anzeigen",
|
||||
"Folders First": "Ordner zuerst",
|
||||
"Hidden Last": "Zuletzt versteckt",
|
||||
"Yes": "Ja",
|
||||
"No": "NEIN",
|
||||
"Network Options": "Netzwerkoptionen",
|
||||
"Network": "Netzwerk",
|
||||
"Network Options": "Netzwerk-Optionen",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Check for update": "Suchen Sie nach Updates",
|
||||
"File Options": "Dateioptionen",
|
||||
"Cut": "Schneiden",
|
||||
"Copy": "Kopie",
|
||||
"Nxlink Connected": "Nxlink verbunden",
|
||||
"Nxlink Upload": "Nxlink Upload",
|
||||
"Nxlink Finished": "Nxlink abgeschlossen",
|
||||
"Switch-Handheld!": "Switch-Handheld!",
|
||||
"Switch-Docked!": "Switch-Dock-Modus!",
|
||||
"Language": "Sprache",
|
||||
"Auto": "Auto",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "Logging",
|
||||
"Replace hbmenu on exit": "hbmenu beim Beenden ersetzen",
|
||||
"Misc": "Sonstiges",
|
||||
"Misc Options": "Weitere Optionen",
|
||||
"Web": "Web",
|
||||
"Install forwarders": "Forwarder installieren",
|
||||
"Install location": "Installationsort",
|
||||
"Show install warning": "Installationswarnung anzeigen",
|
||||
"Text scroll speed": "Textlaufgeschwindigkeit",
|
||||
|
||||
"FileBrowser": "Datei-Browser",
|
||||
"%zd files": "%zd Dateien",
|
||||
"%zd dirs": "%zd Ordner",
|
||||
"File Options": "Datei-Optionen",
|
||||
"Show Hidden": "Versteckte anzeigen",
|
||||
"Folders First": "Ordner zuerst",
|
||||
"Hidden Last": "Versteckte zuletzt",
|
||||
"Cut": "Ausschneiden",
|
||||
"Copy": "Kopieren",
|
||||
"Paste": "Einfügen",
|
||||
"Paste ": "Einfügen ",
|
||||
" file(s)?": " Datei(en)?",
|
||||
"Rename": "Umbenennen",
|
||||
"Advanced Options": "Datei erstellen",
|
||||
"Set New File Name": "Neuen Dateinamen eingeben",
|
||||
"Advanced": "Erweitert",
|
||||
"Advanced Options": "Erweiterte Optionen",
|
||||
"Create File": "Datei erstellen",
|
||||
"Set File Name": "Dateinamen eingeben",
|
||||
"Create Folder": "Ordner erstellen",
|
||||
"View as text": "Als Text anzeigen",
|
||||
"View as text (unfinished)": "Als Text anzeigen (unvollendet)",
|
||||
"Set Archive Bit": "Archivbit setzen",
|
||||
"Set Folder Name": "Ordnernamen eingeben",
|
||||
"View as text (unfinished)": "Als Text anzeigen (Beta)",
|
||||
"Ignore read only": "Schreibschutz ignorieren",
|
||||
"Mount": "Einbinden",
|
||||
"Empty...": "Leer...",
|
||||
"Open with DayBreak?": "Mit DayBreak öffnen?",
|
||||
"Launch ": "Starten ",
|
||||
"Launch option for: ": "Startoption für: ",
|
||||
"Select launcher for: ": "Launcher auswählen für: ",
|
||||
|
||||
"Homebrew": "Homebrew",
|
||||
"Homebrew Options": "Homebrew-Optionen",
|
||||
"Hide Sphaira": "Sphaira ausblenden",
|
||||
"Install Forwarder": "Forwarder installieren",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "WARNUNG: Installation von Forwardern führt zum Ban!",
|
||||
"Installing Forwarder": "Installiere Forwarder",
|
||||
"Creating Program": "Erstelle Programm",
|
||||
"Creating Control": "Erstelle Control",
|
||||
"Creating Meta": "Erstelle Meta",
|
||||
"Writing Nca": "Schreibe NCA",
|
||||
"Updating ncm databse": "Aktualisiere NCM-Datenbank",
|
||||
"Pushing application record": "Übertrage Anwendungsdaten",
|
||||
"Installed!": "Installiert!",
|
||||
"Failed to install forwarder": "Forwarder-Installation fehlgeschlagen",
|
||||
"Unstarred ": "Favorit entfernt ",
|
||||
"Starred ": "Favorit hinzugefügt ",
|
||||
|
||||
"AppStore": "AppStore",
|
||||
"Filter: %s | Sort: %s | Order: %s": "Filter: %s | Sortierung: %s | Reihenfolge: %s",
|
||||
"AppStore Options": "AppStore-Optionen",
|
||||
"All": "Alle",
|
||||
"Games": "Spiele",
|
||||
"Emulators": "Emulatoren",
|
||||
"Tools": "Werkzeuge",
|
||||
"Advanced": "Fortschrittlich",
|
||||
"Themes": "Themen",
|
||||
"Legacy": "Vermächtnis",
|
||||
"Misc": "Sonstiges",
|
||||
"Downloads": "Downloads",
|
||||
"Filter": "Filter",
|
||||
"Search": "Suchen",
|
||||
"Menu Options": "Menüoptionen",
|
||||
"Header": "Kopfzeile",
|
||||
"Theme": "Thema",
|
||||
"Network": "Netzwerk",
|
||||
"Logging": "Protokollierung",
|
||||
"Enabled": "Ermöglicht",
|
||||
"Disabled": "Deaktiviert",
|
||||
"Replace hbmenu on exit": "Ersetzen Sie hbmenu beim Beenden",
|
||||
"Misc Options": "Verschiedene Optionen",
|
||||
"Themezer": "Themezer",
|
||||
"Irs": "Irs",
|
||||
"Web": "Web",
|
||||
"Download": "Herunterladen",
|
||||
"Next Page": "Nächste Seite",
|
||||
"Prev Page": "Vorherige Seite",
|
||||
"Pad ": "Unterlage ",
|
||||
"Tools": "Tools",
|
||||
"Themes": "Themes",
|
||||
"Legacy": "Legacy",
|
||||
"version: %s": "Version: %s",
|
||||
"updated: %s": "Aktualisiert: %s",
|
||||
"category: %s": "Kategorie: %s",
|
||||
"extracted: %.2f MiB": "Entpackt: %.2f MiB",
|
||||
"app_dls: %s": "Downloads: %s",
|
||||
"More by Author": "Mehr vom Entwickler",
|
||||
"Leave Feedback": "Feedback geben",
|
||||
|
||||
"Irs": "IR-Sensor",
|
||||
"Ambient Noise Level: ": "Umgebungsrauschen: ",
|
||||
"Controller": "Controller",
|
||||
"Pad ": "Pad ",
|
||||
" (Available)": " (Verfügbar)",
|
||||
" (Unsupported)": " (Nicht unterstützt)",
|
||||
" (Unconnected)": " (Nicht verbunden)",
|
||||
"HandHeld": "Handheld",
|
||||
" (Available)": " (Verfügbar)",
|
||||
"0 (Sideways)": "0 (Seitwärts)",
|
||||
"90 (Flat)": "90 (flach)",
|
||||
"180 (-Sideways)": "180 (-Seitwärts)",
|
||||
"270 (Upside down)": "270 (verkehrt herum)",
|
||||
"Rotation": "Rotation",
|
||||
"0 (Sideways)": "0° (Seitlich)",
|
||||
"90 (Flat)": "90° (Flach)",
|
||||
"180 (-Sideways)": "180° (-Seitlich)",
|
||||
"270 (Upside down)": "270° (Kopfüber)",
|
||||
"Colour": "Farbe",
|
||||
"Grey": "Grau",
|
||||
"Ironbow": "Eisenbogen",
|
||||
"Ironbow": "Ironbow",
|
||||
"Green": "Grün",
|
||||
"Red": "Rot",
|
||||
"Blue": "Blau",
|
||||
"Light Target": "Lichtziel",
|
||||
"All leds": "Alle LEDs",
|
||||
"Bright group": "Helle Gruppe",
|
||||
"Dim group": "Dunkle Gruppe",
|
||||
"None": "Keiner",
|
||||
"Normal image": "Normales Bild",
|
||||
"Negative image": "Negatives Bild",
|
||||
"320x240": "320x240",
|
||||
"160x120": "160x120",
|
||||
"80x60": "80x60",
|
||||
"40x30": "40x30",
|
||||
"20x15": "20x15",
|
||||
"Controller": "Regler",
|
||||
"Rotation": "Drehung",
|
||||
"Colour": "Farbe",
|
||||
"Light Target": "Leichtes Ziel",
|
||||
"Gain": "Gewinnen",
|
||||
"Negative Image": "Negatives Bild",
|
||||
"None": "Keine",
|
||||
"Gain": "Verstärkung",
|
||||
"Negative Image": "Negativ-Bild",
|
||||
"Normal image": "Normal-Bild",
|
||||
"Negative image": "Negativ-Bild",
|
||||
"Format": "Format",
|
||||
"Trimming Format": "Zuschneideformat",
|
||||
"External Light Filter": "Externer Lichtfilter",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "Beschnitt-Format",
|
||||
"External Light Filter": "Externes Lichtfilter",
|
||||
"Load Default": "Standard laden",
|
||||
"No Internet": "Kein Internet",
|
||||
"[Applet Mode]": "[Applet-Modus]",
|
||||
"Language": "Sprache"
|
||||
}
|
||||
|
||||
"Themezer": "Themezer",
|
||||
"Themezer Options": "Themezer-Optionen",
|
||||
"Nsfw": "NSFW",
|
||||
"Page": "Seite",
|
||||
"Page %zu / %zu": "Seite %zu / %zu",
|
||||
"Enter Page Number": "Seitenzahl eingeben",
|
||||
"Bad Page": "Ungültige Seite",
|
||||
"Download theme?": "Theme herunterladen?",
|
||||
|
||||
"GitHub": "GitHub",
|
||||
"Downloading json": "Lade JSON herunter",
|
||||
"Select asset to download for ": "Wähle Asset zum Download für ",
|
||||
|
||||
"Installing ": "Installiere ",
|
||||
"Uninstalling ": "Deinstalliere ",
|
||||
"Deleting ": "Lösche ",
|
||||
"Deleting": "Lösche",
|
||||
"Pasting ": "Füge ein ",
|
||||
"Pasting": "Füge ein",
|
||||
"Removing ": "Entferne ",
|
||||
"Scanning ": "Scanne ",
|
||||
"Creating ": "Erstelle ",
|
||||
"Copying ": "Kopiere ",
|
||||
"Trying to load ": "Lade ",
|
||||
"Downloading ": "Lade herunter ",
|
||||
"Downloaded ": "Heruntergeladen ",
|
||||
"Removed ": "Entfernt ",
|
||||
"Checking MD5": "Prüfe MD5",
|
||||
"Loading...": "Lade...",
|
||||
"Loading": "Lade",
|
||||
"Empty!": "Leer!",
|
||||
"Not Ready...": "Nicht bereit...",
|
||||
"Error loading page!": "Fehler beim Laden!",
|
||||
"Update avaliable: ": "Update verfügbar: ",
|
||||
"Download update: ": "Update herunterladen: ",
|
||||
"Updated to ": "Aktualisiert auf ",
|
||||
"Press OK to restart Sphaira": "OK drücken um Sphaira neuzustarten",
|
||||
"Restart Sphaira?": "Sphaira neustarten?",
|
||||
"Failed to download update": "Update-Download fehlgeschlagen",
|
||||
"Restore hbmenu?": "hbmenu wiederherstellen?",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "Konnte /switch/hbmenu.nro nicht finden\nBitte hbmenu über den AppStore neu installieren",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "Wiederherstellung fehlgeschlagen, bitte hbmenu neu herunterladen",
|
||||
"Failed to restore hbmenu, using sphaira instead": "Wiederherstellung fehlgeschlagen, verwende stattdessen Sphaira",
|
||||
"Restored hbmenu, closing sphaira": "hbmenu wiederhergestellt, Sphaira wird beendet",
|
||||
"Restored hbmenu": "hbmenu wiederhergestellt",
|
||||
"Delete Selected files?": "Ausgewählte Dateien löschen?",
|
||||
"Completely remove ": "Vollständig entfernen ",
|
||||
"Are you sure you want to delete ": "Wirklich löschen ",
|
||||
"Are you sure you wish to cancel?": "Wirklich abbrechen?",
|
||||
"If this message appears repeatedly, please open an issue.": "Bei wiederholtem Auftreten bitte Issue erstellen."
|
||||
}
|
||||
@@ -1,114 +1,255 @@
|
||||
{
|
||||
"Launch" : "Launch",
|
||||
"Options" : "Options",
|
||||
"Homebrew Options" : "Homebrew Options",
|
||||
"Sort By" : "Sort By",
|
||||
"Sort Options" : "Sort Options",
|
||||
"Updated" : "Updated",
|
||||
"Size" : "Size",
|
||||
"Alphabetical" : "Alphabetical",
|
||||
"Decending" : "Decending",
|
||||
"Ascending" : "Ascending",
|
||||
"Sort" : "Sort",
|
||||
"Order" : "Order",
|
||||
"Info" : "Info",
|
||||
"Delete" : "Delete",
|
||||
"Hide Sphaira" : "Hide Sphaira",
|
||||
"Are you sure you want to delete " : "Are you sure you want to delete ",
|
||||
"Install Forwarder" : "Install Forwarder",
|
||||
"WARNING: Installing forwarders will lead to a ban!" : "WARNING: Installing forwarders will lead to a ban!",
|
||||
"Back" : "Back",
|
||||
"Install" : "Install",
|
||||
"Fs" : "Fs",
|
||||
"App" : "App",
|
||||
"Menu" : "Menu",
|
||||
"Homebrew" : "Homebrew",
|
||||
"FileBrowser" : "FileBrowser",
|
||||
"Open" : "Open",
|
||||
"Theme Options" : "Theme Options",
|
||||
"Select Theme" : "Select Theme",
|
||||
"Shuffle" : "Shuffle",
|
||||
"Music" : "Music",
|
||||
"Show Hidden" : "Show Hidden",
|
||||
"Folders First" : "Folders First",
|
||||
"Hidden Last" : "Hidden Last",
|
||||
"Yes" : "Yes",
|
||||
"No" : "No",
|
||||
"Network Options" : "Network Options",
|
||||
"Nxlink" : "Nxlink",
|
||||
"Check for update" : "Check for update",
|
||||
"File Options" : "File Options",
|
||||
"Cut" : "Cut",
|
||||
"Copy" : "Copy",
|
||||
"Rename" : "Rename",
|
||||
"Advanced Options" : "Create File",
|
||||
"Create File" : "Create File",
|
||||
"Create Folder" : "Create Folder",
|
||||
"View as text" : "View as text",
|
||||
"View as text (unfinished)" : "View as text (unfinished)",
|
||||
"Set Archive Bit" : "Set Archive Bit",
|
||||
"AppStore Options" : "AppStore Options",
|
||||
"All" : "All",
|
||||
"Games" : "Games",
|
||||
"Emulators" : "Emulators",
|
||||
"Tools" : "Tools",
|
||||
"Advanced" : "Advanced",
|
||||
"Themes" : "Themes",
|
||||
"Legacy" : "Legacy",
|
||||
"Misc" : "Misc",
|
||||
"Downloads" : "Downloads",
|
||||
"Filter" : "Filter",
|
||||
"Search" : "Search",
|
||||
"Menu Options" : "Menu Options",
|
||||
"Header" : "Header",
|
||||
"Theme" : "Theme",
|
||||
"Network" : "Network",
|
||||
"Logging" : "Logging",
|
||||
"Enabled" : "Enabled",
|
||||
"Disabled" : "Disabled",
|
||||
"Replace hbmenu on exit" : "Replace hbmenu on exit",
|
||||
"Misc Options" : "Misc Options",
|
||||
"Themezer" : "Themezer",
|
||||
"Irs" : "Irs",
|
||||
"Web" : "Web",
|
||||
"Download" : "Download",
|
||||
"Next Page" : "Next Page",
|
||||
"Prev Page" : "Prev Page",
|
||||
"Pad " : "Pad ",
|
||||
" (Unconnected)" : " (Unconnected)",
|
||||
"HandHeld" : "HandHeld",
|
||||
" (Available)" : " (Available)",
|
||||
"0 (Sideways)" : "0 (Sideways)",
|
||||
"90 (Flat)" : "90 (Flat)",
|
||||
"180 (-Sideways)" : "180 (-Sideways)",
|
||||
"270 (Upside down)" : "270 (Upside down)",
|
||||
"Grey" : "Grey",
|
||||
"Ironbow" : "Ironbow",
|
||||
"Green" : "Green",
|
||||
"Red" : "Red",
|
||||
"Blue" : "Blue",
|
||||
"All leds" : "All leds",
|
||||
"Bright group" : "Bright group",
|
||||
"Dim group" : "Dim group",
|
||||
"None" : "None",
|
||||
"Normal image" : "Normal image",
|
||||
"Negative image" : "Negative image",
|
||||
"320x240" : "320x240",
|
||||
"160x120" : "160x120",
|
||||
"80x60" : "80x60",
|
||||
"40x30" : "40x30",
|
||||
"20x15" : "20x15",
|
||||
"Controller" : "Controller",
|
||||
"Rotation" : "Rotation",
|
||||
"Colour" : "Colour",
|
||||
"Light Target" : "Light Target",
|
||||
"Gain" : "Gain",
|
||||
"Negative Image" : "Negative Image",
|
||||
"Format" : "Format",
|
||||
"Trimming Format" : "Trimming Format",
|
||||
"External Light Filter" : "External Light Filter",
|
||||
"Load Default" : "Load Default",
|
||||
"No Internet" : "No Internet",
|
||||
"[Applet Mode]" : "[Applet Mode]",
|
||||
"Language": "Language"
|
||||
}
|
||||
"[Applet Mode]": "[Applet Mode]",
|
||||
"No Internet": "No Internet",
|
||||
"Files": "Files",
|
||||
"Apps": "Apps",
|
||||
"Store": "Store",
|
||||
"Menu": "Menu",
|
||||
"Options": "Options",
|
||||
"OK": "OK",
|
||||
"Back": "Back",
|
||||
"Select": "Select",
|
||||
"Open": "Open",
|
||||
"Launch": "Launch",
|
||||
"Info": "Info",
|
||||
"Install": "Install",
|
||||
"Delete": "Delete",
|
||||
"Restart": "Restart",
|
||||
"Changelog": "Changelog",
|
||||
"Details": "Details",
|
||||
"Update": "Update",
|
||||
"Remove": "Remove",
|
||||
"Restore": "Restore",
|
||||
"Download": "Download",
|
||||
"Next Page": "Next Page",
|
||||
"Prev Page": "Prev Page",
|
||||
"Unstar": "Unstar",
|
||||
"Star": "Star",
|
||||
"System memory": "System memory",
|
||||
"microSD card": "microSD card",
|
||||
"Sd": "Sd",
|
||||
"Image System memory": "Image System memory",
|
||||
"Image microSD card": "Image microSD card",
|
||||
"Slow": "Slow",
|
||||
"Normal": "Normal",
|
||||
"Fast": "Fast",
|
||||
"Yes": "Yes",
|
||||
"No": "No",
|
||||
"Enabled": "Enabled",
|
||||
"Disabled": "Disabled",
|
||||
|
||||
"Sort By": "Sort By",
|
||||
"Sort Options": "Sort Options",
|
||||
"Filter": "Filter",
|
||||
"Sort": "Sort",
|
||||
"Order": "Order",
|
||||
"Search": "Search",
|
||||
"Updated": "Updated",
|
||||
"Updated (Star)": "Updated (Star)",
|
||||
"Downloads": "Downloads",
|
||||
"Size": "Size",
|
||||
"Size (Star)": "Size (Star)",
|
||||
"Alphabetical": "Alphabetical",
|
||||
"Alphabetical (Star)": "Alphabetical (Star)",
|
||||
"Likes": "Likes",
|
||||
"ID": "ID",
|
||||
"Descending": "Descending",
|
||||
"Descending (down)": "Descending (down)",
|
||||
"Desc": "Desc",
|
||||
"Ascending": "Ascending",
|
||||
"Ascending (Up)": "Ascending (Up)",
|
||||
"Asc": "Asc",
|
||||
|
||||
"Menu Options": "Menu Options",
|
||||
"Theme": "Theme",
|
||||
"Theme Options": "Theme Options",
|
||||
"Select Theme": "Select Theme",
|
||||
"Shuffle": "Shuffle",
|
||||
"Music": "Music",
|
||||
"Network": "Network",
|
||||
"Network Options": "Network Options",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Nxlink Connected": "Nxlink Connected",
|
||||
"Nxlink Upload": "Nxlink Upload",
|
||||
"Nxlink Finished": "Nxlink Finished",
|
||||
"Switch-Handheld!": "Switch-Handheld!",
|
||||
"Switch-Docked!": "Switch-Docked!",
|
||||
"Language": "Language",
|
||||
"Auto": "Auto",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "Logging",
|
||||
"Replace hbmenu on exit": "Replace hbmenu on exit",
|
||||
"Misc": "Misc",
|
||||
"Misc Options": "Misc Options",
|
||||
"Web": "Web",
|
||||
"Install forwarders": "Install forwarders",
|
||||
"Install location": "Install location",
|
||||
"Show install warning": "Show install warning",
|
||||
"Text scroll speed": "Text scroll speed",
|
||||
|
||||
"FileBrowser": "FileBrowser",
|
||||
"%zd files": "%zd files",
|
||||
"%zd dirs": "%zd dirs",
|
||||
"File Options": "File Options",
|
||||
"Show Hidden": "Show Hidden",
|
||||
"Folders First": "Folders First",
|
||||
"Hidden Last": "Hidden Last",
|
||||
"Cut": "Cut",
|
||||
"Copy": "Copy",
|
||||
"Paste": "Paste",
|
||||
"Paste ": "Paste ",
|
||||
" file(s)?": " file(s)?",
|
||||
"Rename": "Rename",
|
||||
"Set New File Name": "Set New File Name",
|
||||
"Advanced": "Advanced",
|
||||
"Advanced Options": "Advanced Options",
|
||||
"Create File": "Create File",
|
||||
"Set File Name": "Set File Name",
|
||||
"Create Folder": "Create Folder",
|
||||
"Set Folder Name": "Set Folder Name",
|
||||
"View as text (unfinished)": "View as text (unfinished)",
|
||||
"Ignore read only": "Ignore read only",
|
||||
"Mount": "Mount",
|
||||
"Empty...": "Empty...",
|
||||
"Open with DayBreak?": "Open with DayBreak?",
|
||||
"Launch ": "Launch ",
|
||||
"Launch option for: ": "Launch option for: ",
|
||||
"Select launcher for: ": "Select launcher for: ",
|
||||
|
||||
"Homebrew": "Homebrew",
|
||||
"Homebrew Options": "Homebrew Options",
|
||||
"Hide Sphaira": "Hide Sphaira",
|
||||
"Install Forwarder": "Install Forwarder",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "WARNING: Installing forwarders will lead to a ban!",
|
||||
"Installing Forwarder": "Installing Forwarder",
|
||||
"Creating Program": "Creating Program",
|
||||
"Creating Control": "Creating Control",
|
||||
"Creating Meta": "Creating Meta",
|
||||
"Writing Nca": "Writing Nca",
|
||||
"Updating ncm databse": "Updating ncm databse",
|
||||
"Pushing application record": "Pushing application record",
|
||||
"Installed!": "Installed!",
|
||||
"Failed to install forwarder": "Failed to install forwarder",
|
||||
"Unstarred ": "Unstarred ",
|
||||
"Starred ": "Starred ",
|
||||
|
||||
"AppStore": "AppStore",
|
||||
"Filter: %s | Sort: %s | Order: %s": "Filter: %s | Sort: %s | Order: %s",
|
||||
"AppStore Options": "AppStore Options",
|
||||
"All": "All",
|
||||
"Games": "Games",
|
||||
"Emulators": "Emulators",
|
||||
"Tools": "Tools",
|
||||
"Themes": "Themes",
|
||||
"Legacy": "Legacy",
|
||||
"version: %s": "version: %s",
|
||||
"updated: %s": "updated: %s",
|
||||
"category: %s": "category: %s",
|
||||
"extracted: %.2f MiB": "extracted: %.2f MiB",
|
||||
"app_dls: %s": "app_dls: %s",
|
||||
"More by Author": "More by Author",
|
||||
"Leave Feedback": "Leave Feedback",
|
||||
|
||||
"Irs": "Irs",
|
||||
"Ambient Noise Level: ": "Ambient Noise Level: ",
|
||||
"Controller": "Controller",
|
||||
"Pad ": "Pad ",
|
||||
" (Available)": " (Available)",
|
||||
" (Unsupported)": " (Unsupported)",
|
||||
" (Unconnected)": " (Unconnected)",
|
||||
"HandHeld": "HandHeld",
|
||||
"Rotation": "Rotation",
|
||||
"0 (Sideways)": "0 (Sideways)",
|
||||
"90 (Flat)": "90 (Flat)",
|
||||
"180 (-Sideways)": "180 (-Sideways)",
|
||||
"270 (Upside down)": "270 (Upside down)",
|
||||
"Colour": "Colour",
|
||||
"Grey": "Grey",
|
||||
"Ironbow": "Ironbow",
|
||||
"Green": "Green",
|
||||
"Red": "Red",
|
||||
"Blue": "Blue",
|
||||
"Light Target": "Light Target",
|
||||
"All leds": "All leds",
|
||||
"Bright group": "Bright group",
|
||||
"Dim group": "Dim group",
|
||||
"None": "None",
|
||||
"Gain": "Gain",
|
||||
"Negative Image": "Negative Image",
|
||||
"Normal image": "Normal image",
|
||||
"Negative image": "Negative image",
|
||||
"Format": "Format",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "Trimming Format",
|
||||
"External Light Filter": "External Light Filter",
|
||||
"Load Default": "Load Default",
|
||||
|
||||
"Themezer": "Themezer",
|
||||
"Themezer Options": "Themezer Options",
|
||||
"Nsfw": "Nsfw",
|
||||
"Page": "Page",
|
||||
"Page %zu / %zu": "Page %zu / %zu",
|
||||
"Enter Page Number": "Enter Page Number",
|
||||
"Bad Page": "Bad Page",
|
||||
"Download theme?": "Download theme?",
|
||||
|
||||
"GitHub": "GitHub",
|
||||
"Downloading json": "Downloading json",
|
||||
"Select asset to download for ": "Select asset to download for ",
|
||||
|
||||
"Installing ": "Installing ",
|
||||
"Uninstalling ": "Uninstalling ",
|
||||
"Deleting ": "Deleting ",
|
||||
"Deleting": "Deleting",
|
||||
"Pasting ": "Pasting ",
|
||||
"Pasting": "Pasting",
|
||||
"Removing ": "Removing ",
|
||||
"Scanning ": "Scanning ",
|
||||
"Creating ": "Creating ",
|
||||
"Copying ": "Copying ",
|
||||
"Trying to load ": "Trying to load ",
|
||||
"Downloading ": "Downloading ",
|
||||
"Downloaded ": "Downloaded ",
|
||||
"Removed ": "Removed ",
|
||||
"Checking MD5": "Checking MD5",
|
||||
"Loading...": "Loading...",
|
||||
"Loading": "Loading",
|
||||
"Empty!": "Empty!",
|
||||
"Not Ready...": "Not Ready...",
|
||||
"Error loading page!": "Error loading page!",
|
||||
"Update avaliable: ": "Update avaliable: ",
|
||||
"Download update: ": "Download update: ",
|
||||
"Updated to ": "Updated to ",
|
||||
"Press OK to restart Sphaira": "Press OK to restart Sphaira",
|
||||
"Restart Sphaira?": "Restart Sphaira?",
|
||||
"Failed to download update": "Failed to download update",
|
||||
"Restore hbmenu?": "Restore hbmenu?",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "Failed to restore hbmenu, please re-download hbmenu",
|
||||
"Failed to restore hbmenu, using sphaira instead": "Failed to restore hbmenu, using sphaira instead",
|
||||
"Restored hbmenu, closing sphaira": "Restored hbmenu, closing sphaira",
|
||||
"Restored hbmenu": "Restored hbmenu",
|
||||
"Delete Selected files?": "Delete Selected files?",
|
||||
"Completely remove ": "Completely remove ",
|
||||
"Are you sure you want to delete ": "Are you sure you want to delete ",
|
||||
"Are you sure you wish to cancel?": "Are you sure you wish to cancel?",
|
||||
"If this message appears repeatedly, please open an issue.": "If this message appears repeatedly, please open an issue."
|
||||
}
|
||||
@@ -1,114 +1,255 @@
|
||||
{
|
||||
"Launch": "Lanzamiento",
|
||||
"[Applet Mode]": "[Modo Applet]",
|
||||
"No Internet": "Sin Internet",
|
||||
"Files": "Archivos",
|
||||
"Apps": "Apps",
|
||||
"Store": "Tienda",
|
||||
"Menu": "Menú",
|
||||
"Options": "Opciones",
|
||||
"Homebrew Options": "Opciones de elaboración casera",
|
||||
"OK": "OK",
|
||||
"Back": "Atrás",
|
||||
"Select": "Seleccionar",
|
||||
"Open": "Abrir",
|
||||
"Launch": "Ejecutar",
|
||||
"Info": "Información",
|
||||
"Install": "Instalar",
|
||||
"Delete": "Borrar",
|
||||
"Restart": "Reiniciar",
|
||||
"Changelog": "Log de cambios",
|
||||
"Details": "Detalles",
|
||||
"Update": "Actualizar",
|
||||
"Remove": "Borrar",
|
||||
"Restore": "Restaurar",
|
||||
"Download": "Descargar",
|
||||
"Next Page": "Página siguiente",
|
||||
"Prev Page": "Página anterior",
|
||||
"Unstar": "Quitar favorito",
|
||||
"Star": "Favorito",
|
||||
"System memory": "Memoria de sistema",
|
||||
"microSD card": "microSD",
|
||||
"Sd": "SD",
|
||||
"Image System memory": "Imagen memoria interna",
|
||||
"Image microSD card": "Imagen tarjeta microSD",
|
||||
"Slow": "Lento",
|
||||
"Normal": "Normal",
|
||||
"Fast": "Rápido",
|
||||
"Yes": "Sí",
|
||||
"No": "No",
|
||||
"Enabled": "Activado",
|
||||
"Disabled": "Desactivado",
|
||||
|
||||
"Sort By": "Ordenar por",
|
||||
"Sort Options": "Opciones de clasificación",
|
||||
"Updated": "Actualizado",
|
||||
"Size": "Tamaño",
|
||||
"Alphabetical": "Alfabético",
|
||||
"Decending": "Descendente",
|
||||
"Ascending": "Ascendente",
|
||||
"Filter": "Filtrar",
|
||||
"Sort": "Clasificar",
|
||||
"Order": "Orden",
|
||||
"Info": "Información",
|
||||
"Delete": "Borrar",
|
||||
"Hide Sphaira": "Ocultar Sphaira",
|
||||
"Are you sure you want to delete ": "¿Estás seguro de que quieres eliminar? ",
|
||||
"Install Forwarder": "Instalar reenviador",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ADVERTENCIA: ¡La instalación de reenviadores dará lugar a una prohibición!",
|
||||
"Back": "Atrás",
|
||||
"Install": "Instalar",
|
||||
"Fs": "fs",
|
||||
"App": "Aplicación",
|
||||
"Menu": "Menú",
|
||||
"Homebrew": "cerveza casera",
|
||||
"FileBrowser": "Explorador de archivos",
|
||||
"Open": "Abierto",
|
||||
"Search": "Buscar",
|
||||
"Updated": "Actualizado",
|
||||
"Updated (Star)": "Actualizado (favorito)",
|
||||
"Downloads": "Descargas",
|
||||
"Size": "Tamaño",
|
||||
"Size (Star)": "Tamaño (favorito)",
|
||||
"Alphabetical": "Alfabético",
|
||||
"Alphabetical (Star)": "Alfabético (favorito)",
|
||||
"Likes": "Me Gusta",
|
||||
"ID": "ID",
|
||||
"Descending": "Descendente",
|
||||
"Descending (down)": "Descendente (abajo)",
|
||||
"Desc": "Descendente",
|
||||
"Ascending": "Ascendente",
|
||||
"Ascending (Up)": "Ascendente (arriba)",
|
||||
"Asc": "Ascendente",
|
||||
|
||||
"Menu Options": "Opciones de menú",
|
||||
"Theme": "Tema",
|
||||
"Theme Options": "Opciones de tema",
|
||||
"Select Theme": "Seleccionar tema",
|
||||
"Shuffle": "Barajar",
|
||||
"Music": "Música",
|
||||
"Show Hidden": "Mostrar oculto",
|
||||
"Folders First": "Carpetas primero",
|
||||
"Hidden Last": "Oculto último",
|
||||
"Yes": "Sí",
|
||||
"No": "No",
|
||||
"Network": "Red",
|
||||
"Network Options": "Opciones de red",
|
||||
"Nxlink": "nxenlace",
|
||||
"Check for update": "Buscar actualizaciones",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "NXlink",
|
||||
"Nxlink Connected": "NXlink conectado",
|
||||
"Nxlink Upload": "NXlink subida",
|
||||
"Nxlink Finished": "NXlink finalizado",
|
||||
"Switch-Handheld!": "¡Switch-Modo-Portátil!",
|
||||
"Switch-Docked!": "¡Switch-Modo-TV!",
|
||||
"Language": "Idioma",
|
||||
"Auto": "Automático",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "Registro",
|
||||
"Replace hbmenu on exit": "Reemplazar hbmenu",
|
||||
"Misc": "Varios",
|
||||
"Misc Options": "Opciones varias",
|
||||
"Web": "Web",
|
||||
"Install forwarders": "Instalar forwarders",
|
||||
"Install location": "Dispositivo de instalación",
|
||||
"Show install warning": "Precaución de instalación",
|
||||
"Text scroll speed": "Velocidad de scroll",
|
||||
|
||||
"FileBrowser": "Explorador de archivos",
|
||||
"%zd files": "%zd archivos",
|
||||
"%zd dirs": "%zd carpetas",
|
||||
"File Options": "Opciones de archivo",
|
||||
"Show Hidden": "Mostrar archivos ocultos",
|
||||
"Folders First": "Carpetas primero",
|
||||
"Hidden Last": "Ocultos al final",
|
||||
"Cut": "Cortar",
|
||||
"Copy": "Copiar",
|
||||
"Rename": "Rebautizar",
|
||||
"Advanced Options": "Crear archivo",
|
||||
"Paste": "Pegar",
|
||||
"Paste ": "Pegar ",
|
||||
" file(s)?": " ¿archivo(s)?",
|
||||
"Rename": "Renombrar",
|
||||
"Set New File Name": "Establecer nuevo nombre de archivo",
|
||||
"Advanced": "Avanzado",
|
||||
"Advanced Options": "Opciones avanzadas",
|
||||
"Create File": "Crear archivo",
|
||||
"Set File Name": "Establecer nombre de archivo",
|
||||
"Create Folder": "Crear carpeta",
|
||||
"View as text": "Ver como texto",
|
||||
"Set Folder Name": "Establecer nombre de carpeta",
|
||||
"View as text (unfinished)": "Ver como texto (sin terminar)",
|
||||
"Set Archive Bit": "Establecer bit de archivo",
|
||||
"AppStore Options": "Opciones de la tienda de aplicaciones",
|
||||
"Ignore read only": "Ignorar sólo lectura",
|
||||
"Mount": "Montar",
|
||||
"Empty...": "Vacío...",
|
||||
"Open with DayBreak?": "¿Abrir con DayBreak?",
|
||||
"Launch ": "Abrir ",
|
||||
"Launch option for: ": "Opción de abrir con: ",
|
||||
"Select launcher for: ": "Seleccionar abrir con: ",
|
||||
|
||||
"Homebrew": "Homebrew",
|
||||
"Homebrew Options": "Opciones de Homebrew",
|
||||
"Hide Sphaira": "Ocultar Sphaira",
|
||||
"Install Forwarder": "Instalar Forwarder",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ADVERTENCIA: ¡La instalación de fordwarders podría producir un baneo de la consola!",
|
||||
"Installing Forwarder": "Instalando Forwarder",
|
||||
"Creating Program": "Creando Program",
|
||||
"Creating Control": "Creando Control",
|
||||
"Creating Meta": "Creando Meta",
|
||||
"Writing Nca": "Creando NCA",
|
||||
"Updating ncm databse": "Actualizando base de datos ncm",
|
||||
"Pushing application record": "Registro de aplicación",
|
||||
"Installed!": "¡Instalado!",
|
||||
"Failed to install forwarder": "Fallo al instalar forwarder",
|
||||
"Unstarred ": "Quitar Favorito",
|
||||
"Starred ": "Favorito",
|
||||
|
||||
"AppStore": "Tienda",
|
||||
"Filter: %s | Sort: %s | Order: %s": "Filtrar: %s | Clasificar: %s | Orden: %s",
|
||||
"AppStore Options": "Opciones de la Tienda",
|
||||
"All": "Todo",
|
||||
"Games": "Juegos",
|
||||
"Emulators": "Emuladores",
|
||||
"Tools": "Herramientas",
|
||||
"Advanced": "Avanzado",
|
||||
"Themes": "Temas",
|
||||
"Legacy": "Legado",
|
||||
"Misc": "Varios",
|
||||
"Downloads": "Descargas",
|
||||
"Filter": "Filtrar",
|
||||
"Search": "Buscar",
|
||||
"Menu Options": "Opciones de menú",
|
||||
"Header": "Encabezamiento",
|
||||
"Theme": "Tema",
|
||||
"Network": "Red",
|
||||
"Logging": "Explotación florestal",
|
||||
"Enabled": "Activado",
|
||||
"Disabled": "Desactivado",
|
||||
"Replace hbmenu on exit": "Reemplazar hbmenu al salir",
|
||||
"Misc Options": "Opciones varias",
|
||||
"Themezer": "Temazer",
|
||||
"Irs": "irs",
|
||||
"Web": "Web",
|
||||
"Download": "Descargar",
|
||||
"Next Page": "Página siguiente",
|
||||
"Prev Page": "Página anterior",
|
||||
"Pad ": "Almohadilla ",
|
||||
"version: %s": "version: %s",
|
||||
"updated: %s": "actualizado: %s",
|
||||
"category: %s": "categoría: %s",
|
||||
"extracted: %.2f MiB": "extraído: %.2f MiB",
|
||||
"app_dls: %s": "app_dls: %s",
|
||||
"More by Author": "Mostrar mas del Autor",
|
||||
"Leave Feedback": "Dejar Mensaje",
|
||||
|
||||
"Irs": "IRS",
|
||||
"Ambient Noise Level: ": "Nivel de Ruido Ambiente",
|
||||
"Controller": "Control",
|
||||
"Pad ": "GamePad ",
|
||||
" (Available)": " (Disponible)",
|
||||
" (Unsupported)": "(No Compatible)",
|
||||
" (Unconnected)": " (Desconectado)",
|
||||
"HandHeld": "Portátil",
|
||||
" (Available)": " (Disponible)",
|
||||
"0 (Sideways)": "0 (de lado)",
|
||||
"90 (Flat)": "90 (plano)",
|
||||
"180 (-Sideways)": "180 (-de lado)",
|
||||
"270 (Upside down)": "270 (al revés)",
|
||||
"Rotation": "Rotación",
|
||||
"0 (Sideways)": "0° (De lado)",
|
||||
"90 (Flat)": "90° (Plano)",
|
||||
"180 (-Sideways)": "180° (De lado)",
|
||||
"270 (Upside down)": "270° (Al revés)",
|
||||
"Colour": "Color",
|
||||
"Grey": "Gris",
|
||||
"Ironbow": "arco de hierro",
|
||||
"Ironbow": "Paleta térmica",
|
||||
"Green": "Verde",
|
||||
"Red": "Rojo",
|
||||
"Blue": "Azul",
|
||||
"All leds": "todos los leds",
|
||||
"Bright group": "grupo brillante",
|
||||
"Dim group": "grupo tenue",
|
||||
"None": "Ninguno",
|
||||
"Normal image": "imagen normal",
|
||||
"Negative image": "Imagen negativa",
|
||||
"320x240": "320x240",
|
||||
"160x120": "160x120",
|
||||
"80x60": "80x60",
|
||||
"40x30": "40x30",
|
||||
"20x15": "20x15",
|
||||
"Controller": "Controlador",
|
||||
"Rotation": "Rotación",
|
||||
"Colour": "Color",
|
||||
"Light Target": "Objetivo de luz",
|
||||
"Gain": "Ganar",
|
||||
"All leds": "Todos los leds",
|
||||
"Bright group": "Grupo brillo",
|
||||
"Dim group": "Grupo tenue",
|
||||
"None": "Ninguno",
|
||||
"Gain": "Ganancia",
|
||||
"Negative Image": "Imagen negativa",
|
||||
"Normal image": "Imagen normal",
|
||||
"Negative image": "Imagen negativa",
|
||||
"Format": "Formato",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "Formato de recorte",
|
||||
"External Light Filter": "Filtro de luz externo",
|
||||
"External Light Filter": "Filtro de luz externa",
|
||||
"Load Default": "Cargar predeterminado",
|
||||
"No Internet": "sin internet",
|
||||
"[Applet Mode]": "[Modo subprograma]",
|
||||
"Language": "Idioma"
|
||||
|
||||
"Themezer": "Themezer",
|
||||
"Themezer Options": "Opciones de Themezer",
|
||||
"Nsfw": "NSFW",
|
||||
"Page": "Página",
|
||||
"Page %zu / %zu": "Pág. %zu / %zu",
|
||||
"Enter Page Number": "Ingresar Número de Página",
|
||||
"Bad Page": "Página Errónea",
|
||||
"Download theme?": "¿Descargar Tema?",
|
||||
|
||||
"GitHub": "GitHub",
|
||||
"Downloading json": "Descargando json",
|
||||
"Select asset to download for ": "Seleccionar recurso a descargar para ",
|
||||
|
||||
"Installing ": "Instalando ",
|
||||
"Uninstalling ": "Desinstalando ",
|
||||
"Deleting ": "Borrando ",
|
||||
"Deleting": "Borrando",
|
||||
"Pasting ": "Pegando ",
|
||||
"Pasting": "Pegando",
|
||||
"Removing ": "Removiendo ",
|
||||
"Scanning ": "Escaneando ",
|
||||
"Creating ": "Creando ",
|
||||
"Copying ": "Copiando ",
|
||||
"Trying to load ": "Intentando cargar ",
|
||||
"Downloading ": "Descargando ",
|
||||
"Downloaded ": "Descargado ",
|
||||
"Removed ": "Removido ",
|
||||
"Checking MD5": "Chequeando MD5",
|
||||
"Loading...": "Cargando...",
|
||||
"Loading": "Cargando",
|
||||
"Empty!": "¡Vacío!",
|
||||
"Not Ready...": "No listo aún...",
|
||||
"Error loading page!": "¡Error cargando la página!",
|
||||
"Update avaliable: ": "Actualización disponible: ",
|
||||
"Download update: ": "Descargar actualización: ",
|
||||
"Updated to ": "Actualizado a ",
|
||||
"Press OK to restart Sphaira": "Presiona OK para reiniciar sphaira",
|
||||
"Restart Sphaira?": "¿Reiniciar sphaira?",
|
||||
"Failed to download update": "Fallo al descargar actualización",
|
||||
"Restore hbmenu?": "¿Restaurar hbmenu?",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "Fallo al encontrar /switch/hbmenu.nro\nUsar la Tienda para reinstalar hbmenu",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "Fallo al restaurar hbmenu, por favor volver a descargar hbmenu",
|
||||
"Failed to restore hbmenu, using sphaira instead": "Fallo al restaurar hbmenu, se usará sphaira",
|
||||
"Restored hbmenu, closing sphaira": "hbmenu restaurado, cerrando sphaira",
|
||||
"Restored hbmenu": "hbmenu restaurado",
|
||||
"Delete Selected files?": "¿Eliminar archivos seleccionados?",
|
||||
"Completely remove ": "Eliminar completamente",
|
||||
"Are you sure you want to delete ": "¿Estás seguro que quieres eliminar? ",
|
||||
"Are you sure you wish to cancel?": "¿Estás seguro que deseas cancelar?",
|
||||
"If this message appears repeatedly, please open an issue.": "Si este mensaje aparece repetidamente, por favor abrir un 'issue'."
|
||||
}
|
||||
|
||||
@@ -1,114 +1,255 @@
|
||||
{
|
||||
"Launch": "Lancement",
|
||||
"Options": "Possibilités",
|
||||
"Homebrew Options": "Options de brassage maison",
|
||||
"Sort By": "Trier par",
|
||||
"Sort Options": "Options de tri",
|
||||
"Updated": "Mis à jour",
|
||||
"Size": "Taille",
|
||||
"Alphabetical": "Alphabétique",
|
||||
"Decending": "Décroissant",
|
||||
"Ascending": "Ascendant",
|
||||
"Sort": "Trier",
|
||||
"Order": "Commande",
|
||||
"Info": "Informations",
|
||||
"Delete": "Supprimer",
|
||||
"Hide Sphaira": "Masquer Sphaira",
|
||||
"Are you sure you want to delete ": "Etes-vous sûr de vouloir supprimer ",
|
||||
"Install Forwarder": "Installer le redirecteur",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ATTENTION : L'installation de transitaires entraînera une interdiction !",
|
||||
"Back": "Dos",
|
||||
"Install": "Installer",
|
||||
"Fs": "Fs",
|
||||
"App": "Application",
|
||||
"[Applet Mode]": "[Mode Applet]",
|
||||
"No Internet": "Pas d'Internet",
|
||||
"Files": "Fichiers",
|
||||
"Apps": "Applications",
|
||||
"Store": "Magasin",
|
||||
"Menu": "Menu",
|
||||
"Homebrew": "Homebrew",
|
||||
"FileBrowser": "Navigateur de fichiers",
|
||||
"Options": "Options",
|
||||
"OK": "OK",
|
||||
"Back": "Retour",
|
||||
"Select": "Sélectionner",
|
||||
"Open": "Ouvrir",
|
||||
"Theme Options": "Options de thème",
|
||||
"Select Theme": "Sélectionnez un thème",
|
||||
"Shuffle": "Mélanger",
|
||||
"Music": "Musique",
|
||||
"Show Hidden": "Afficher masqué",
|
||||
"Folders First": "Les dossiers d'abord",
|
||||
"Hidden Last": "Dernier caché",
|
||||
"Launch": "Exécuter",
|
||||
"Info": "Info.",
|
||||
"Install": "Installer",
|
||||
"Delete": "Supprimer",
|
||||
"Restart": "Redémarrer",
|
||||
"Changelog": "Changelog",
|
||||
"Details": "Détails",
|
||||
"Update": "Mise à jour",
|
||||
"Remove": "Supprimer",
|
||||
"Restore": "Restaurer",
|
||||
"Download": "Télécharger",
|
||||
"Next Page": "Page Suiv.",
|
||||
"Prev Page": "Page Préc.",
|
||||
"Unstar": "Retirer des favories",
|
||||
"Star": "Ajouter aux favories",
|
||||
"System memory": "Mémoire système",
|
||||
"microSD card": "Carte microSD",
|
||||
"Sd": "Sd",
|
||||
"Image System memory": "Image de la mémoire System",
|
||||
"Image microSD card": "Image de la Carte microSD",
|
||||
"Slow": "Lent",
|
||||
"Normal": "Normal",
|
||||
"Fast": "Rapide",
|
||||
"Yes": "Oui",
|
||||
"No": "Non",
|
||||
"Network Options": "Options réseau",
|
||||
"Nxlink": "Nxlien",
|
||||
"Check for update": "Vérifier la mise à jour",
|
||||
"File Options": "Options de fichier",
|
||||
"Enabled": "Activé(e)",
|
||||
"Disabled": "Désactivé(e)",
|
||||
|
||||
"Sort By": "Tri Par",
|
||||
"Sort Options": "Options de Tri",
|
||||
"Filter": "Filtre",
|
||||
"Sort": "Tri",
|
||||
"Order": "Ordre",
|
||||
"Search": "Recherche",
|
||||
"Updated": "Mis à jour",
|
||||
"Updated (Star)": "Mis à jour (Favories)",
|
||||
"Downloads": "Téléchargements",
|
||||
"Size": "Taille",
|
||||
"Size (Star)": "Taille (Favories)",
|
||||
"Alphabetical": "Alphabétique",
|
||||
"Alphabetical (Star)": "Alphabétique (Favories)",
|
||||
"Likes": "Likes",
|
||||
"ID": "ID",
|
||||
"Descending": "Décroissant",
|
||||
"Descending (down)": "Décroissant",
|
||||
"Desc": "Décroissant",
|
||||
"Ascending": "Croissant",
|
||||
"Ascending (Up)": "Croissant",
|
||||
"Asc": "Croissant",
|
||||
|
||||
"Menu Options": "Options des Menus",
|
||||
"Theme": "Thème",
|
||||
"Theme Options": "Options de Thème",
|
||||
"Select Theme": "Choisir un Thème",
|
||||
"Shuffle": "Aléatoire",
|
||||
"Music": "Musique",
|
||||
"Network": "Réseau",
|
||||
"Network Options": "Options Réseau",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Nxlink Connected": "Nxlink Connecté",
|
||||
"Nxlink Upload": "Nxlink téléversement",
|
||||
"Nxlink Finished": "Nxlink terminé",
|
||||
"Switch-Handheld!": "Switch-Portable",
|
||||
"Switch-Docked!": "Switch-Dockée",
|
||||
"Language": "Langue",
|
||||
"Auto": "Auto",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "Journalisation",
|
||||
"Replace hbmenu on exit": "Remplacer hbmenu quand quitté",
|
||||
"Misc": "Divers",
|
||||
"Misc Options": "Options Diverses",
|
||||
"Web": "Web",
|
||||
"Install forwarders": "Installer les Forwarders",
|
||||
"Install location": "Emplacement d'installation",
|
||||
"Show install warning": "Afficher l'avertissement d'installation",
|
||||
"Text scroll speed": "Vitesse de défilement du texte",
|
||||
|
||||
"FileBrowser": "Explorateur de Fichiers",
|
||||
"%zd files": "%zd fichiers",
|
||||
"%zd dirs": "%zd dossiers",
|
||||
"File Options": "Options de Fichier",
|
||||
"Show Hidden": "Afficher Masqués",
|
||||
"Folders First": "Dossiers en Premier",
|
||||
"Hidden Last": "Masqués en Dernier",
|
||||
"Cut": "Couper",
|
||||
"Copy": "Copie",
|
||||
"Rename": "Rebaptiser",
|
||||
"Advanced Options": "Créer un fichier",
|
||||
"Create File": "Créer un fichier",
|
||||
"Create Folder": "Créer un dossier",
|
||||
"View as text": "Afficher sous forme de texte",
|
||||
"Copy": "Copier",
|
||||
"Paste": "Coller",
|
||||
"Paste ": "Coller ",
|
||||
" file(s)?": " fichier(s)?",
|
||||
"Rename": "Renommer",
|
||||
"Set New File Name": "Nouveau Nom Du Fichier",
|
||||
"Advanced": "Avancé",
|
||||
"Advanced Options": "Options Avancées",
|
||||
"Create File": "Créer un Fichier",
|
||||
"Set File Name": "Nommer Le Fichier",
|
||||
"Create Folder": "Créer un Dossier",
|
||||
"Set Folder Name": "Nommer Le Dossier",
|
||||
"View as text (unfinished)": "Afficher sous forme de texte (inachevé)",
|
||||
"Set Archive Bit": "Définir le bit d'archive",
|
||||
"Ignore read only": "Ignorer lecture seule",
|
||||
"Mount": "Monter",
|
||||
"Empty...": "Vide...",
|
||||
"Open with DayBreak?": "Ouvrir avec DayBreak?",
|
||||
"Launch ": "Lancer ",
|
||||
"Launch option for: ": "Option de lancement pour: ",
|
||||
"Select launcher for: ": "Sélectionner le lanceur pour: ",
|
||||
|
||||
"Homebrew": "Homebrew",
|
||||
"Homebrew Options": "Options Homebrew",
|
||||
"Hide Sphaira": "Masquer Sphaira",
|
||||
"Install Forwarder": "Installer le Forwarder",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ATTENTION: L'installation de forwarders entraînera un ban!",
|
||||
"Installing Forwarder": "Installation Du Forwarder",
|
||||
"Creating Program": "Création de Program",
|
||||
"Creating Control": "Création de Control",
|
||||
"Creating Meta": "Création de Meta",
|
||||
"Writing Nca": "Ecriture NCA",
|
||||
"Updating ncm databse": "Mise à jour de ncm databse",
|
||||
"Pushing application record": "Ajout de l'enregistrement de l'application",
|
||||
"Installed!": "Installé!",
|
||||
"Failed to install forwarder": "Echec de l'installation du forwarder",
|
||||
"Unstarred ": "Retiré des favories ",
|
||||
"Starred ": "Ajouté aux favories ",
|
||||
|
||||
"AppStore": "AppStore",
|
||||
"Filter: %s | Sort: %s | Order: %s": "Filtre: %s | Tri: %s | Ordre: %s",
|
||||
"AppStore Options": "Options de l'AppStore",
|
||||
"All": "Tous",
|
||||
"Games": "Jeux",
|
||||
"Emulators": "Émulateurs",
|
||||
"Tools": "Outils",
|
||||
"Advanced": "Avancé",
|
||||
"Themes": "Thèmes",
|
||||
"Legacy": "Héritage",
|
||||
"Misc": "Divers",
|
||||
"Downloads": "Téléchargements",
|
||||
"Filter": "Filtre",
|
||||
"Search": "Recherche",
|
||||
"Menu Options": "Options des menus",
|
||||
"Header": "En-tête",
|
||||
"Theme": "Thème",
|
||||
"Network": "Réseau",
|
||||
"Logging": "Enregistrement",
|
||||
"Enabled": "Activé",
|
||||
"Disabled": "Désactivé",
|
||||
"Replace hbmenu on exit": "Remplacer hbmenu à la sortie",
|
||||
"Misc Options": "Diverses options",
|
||||
"Themezer": "Thème",
|
||||
"Legacy": "Legacy",
|
||||
"version: %s": "version: %s",
|
||||
"updated: %s": "Mis à jour: %s",
|
||||
"category: %s": "catégorie: %s",
|
||||
"extracted: %.2f MiB": "Extrait: %.2f MiB",
|
||||
"app_dls: %s": "app_dls: %s",
|
||||
"More by Author": "Plus de cet Auteur",
|
||||
"Leave Feedback": "Laisser un avis",
|
||||
|
||||
"Irs": "Irs",
|
||||
"Web": "Web",
|
||||
"Download": "Télécharger",
|
||||
"Next Page": "Page suivante",
|
||||
"Prev Page": "Page précédente",
|
||||
"Pad ": "Tampon ",
|
||||
" (Unconnected)": " (Sans rapport)",
|
||||
"HandHeld": "Portable",
|
||||
"Ambient Noise Level: ": "Niveau De Bruit Ambiant: ",
|
||||
"Controller": "Contrôleur",
|
||||
"Pad ": "Manette ",
|
||||
" (Available)": " (Disponible)",
|
||||
"0 (Sideways)": "0 (latéralement)",
|
||||
"90 (Flat)": "90 (plat)",
|
||||
"180 (-Sideways)": "180 (-Côté)",
|
||||
"270 (Upside down)": "270 (à l'envers)",
|
||||
" (Unsupported)": "Non supporté",
|
||||
" (Unconnected)": " (Non connectée)",
|
||||
"HandHeld": "Portable",
|
||||
"Rotation": "Rotation",
|
||||
"0 (Sideways)": "0 (Paysage)",
|
||||
"90 (Flat)": "90 (Portrait)",
|
||||
"180 (-Sideways)": "180 (-Paysage)",
|
||||
"270 (Upside down)": "270 (Inversé)",
|
||||
"Colour": "Couleur",
|
||||
"Grey": "Gris",
|
||||
"Ironbow": "Arc de fer",
|
||||
"Ironbow": "Ironbow",
|
||||
"Green": "Vert",
|
||||
"Red": "Rouge",
|
||||
"Blue": "Bleu",
|
||||
"Light Target": "Luminosité",
|
||||
"All leds": "Toutes les LED",
|
||||
"Bright group": "Groupe lumineux",
|
||||
"Dim group": "Groupe de gradation",
|
||||
"Dim group": "Groupe sombre",
|
||||
"None": "Aucun",
|
||||
"Gain": "Gain",
|
||||
"Negative Image": "Négatif",
|
||||
"Normal image": "Image normale",
|
||||
"Negative image": "Image négative",
|
||||
"320x240": "320x240",
|
||||
"160x120": "160x120",
|
||||
"80x60": "80x60",
|
||||
"40x30": "40x30",
|
||||
"20x15": "20x15",
|
||||
"Controller": "Contrôleur",
|
||||
"Rotation": "Rotation",
|
||||
"Colour": "Couleur",
|
||||
"Light Target": "Cible légère",
|
||||
"Gain": "Gagner",
|
||||
"Negative Image": "Image négative",
|
||||
"Negative image": "Négatif",
|
||||
"Format": "Format",
|
||||
"Trimming Format": "Format de découpage",
|
||||
"External Light Filter": "Filtre de lumière externe",
|
||||
"Load Default": "Charger par défaut",
|
||||
"No Internet": "Pas d'Internet",
|
||||
"[Applet Mode]": "[Mode Applet]",
|
||||
"Language": "Langue"
|
||||
}
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "Format de Découpe",
|
||||
"External Light Filter": "Filtre de Lumière Externe",
|
||||
"Load Default": "Charger par Défaut",
|
||||
|
||||
"Themezer": "Themezer",
|
||||
"Themezer Options": "Options Themezer",
|
||||
"Nsfw": "Nsfw",
|
||||
"Page": "Page",
|
||||
"Page %zu / %zu": "Page %zu / %zu",
|
||||
"Enter Page Number": "Entrez Un Numéro De Page",
|
||||
"Bad Page": "Page inexistante",
|
||||
"Download theme?": "Télécharger le thème?",
|
||||
|
||||
"GitHub": "GitHub",
|
||||
"Downloading json": "Téléchargement du json",
|
||||
"Select asset to download for ": "Sélectionner l'asset pour télécharger ",
|
||||
|
||||
"Installing ": "Installation ",
|
||||
"Uninstalling ": "Désinstallation ",
|
||||
"Deleting ": "Suppression ",
|
||||
"Deleting": "Suppression",
|
||||
"Pasting ": "Coller ",
|
||||
"Pasting": "Coller",
|
||||
"Removing ": "Suppression ",
|
||||
"Scanning ": "Scan ",
|
||||
"Creating ": "Création ",
|
||||
"Copying ": "Copie ",
|
||||
"Trying to load ": "Tente de charger ",
|
||||
"Downloading ": "Téléchargement ",
|
||||
"Downloaded ": "Téléchargé",
|
||||
"Removed ": "Supprimé ",
|
||||
"Checking MD5": "Vérification MD5",
|
||||
"Loading...": "Chargement...",
|
||||
"Loading": "Chargement",
|
||||
"Empty!": "Vide!",
|
||||
"Not Ready...": "Pas prêt",
|
||||
"Error loading page!": "Erreur du chargement de la page!",
|
||||
"Update avaliable: ": "Mise à jour disponible: ",
|
||||
"Download update: ": "Télécharger la mise à jour: ",
|
||||
"Updated to ": "Mis à jour vers ",
|
||||
"Press OK to restart Sphaira": "Appuyez sur OK pour redémarrer Sphaira",
|
||||
"Restart Sphaira?": "Redémarrer Sphaira?",
|
||||
"Failed to download update": "Echec du téléchargement de la mise à jour",
|
||||
"Restore hbmenu?": "Restaurer hbmenu?",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "/switch/hbmenu.nro n'a pas été trouvé\nUtiliser l'Appstore pour réinstaller le hbmenu",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "Echec de la restauration de hbmenu, veuillez le réinstaller",
|
||||
"Failed to restore hbmenu, using sphaira instead": "Echec de la restauration de hbmenu, sphaira sera utilisé à la place",
|
||||
"Restored hbmenu, closing sphaira": "Hbmenu restauré, fermeture de sphaira",
|
||||
"Restored hbmenu": "Hbmenu restauré",
|
||||
"Delete Selected files?": "Supprimer les fichiers sélectionnés?",
|
||||
"Completely remove ": "Supprimer totalement ",
|
||||
"Are you sure you want to delete ": "Êtes-vous sûr de vouloir supprimer ",
|
||||
"Are you sure you wish to cancel?": "Souhaitez-vous vraiment annuler?",
|
||||
"If this message appears repeatedly, please open an issue.": "Si ce message apparait en boucle veuillez ouvrir une issue."
|
||||
}
|
||||
@@ -1,114 +1,255 @@
|
||||
{
|
||||
"Launch": "Lancio",
|
||||
"Options": "Opzioni",
|
||||
"Homebrew Options": "Opzioni per l'homebrew",
|
||||
"Sort By": "Ordina per",
|
||||
"Sort Options": "Opzioni di ordinamento",
|
||||
"Updated": "Aggiornato",
|
||||
"Size": "Misurare",
|
||||
"Alphabetical": "Alfabetico",
|
||||
"Decending": "Decrescente",
|
||||
"Ascending": "Ascendente",
|
||||
"Sort": "Ordinare",
|
||||
"Order": "Ordine",
|
||||
"Info": "Informazioni",
|
||||
"Delete": "Eliminare",
|
||||
"Hide Sphaira": "Nascondi Sphaira",
|
||||
"Are you sure you want to delete ": "Sei sicuro di voler eliminare? ",
|
||||
"Install Forwarder": "Installa lo spedizioniere",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ATTENZIONE: l'installazione di forwarder porterà al ban!",
|
||||
"Back": "Indietro",
|
||||
"Install": "Installare",
|
||||
"Fs": "Fs",
|
||||
"App": "App",
|
||||
"[Applet Mode]": "[Modalità applet]",
|
||||
"No Internet": "Niente Internet",
|
||||
"Files": "File",
|
||||
"Apps": "App",
|
||||
"Store": "Store",
|
||||
"Menu": "Menu",
|
||||
"Homebrew": "Birra fatta in casa",
|
||||
"FileBrowser": "FileBrowser",
|
||||
"Open": "Aprire",
|
||||
"Theme Options": "Opzioni del tema",
|
||||
"Select Theme": "Seleziona Tema",
|
||||
"Options": "Opzioni",
|
||||
"OK": "OK",
|
||||
"Back": "Indietro",
|
||||
"Select": "Seleziona",
|
||||
"Open": "Apri",
|
||||
"Launch": "Lancia",
|
||||
"Info": "Informazioni",
|
||||
"Install": "Installa",
|
||||
"Delete": "Elimina",
|
||||
"Restart": "Riavvia",
|
||||
"Changelog": "Patch notes",
|
||||
"Details": "Dettagli",
|
||||
"Update": "Aggiorna",
|
||||
"Remove": "Rimuovi",
|
||||
"Restore": "Ripristina",
|
||||
"Download": "Download",
|
||||
"Next Page": "Pagina successiva",
|
||||
"Prev Page": "Pagina precedente",
|
||||
"Unstar": "Rimuovi dai preferiti",
|
||||
"Star": "Aggiungi ai preferiti",
|
||||
"System memory": "Memoria di sistema",
|
||||
"microSD card": "Scheda microSD",
|
||||
"Sd": "SD",
|
||||
"Image System memory": "Immagine memoria di sistema",
|
||||
"Image microSD card": "Immagine scheda microSD",
|
||||
"Slow": "",
|
||||
"Normal": "",
|
||||
"Fast": "",
|
||||
"Yes": "Sì",
|
||||
"No": "No",
|
||||
"Enabled": "Abilitato",
|
||||
"Disabled": "Disabilitato",
|
||||
|
||||
"Sort By": "Ordina per",
|
||||
"Sort Options": "Opzioni filtro",
|
||||
"Filter": "Filtro",
|
||||
"Sort": "Riordina",
|
||||
"Order": "Ordina",
|
||||
"Search": "Ricerca",
|
||||
"Updated": "Aggiornato",
|
||||
"Updated (Star)": "",
|
||||
"Downloads": "Download",
|
||||
"Size": "Dimensione",
|
||||
"Size (Star)": "Dimensione (Preferiti)",
|
||||
"Alphabetical": "Alfabetico",
|
||||
"Alphabetical (Star)": "Alfabetico (Preferiti)",
|
||||
"Likes": "Mi Piace",
|
||||
"ID": "ID",
|
||||
"Descending": "Decrescente",
|
||||
"Descending (down)": "Decrescente",
|
||||
"Desc": "Decrescente",
|
||||
"Ascending": "Crescente",
|
||||
"Ascending (Up)": "Crescente",
|
||||
"Asc": "Crescente",
|
||||
|
||||
"Menu Options": "Opzioni menu",
|
||||
"Theme": "Tema",
|
||||
"Theme Options": "Opzioni tema",
|
||||
"Select Theme": "Seleziona tema",
|
||||
"Shuffle": "Mescola",
|
||||
"Music": "Musica",
|
||||
"Network": "Rete",
|
||||
"Network Options": "Opzioni di rete",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Nxlink Connected": "Nxlink connesso",
|
||||
"Nxlink Upload": "Nxlink upload",
|
||||
"Nxlink Finished": "Nxlink finito",
|
||||
"Switch-Handheld!": "Switch Portatile",
|
||||
"Switch-Docked!": "Switch Dock",
|
||||
"Language": "Lingua",
|
||||
"Auto": "Auto",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "Logging",
|
||||
"Replace hbmenu on exit": "Sostituisci hbmenu all'uscita",
|
||||
"Misc": "Varie",
|
||||
"Misc Options": "Opzioni varie",
|
||||
"Web": "Rete",
|
||||
"Install forwarders": "Installa forwarder",
|
||||
"Install location": "Installa posizione",
|
||||
"Show install warning": "Mostra avvertimento installazione",
|
||||
"Text scroll speed": "",
|
||||
|
||||
"FileBrowser": "FileBrowser",
|
||||
"%zd files": "%zd files",
|
||||
"%zd dirs": "%zd dirs",
|
||||
"File Options": "Opzioni file",
|
||||
"Show Hidden": "Mostra nascosto",
|
||||
"Folders First": "Prima le cartelle",
|
||||
"Hidden Last": "Ultimo nascosto",
|
||||
"Yes": "SÌ",
|
||||
"No": "NO",
|
||||
"Network Options": "Opzioni di rete",
|
||||
"Nxlink": "Nxlink",
|
||||
"Check for update": "Controlla l'aggiornamento",
|
||||
"File Options": "Opzioni file",
|
||||
"Cut": "Taglio",
|
||||
"Cut": "Taglia",
|
||||
"Copy": "Copia",
|
||||
"Rename": "Rinominare",
|
||||
"Advanced Options": "Crea file",
|
||||
"Paste": "Incolla",
|
||||
"Paste ": "Incolla ",
|
||||
" file(s)?": "(i)file?",
|
||||
"Rename": "Rinomina",
|
||||
"Set New File Name": "Imposta nuovo nome",
|
||||
"Advanced": "Avanzato",
|
||||
"Advanced Options": "Opzioni avanzate",
|
||||
"Create File": "Crea file",
|
||||
"Set File Name": "Imposta nome",
|
||||
"Create Folder": "Crea cartella",
|
||||
"View as text": "Visualizza come testo",
|
||||
"Set Folder Name": "Imposta nome",
|
||||
"View as text (unfinished)": "Visualizza come testo (non finito)",
|
||||
"Set Archive Bit": "Imposta bit di archivio",
|
||||
"Ignore read only": "Ignora read only",
|
||||
"Mount": "Monta",
|
||||
"Empty...": "Vuoto...",
|
||||
"Open with DayBreak?": "Vuoi aprire con Daybreak?",
|
||||
"Launch ": "Lancia",
|
||||
"Launch option for: ": "Lancia opzione per",
|
||||
"Select launcher for: ": "Scegli launcher per",
|
||||
|
||||
"Homebrew": "Homebrew",
|
||||
"Homebrew Options": "Opzioni Homebrew",
|
||||
"Hide Sphaira": "Nascondi Sphaira",
|
||||
"Install Forwarder": "Installa forwarder",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ATTENZIONE: l'installazione di forwarder porterà al ban!",
|
||||
"Installing Forwarder": "",
|
||||
"Creating Program": "",
|
||||
"Creating Control": "",
|
||||
"Creating Meta": "",
|
||||
"Writing Nca": "",
|
||||
"Updating ncm databse": "",
|
||||
"Pushing application record": "",
|
||||
"Installed!": "",
|
||||
"Failed to install forwarder": "",
|
||||
"Unstarred ": "",
|
||||
"Starred ": "",
|
||||
|
||||
"AppStore": "",
|
||||
"Filter: %s | Sort: %s | Order: %s": "Filtro: %s | Riordina: %s | Ordina: %s",
|
||||
"AppStore Options": "Opzioni dell'App Store",
|
||||
"All": "Tutto",
|
||||
"Games": "Giochi",
|
||||
"Emulators": "Emulatori",
|
||||
"Tools": "Utensili",
|
||||
"Advanced": "Avanzato",
|
||||
"Tools": "Strumenti",
|
||||
"Themes": "Temi",
|
||||
"Legacy": "Eredità",
|
||||
"Misc": "Varie",
|
||||
"Downloads": "Download",
|
||||
"Filter": "Filtro",
|
||||
"Search": "Ricerca",
|
||||
"Menu Options": "Opzioni del menu",
|
||||
"Header": "Intestazione",
|
||||
"Theme": "Tema",
|
||||
"Network": "Rete",
|
||||
"Logging": "Registrazione",
|
||||
"Enabled": "Abilitato",
|
||||
"Disabled": "Disabilitato",
|
||||
"Replace hbmenu on exit": "Sostituisci hbmenu all'uscita",
|
||||
"Misc Options": "Opzioni varie",
|
||||
"Themezer": "Themezer",
|
||||
"Legacy": "Legacy",
|
||||
"version: %s": "version: %s",
|
||||
"updated: %s": "updated: %s",
|
||||
"category: %s": "category: %s",
|
||||
"extracted: %.2f MiB": "extracted: %.2f MiB",
|
||||
"app_dls: %s": "app_dls: %s",
|
||||
"More by Author": "",
|
||||
"Leave Feedback": "",
|
||||
|
||||
"Irs": "Irs",
|
||||
"Web": "Rete",
|
||||
"Download": "Scaricamento",
|
||||
"Next Page": "Pagina successiva",
|
||||
"Prev Page": "Pagina precedente",
|
||||
"Ambient Noise Level: ": "",
|
||||
"Controller": "Controller",
|
||||
"Pad ": "Pad ",
|
||||
" (Unconnected)": " (Non connesso)",
|
||||
"HandHeld": "Tenuto in mano",
|
||||
" (Available)": " (Disponibile)",
|
||||
"0 (Sideways)": "0 (lateralmente)",
|
||||
" (Unsupported)": "",
|
||||
" (Unconnected)": " (Non connesso)",
|
||||
"HandHeld": "HandHeld",
|
||||
"Rotation": "Rotazione",
|
||||
"0 (Sideways)": "0 (Di lato)",
|
||||
"90 (Flat)": "90 (Piatto)",
|
||||
"180 (-Sideways)": "180 (-lateralmente)",
|
||||
"180 (-Sideways)": "180 (-Di lato)",
|
||||
"270 (Upside down)": "270 (Capovolto)",
|
||||
"Colour": "Colore",
|
||||
"Grey": "Grigio",
|
||||
"Ironbow": "Arco di ferro",
|
||||
"Ironbow": "Ironbow",
|
||||
"Green": "Verde",
|
||||
"Red": "Rosso",
|
||||
"Blue": "Blu",
|
||||
"Light Target": "Bersaglio leggero",
|
||||
"All leds": "Tutti i led",
|
||||
"Bright group": "Gruppo brillante",
|
||||
"Dim group": "Gruppo debole",
|
||||
"None": "Nessuno",
|
||||
"Normal image": "Immagine normale",
|
||||
"Negative image": "Immagine negativa",
|
||||
"320x240": "320x240",
|
||||
"160x120": "160x120",
|
||||
"80x60": "80x60",
|
||||
"40x30": "40x30",
|
||||
"20x15": "20×15",
|
||||
"Controller": "Controllore",
|
||||
"Rotation": "Rotazione",
|
||||
"Colour": "Colore",
|
||||
"Light Target": "Bersaglio leggero",
|
||||
"Gain": "Guadagno",
|
||||
"Negative Image": "Immagine negativa",
|
||||
"Normal image": "Immagine normale",
|
||||
"Negative image": "Immagine negativa",
|
||||
"Format": "Formato",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "Formato di ritaglio",
|
||||
"External Light Filter": "Filtro luce esterno",
|
||||
"Load Default": "Carica predefinito",
|
||||
"No Internet": "Niente Internet",
|
||||
"[Applet Mode]": "[Modalità applet]",
|
||||
"Language": "Lingua"
|
||||
}
|
||||
|
||||
"Themezer": "Themezer",
|
||||
"Themezer Options": "",
|
||||
"Nsfw": "",
|
||||
"Page": "",
|
||||
"Page %zu / %zu": "Page %zu / %zu",
|
||||
"Enter Page Number": "",
|
||||
"Bad Page": "",
|
||||
"Download theme?": "",
|
||||
|
||||
"GitHub": "",
|
||||
"Downloading json": "",
|
||||
"Select asset to download for ": "",
|
||||
|
||||
"Installing ": "",
|
||||
"Uninstalling ": "",
|
||||
"Deleting ": "",
|
||||
"Deleting": "",
|
||||
"Pasting ": "",
|
||||
"Pasting": "",
|
||||
"Removing ": "",
|
||||
"Scanning ": "",
|
||||
"Creating ": "",
|
||||
"Copying ": "",
|
||||
"Trying to load ": "",
|
||||
"Downloading ": "",
|
||||
"Downloaded ": "",
|
||||
"Removed ": "",
|
||||
"Checking MD5": "",
|
||||
"Loading...": "",
|
||||
"Loading": "",
|
||||
"Empty!": "",
|
||||
"Not Ready...": "",
|
||||
"Error loading page!": "",
|
||||
"Update avaliable: ": "",
|
||||
"Download update: ": "",
|
||||
"Updated to ": "",
|
||||
"Press OK to restart Sphaira": "",
|
||||
"Restart Sphaira?": "",
|
||||
"Failed to download update": "",
|
||||
"Restore hbmenu?": "",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "",
|
||||
"Failed to restore hbmenu, using sphaira instead": "",
|
||||
"Restored hbmenu, closing sphaira": "",
|
||||
"Restored hbmenu": "",
|
||||
"Delete Selected files?": "",
|
||||
"Completely remove ": "",
|
||||
"Are you sure you want to delete ": "Sei sicuro di voler eliminare? ",
|
||||
"Are you sure you wish to cancel?": "",
|
||||
"If this message appears repeatedly, please open an issue.": ""
|
||||
}
|
||||
@@ -1,114 +1,255 @@
|
||||
{
|
||||
"Launch": "打ち上げ",
|
||||
"Options": "オプション",
|
||||
"Homebrew Options": "自作オプション",
|
||||
"Sort By": "並べ替え",
|
||||
"Sort Options": "並べ替えオプション",
|
||||
"Updated": "更新されました",
|
||||
"Size": "サイズ",
|
||||
"Alphabetical": "アルファベット順",
|
||||
"Decending": "降順",
|
||||
"Ascending": "上昇",
|
||||
"Sort": "選別",
|
||||
"Order": "注文",
|
||||
"Info": "情報",
|
||||
"Delete": "消去",
|
||||
"Hide Sphaira": "ハイド・スファイラ",
|
||||
"Are you sure you want to delete ": "削除してもよろしいですか ",
|
||||
"Install Forwarder": "フォワーダーのインストール",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "警告: フォワーダーをインストールすると禁止されます。",
|
||||
"Back": "戻る",
|
||||
"Install": "インストール",
|
||||
"Fs": "Fs",
|
||||
"App": "アプリ",
|
||||
"[Applet Mode]": "[Appletモード]",
|
||||
"No Internet": "インターネットなし",
|
||||
"Files": "ファイル",
|
||||
"Apps": "アプリ",
|
||||
"Store": "AppStore",
|
||||
"Menu": "メニュー",
|
||||
"Homebrew": "自作",
|
||||
"FileBrowser": "ファイルブラウザ",
|
||||
"Open": "開ける",
|
||||
"Theme Options": "テーマのオプション",
|
||||
"Select Theme": "テーマの選択",
|
||||
"Shuffle": "シャッフル",
|
||||
"Music": "音楽",
|
||||
"Show Hidden": "非表示を表示",
|
||||
"Folders First": "フォルダーを最初に",
|
||||
"Hidden Last": "隠された最後",
|
||||
"Options": "設定",
|
||||
"OK": "確認",
|
||||
"Back": "戻る",
|
||||
"Select": "選択",
|
||||
"Open": "開く",
|
||||
"Launch": "起動",
|
||||
"Info": "情報",
|
||||
"Install": "インストール",
|
||||
"Delete": "削除",
|
||||
"Restart": "再起動",
|
||||
"Changelog": "リリースノート",
|
||||
"Details": "詳細",
|
||||
"Update": "アップデート",
|
||||
"Remove": "除去",
|
||||
"Restore": "復元",
|
||||
"Download": "ダウンロード",
|
||||
"Next Page": "次のページ",
|
||||
"Prev Page": "前のページ",
|
||||
"Unstar": "お気に入り解除",
|
||||
"Star": "お気に入り",
|
||||
"System memory": "システムメモリ",
|
||||
"microSD card": "SDメモリーカード",
|
||||
"Sd": "SDメモリーカード",
|
||||
"Image System memory": "システムメモリイメージ",
|
||||
"Image microSD card": "SDイメージ",
|
||||
"Slow": "遅い",
|
||||
"Normal": "普通",
|
||||
"Fast": "速い",
|
||||
"Yes": "はい",
|
||||
"No": "いいえ",
|
||||
"Network Options": "ネットワークオプション",
|
||||
"Enabled": "",
|
||||
"Disabled": "",
|
||||
|
||||
"Sort By": "並べ替え",
|
||||
"Sort Options": "並べ替え設定",
|
||||
"Filter": "フィルター",
|
||||
"Sort": "並べ替え",
|
||||
"Order": "順番",
|
||||
"Search": "検索",
|
||||
"Updated": "アップデート順",
|
||||
"Updated (Star)": "アップデート順(お気に入り)",
|
||||
"Downloads": "ダウンロード順",
|
||||
"Size": "ファイルサイズ",
|
||||
"Size (Star)": "ファイルサイズ(お気に入り)",
|
||||
"Alphabetical": "アルファベット順",
|
||||
"Alphabetical (Star)": "アルファベット順(お気に入り)",
|
||||
"Likes": "いいね順",
|
||||
"ID": "デベロッパー順",
|
||||
"Descending": "降順",
|
||||
"Descending (down)": "降順",
|
||||
"Desc": "降順",
|
||||
"Ascending": "上昇",
|
||||
"Ascending (Up)": "上昇",
|
||||
"Asc": "上昇",
|
||||
|
||||
"Menu Options": "メニュー設定",
|
||||
"Theme": "テーマ",
|
||||
"Theme Options": "テーマ設定",
|
||||
"Select Theme": "テーマを選ぶ",
|
||||
"Shuffle": "シャッフル",
|
||||
"Music": "BGM",
|
||||
"Network": "ネットワーク",
|
||||
"Network Options": "ネットワーク設定",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Check for update": "アップデートを確認する",
|
||||
"File Options": "ファイルオプション",
|
||||
"Cut": "カット",
|
||||
"Nxlink Connected": "Nxlink 接続",
|
||||
"Nxlink Upload": "Nxlink アップロード",
|
||||
"Nxlink Finished": "Nxlink 終了",
|
||||
"Switch-Handheld!": "ハンドヘルド!",
|
||||
"Switch-Docked!": "ドック接続!",
|
||||
"Language": "言語",
|
||||
"Auto": "自動",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "ログの取得",
|
||||
"Replace hbmenu on exit": "終了時に hbmenu を置き換える",
|
||||
"Misc": "その他",
|
||||
"Misc Options": "その他",
|
||||
"Web": "ウェブブラウザ",
|
||||
"Install forwarders": "Forwarderのインストール機能",
|
||||
"Install location": "インストール経路",
|
||||
"Show install warning": "警告文を示す",
|
||||
"Text scroll speed": "流れる文字の速さ",
|
||||
|
||||
"FileBrowser": "ファイルブラウザ",
|
||||
"%zd files": "%zd個のファイル",
|
||||
"%zd dirs": "%zd個のフォルダー",
|
||||
"File Options": "ファイル設定",
|
||||
"Show Hidden": "非表示ファイルを表示",
|
||||
"Folders First": "フォルダーを優先",
|
||||
"Hidden Last": "非表示ファイルを劣後",
|
||||
"Cut": "切り取り",
|
||||
"Copy": "コピー",
|
||||
"Paste": "ペースト",
|
||||
"Paste ": " ",
|
||||
" file(s)?": "個のファイルをペーストしますか?",
|
||||
"Rename": "名前の変更",
|
||||
"Advanced Options": "ファイルの作成",
|
||||
"Set New File Name": "新しい名前を入力",
|
||||
"Advanced": "高度な",
|
||||
"Advanced Options": "高度設定",
|
||||
"Create File": "ファイルの作成",
|
||||
"Set File Name": "名前を入力",
|
||||
"Create Folder": "フォルダーの作成",
|
||||
"View as text": "テキストとして表示",
|
||||
"Set Folder Name": "名前を入力",
|
||||
"View as text (unfinished)": "テキストとして表示 (未完成)",
|
||||
"Set Archive Bit": "アーカイブビットの設定",
|
||||
"AppStore Options": "AppStore オプション",
|
||||
"Ignore read only": "読み取り専用を無視する",
|
||||
"Mount": "マウント",
|
||||
"Empty...": "このフォルダーは空です",
|
||||
"Open with DayBreak?": "DayBreakで開きますか?",
|
||||
"Launch ": "起動しますか",
|
||||
"Launch option for: ": "起動設定: ",
|
||||
"Select launcher for: ": "起動ランチャーを選ぶ: ",
|
||||
|
||||
"Homebrew": "Homebrew",
|
||||
"Homebrew Options": "Homebrew設定",
|
||||
"Hide Sphaira": "Sphairaを非表示",
|
||||
"Install Forwarder": "Forwarderのインストール",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "警告: ForwarderをインストールするとBANされます。",
|
||||
"Installing Forwarder": "Forwarderのインストール中",
|
||||
"Creating Program": "プログラム作成中",
|
||||
"Creating Control": "コントロール作成中",
|
||||
"Creating Meta": "メター作成中",
|
||||
"Writing Nca": "Nca書き取り中",
|
||||
"Updating ncm databse": "ncmのDBをアップデート中",
|
||||
"Pushing application record": "アプリの記録をプッシュ中",
|
||||
"Installed!": "インストール完了",
|
||||
"Failed to install forwarder": "Forwarderのインストール失敗",
|
||||
"Unstarred ": "お気に入り解除: ",
|
||||
"Starred ": "お気に入りに登録: ",
|
||||
|
||||
"AppStore": "AppStore",
|
||||
"Filter: %s | Sort: %s | Order: %s": "フィルター: %s | 並べ替え: %s | 順番: %s",
|
||||
"AppStore Options": "AppStoreの設定",
|
||||
"All": "全て",
|
||||
"Games": "ゲーム",
|
||||
"Emulators": "エミュレータ",
|
||||
"Tools": "ツール",
|
||||
"Advanced": "高度な",
|
||||
"Themes": "テーマ",
|
||||
"Legacy": "遺産",
|
||||
"Misc": "その他",
|
||||
"Downloads": "ダウンロード",
|
||||
"Filter": "フィルター",
|
||||
"Search": "検索",
|
||||
"Menu Options": "メニューオプション",
|
||||
"Header": "ヘッダ",
|
||||
"Theme": "テーマ",
|
||||
"Network": "ネットワーク",
|
||||
"Logging": "ロギング",
|
||||
"Enabled": "有効",
|
||||
"Disabled": "無効",
|
||||
"Replace hbmenu on exit": "終了時に hbmenu を置き換える",
|
||||
"Misc Options": "その他のオプション",
|
||||
"Themezer": "テーマ設定者",
|
||||
"Irs": "イルス",
|
||||
"Web": "ウェブ",
|
||||
"Download": "ダウンロード",
|
||||
"Next Page": "次のページ",
|
||||
"Prev Page": "前のページ",
|
||||
"Pad ": "パッド ",
|
||||
"Legacy": "レガシー",
|
||||
"version: %s": "バージョン: %s",
|
||||
"updated: %s": "更新日: %s",
|
||||
"category: %s": "カテゴリー: %s",
|
||||
"extracted: %.2f MiB": "容量: %.2f MiB",
|
||||
"app_dls: %s": "ダウンロード: %s",
|
||||
"More by Author": "ディベロッパーの他のアプリを見る",
|
||||
"Leave Feedback": "意見を残す",
|
||||
|
||||
"Irs": "Joy-Con IRカメラ",
|
||||
"Ambient Noise Level: ": "ノイズレベル: ",
|
||||
"Controller": "コントローラー",
|
||||
"Pad ": "Joy-Con ",
|
||||
" (Available)": " (利用可能)",
|
||||
" (Unsupported)": " (未対応)",
|
||||
" (Unconnected)": " (未接続)",
|
||||
"HandHeld": "ハンドヘルド",
|
||||
" (Available)": " (利用可能)",
|
||||
"0 (Sideways)": "0(横)",
|
||||
"90 (Flat)": "90(フラット)",
|
||||
"Rotation": "回転",
|
||||
"0 (Sideways)": "0 (横)",
|
||||
"90 (Flat)": "90 (フラット)",
|
||||
"180 (-Sideways)": "180 (-横)",
|
||||
"270 (Upside down)": "270(上下逆さま)",
|
||||
"270 (Upside down)": "270 (上下逆さま)",
|
||||
"Colour": "色",
|
||||
"Grey": "グレー",
|
||||
"Ironbow": "アイアンボウ",
|
||||
"Green": "緑",
|
||||
"Red": "赤",
|
||||
"Blue": "青",
|
||||
"Light Target": "ライトターゲット",
|
||||
"All leds": "すべてのLED",
|
||||
"Bright group": "明るいグループ",
|
||||
"Dim group": "薄暗いグループ",
|
||||
"None": "なし",
|
||||
"Gain": "増幅",
|
||||
"Negative Image": "ネガティブなイメージ",
|
||||
"Normal image": "通常画像",
|
||||
"Negative image": "ネガティブなイメージ",
|
||||
"Format": "解像度",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20x15",
|
||||
"Controller": "コントローラ",
|
||||
"Rotation": "回転",
|
||||
"Colour": "色",
|
||||
"Light Target": "ライトターゲット",
|
||||
"Gain": "得",
|
||||
"Negative Image": "ネガティブなイメージ",
|
||||
"Format": "形式",
|
||||
"Trimming Format": "トリミングフォーマット",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "トリミングされた解像度",
|
||||
"External Light Filter": "外光フィルター",
|
||||
"Load Default": "デフォルトをロード",
|
||||
"No Internet": "インターネットなし",
|
||||
"[Applet Mode]": "[アプレットモード]",
|
||||
"Language": "言語"
|
||||
}
|
||||
"Load Default": "基本設定に戻す",
|
||||
|
||||
"Themezer": "Themezer",
|
||||
"Themezer Options": "Themezer設定",
|
||||
"Nsfw": "アダルトテーマ",
|
||||
"Page": "ページ",
|
||||
"Page %zu / %zu": "ページ %zu / %zu",
|
||||
"Enter Page Number": "ページの番号を入力",
|
||||
"Bad Page": "ページが見つかりません",
|
||||
"Download theme?": "テーマをインストールしますか?",
|
||||
|
||||
"GitHub": "GitHub",
|
||||
"Downloading json": "JSONからダウンロード",
|
||||
"Select asset to download for ": "ダウンロードアイテムを選択 ",
|
||||
|
||||
"Installing ": "インストール中 ",
|
||||
"Uninstalling ": "アンインストール中 ",
|
||||
"Deleting ": "削除中 ",
|
||||
"Deleting": "削除中",
|
||||
"Pasting ": "ペースト中 ",
|
||||
"Pasting": "ペースト中",
|
||||
"Removing ": "除去中 ",
|
||||
"Scanning ": "スキャン中 ",
|
||||
"Creating ": "作成中 ",
|
||||
"Copying ": "コピー中 ",
|
||||
"Trying to load ": "サムネイルを取得中 ",
|
||||
"Downloading ": "ダウンロード中 ",
|
||||
"Downloaded ": "ダウンロード完了 ",
|
||||
"Removed ": "除去完了 ",
|
||||
"Checking MD5": "MD5を確認中 ",
|
||||
"Loading...": "ロード中",
|
||||
"Loading": "ロード中",
|
||||
"Empty!": "何も見つかりません",
|
||||
"Not Ready...": "準備ができていません",
|
||||
"Error loading page!": "ページのロードエラー",
|
||||
"Update avaliable: ": "アップデート可能: ",
|
||||
"Download update: ": "アップデートをダウンロード: ",
|
||||
"Updated to ": "アップデート: ",
|
||||
"Press OK to restart Sphaira": "確認ボタンを押してSphairaを再起動",
|
||||
"Restart Sphaira?": "Sphairaを再起動しますか?",
|
||||
"Failed to download update": "アップデートのダウンロード失敗",
|
||||
"Restore hbmenu?": "hbmenuに戻しますか?",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "/switch/hbmemu.nroが見つかりません\nAppstoreから再インストールしてください",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "hbmenuを復元できませんでした、再インストールしてください",
|
||||
"Failed to restore hbmenu, using sphaira instead": "hbmenuを復元できませんでした、sphairaを引き続き使います",
|
||||
"Restored hbmenu, closing sphaira": "hbmenuに復元されました、sphairaを終了します",
|
||||
"Restored hbmenu": "hbmenuに復元されました",
|
||||
"Delete Selected files?": "本当に削除しますか?",
|
||||
"Completely remove ": "除去しますか ",
|
||||
"Are you sure you want to delete ": "消去してもよろしいですか ",
|
||||
"Are you sure you wish to cancel?": "本当に取り消しますか?",
|
||||
"If this message appears repeatedly, please open an issue.": "このメッセージが繰り返し表示される場合は、問題を開いてください。"
|
||||
}
|
||||
@@ -1,114 +1,255 @@
|
||||
{
|
||||
"Launch": "시작하다",
|
||||
"Options": "옵션",
|
||||
"Homebrew Options": "홈브류 옵션",
|
||||
"Sort By": "정렬 기준",
|
||||
"Sort Options": "정렬 옵션",
|
||||
"Updated": "업데이트됨",
|
||||
"Size": "크기",
|
||||
"Alphabetical": "알파벳순",
|
||||
"Decending": "내림차순",
|
||||
"Ascending": "오름차순",
|
||||
"Sort": "종류",
|
||||
"Order": "주문하다",
|
||||
"Info": "정보",
|
||||
"Delete": "삭제",
|
||||
"Hide Sphaira": "스파이라 숨기기",
|
||||
"Are you sure you want to delete ": "삭제하시겠습니까? ",
|
||||
"Install Forwarder": "포워더 설치",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "경고: 전달자를 설치하면 금지됩니다!",
|
||||
"Back": "뒤쪽에",
|
||||
"Install": "설치하다",
|
||||
"Fs": "Fs",
|
||||
"App": "앱",
|
||||
"Menu": "메뉴",
|
||||
"Homebrew": "홈브류",
|
||||
"FileBrowser": "파일브라우저",
|
||||
"Open": "열려 있는",
|
||||
"Theme Options": "테마 옵션",
|
||||
"Select Theme": "테마 선택",
|
||||
"Shuffle": "혼합",
|
||||
"Music": "음악",
|
||||
"Show Hidden": "숨겨진 표시",
|
||||
"Folders First": "폴더 먼저",
|
||||
"Hidden Last": "숨겨진 마지막",
|
||||
"Yes": "예",
|
||||
"No": "아니요",
|
||||
"Network Options": "네트워크 옵션",
|
||||
"Nxlink": "Nxlink",
|
||||
"Check for update": "업데이트 확인",
|
||||
"File Options": "파일 옵션",
|
||||
"Cut": "자르다",
|
||||
"Copy": "복사",
|
||||
"Rename": "이름 바꾸기",
|
||||
"Advanced Options": "파일 생성",
|
||||
"Create File": "파일 생성",
|
||||
"Create Folder": "폴더 생성",
|
||||
"View as text": "텍스트로 보기",
|
||||
"View as text (unfinished)": "텍스트로 보기(미완성)",
|
||||
"Set Archive Bit": "보관 비트 설정",
|
||||
"AppStore Options": "앱스토어 옵션",
|
||||
"All": "모두",
|
||||
"Games": "계략",
|
||||
"Emulators": "에뮬레이터",
|
||||
"Tools": "도구",
|
||||
"Advanced": "고급의",
|
||||
"Themes": "테마",
|
||||
"Legacy": "유산",
|
||||
"Misc": "기타",
|
||||
"Downloads": "다운로드",
|
||||
"Filter": "필터",
|
||||
"Search": "찾다",
|
||||
"Menu Options": "메뉴 옵션",
|
||||
"Header": "헤더",
|
||||
"Theme": "주제",
|
||||
"Network": "회로망",
|
||||
"Logging": "벌채 반출",
|
||||
"Enabled": "활성화됨",
|
||||
"Disabled": "장애가 있는",
|
||||
"Replace hbmenu on exit": "종료 시 hbmenu 교체",
|
||||
"Misc Options": "기타 옵션",
|
||||
"Themezer": "테마저",
|
||||
"Irs": "국세청",
|
||||
"Web": "편물",
|
||||
"Download": "다운로드",
|
||||
"Next Page": "다음 페이지",
|
||||
"Prev Page": "이전 페이지",
|
||||
"Pad ": "인주 ",
|
||||
" (Unconnected)": " (연결되지 않음)",
|
||||
"HandHeld": "휴대용",
|
||||
" (Available)": " (사용 가능)",
|
||||
"0 (Sideways)": "0(가로)",
|
||||
"90 (Flat)": "90(플랫)",
|
||||
"180 (-Sideways)": "180 (-옆으로)",
|
||||
"270 (Upside down)": "270 (거꾸로)",
|
||||
"Grey": "회색",
|
||||
"Ironbow": "아이언보우",
|
||||
"Green": "녹색",
|
||||
"Red": "빨간색",
|
||||
"Blue": "파란색",
|
||||
"All leds": "모든 LED",
|
||||
"Bright group": "밝은 그룹",
|
||||
"Dim group": "희미한 그룹",
|
||||
"None": "없음",
|
||||
"Normal image": "일반 이미지",
|
||||
"Negative image": "부정적인 이미지",
|
||||
"320x240": "320x240",
|
||||
"160x120": "160x120",
|
||||
"80x60": "80x60",
|
||||
"40x30": "40x30",
|
||||
"20x15": "20x15",
|
||||
"Controller": "제어 장치",
|
||||
"Rotation": "회전",
|
||||
"Colour": "색상",
|
||||
"Light Target": "라이트 타겟",
|
||||
"Gain": "얻다",
|
||||
"Negative Image": "네거티브 이미지",
|
||||
"Format": "체재",
|
||||
"Trimming Format": "트리밍 형식",
|
||||
"External Light Filter": "외부 조명 필터",
|
||||
"Load Default": "기본값 로드",
|
||||
"No Internet": "인터넷 없음",
|
||||
"[Applet Mode]": "[애플릿 모드]",
|
||||
"Language": "언어"
|
||||
}
|
||||
{
|
||||
"[Applet Mode]": "[ 애플릿 모드 ]",
|
||||
"No Internet": "인터넷 연결 없음",
|
||||
"Files": "파일 탐색기",
|
||||
"Apps": "홈브류",
|
||||
"Store": "앱스토어",
|
||||
"Menu": "메뉴",
|
||||
"Options": "설정",
|
||||
"OK": "확인",
|
||||
"Back": "뒤로",
|
||||
"Select": "선택",
|
||||
"Open": "열기",
|
||||
"Launch": "실행",
|
||||
"Info": "정보",
|
||||
"Install": "설치",
|
||||
"Delete": "삭제",
|
||||
"Restart": "재시작",
|
||||
"Changelog": "변경 내역",
|
||||
"Details": "상세",
|
||||
"Update": "업데이트",
|
||||
"Remove": "제거",
|
||||
"Restore": "복원",
|
||||
"Download": "다운로드",
|
||||
"Next Page": "다음 페이지",
|
||||
"Prev Page": "이전 페이지",
|
||||
"Unstar": "즐겨찾기 해제",
|
||||
"Star": "즐겨찾기",
|
||||
"System memory": "낸드 저장소",
|
||||
"microSD card": "SD 카드",
|
||||
"Sd": "SD 카드",
|
||||
"Image System memory": "낸드 이미지",
|
||||
"Image microSD card": "SD 이미지",
|
||||
"Slow": "느림",
|
||||
"Normal": "보통",
|
||||
"Fast": "빠름",
|
||||
"Yes": "예",
|
||||
"No": "아니요",
|
||||
"Enabled": "",
|
||||
"Disabled": "",
|
||||
|
||||
"Sort By": "정렬",
|
||||
"Sort Options": "정렬 옵션",
|
||||
"Filter": "필터",
|
||||
"Sort": "분류",
|
||||
"Order": "정렬",
|
||||
"Search": "검색",
|
||||
"Updated": "업데이트순",
|
||||
"Updated (Star)": "업데이트순 (즐겨찾기)",
|
||||
"Downloads": "다운로드순",
|
||||
"Size": "크기순",
|
||||
"Size (Star)": "크기순 (즐겨찾기)",
|
||||
"Alphabetical": "알파벳순",
|
||||
"Alphabetical (Star)": "알파벳순 (즐겨찾기)",
|
||||
"Likes": "좋아요순",
|
||||
"ID": "ID순",
|
||||
"Descending": "내림차순",
|
||||
"Descending (down)": "내림차순",
|
||||
"Desc": "내림차순",
|
||||
"Ascending": "오름차순",
|
||||
"Ascending (Up)": "오름차순",
|
||||
"Asc": "오름차순",
|
||||
|
||||
"Menu Options": "메뉴",
|
||||
"Theme": "테마",
|
||||
"Theme Options": "테마 옵션",
|
||||
"Select Theme": "테마 선택",
|
||||
"Shuffle": "셔플",
|
||||
"Music": "BGM",
|
||||
"Network": "네트워크",
|
||||
"Network Options": "네트워크 옵션",
|
||||
"Ftp": "FTP (무선)",
|
||||
"Mtp": "MTP (유선)",
|
||||
"Nxlink": "Nxlink",
|
||||
"Nxlink Connected": "Nxlink 연결됨",
|
||||
"Nxlink Upload": "Nxlink 업로드",
|
||||
"Nxlink Finished": "Nxlink 종료됨",
|
||||
"Switch-Handheld!": "휴대모드로 전환됨!",
|
||||
"Switch-Docked!": "독 모드로 전환됨!",
|
||||
"Language": "언어",
|
||||
"Auto": "자동",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "로깅",
|
||||
"Replace hbmenu on exit": "종료 시 hbmenu 교체",
|
||||
"Misc": "기타",
|
||||
"Misc Options": "기타 옵션",
|
||||
"Web": "웹 브라우저",
|
||||
"Install forwarders": "바로가기 설치",
|
||||
"Install location": "설치 위치",
|
||||
"Show install warning": "경고 메시지",
|
||||
"Text scroll speed": "흐르는 텍스트 속도",
|
||||
|
||||
"FileBrowser": "파일 탐색기",
|
||||
"%zd files": "%zd 개 파일",
|
||||
"%zd dirs": "%zd 개 폴더",
|
||||
"File Options": "파일 옵션",
|
||||
"Show Hidden": "숨겨진 항목 표시",
|
||||
"Folders First": "폴더 우선 정렬",
|
||||
"Hidden Last": "숨겨진 항목 후순 정렬",
|
||||
"Cut": "잘라내기",
|
||||
"Copy": "복사",
|
||||
"Paste": "붙여넣기",
|
||||
"Paste ": " ",
|
||||
" file(s)?": "개 항목을 붙여넣을까요?",
|
||||
"Rename": "이름 바꾸기",
|
||||
"Set New File Name": "새 파일명 입력",
|
||||
"Advanced": "고급",
|
||||
"Advanced Options": "고급 옵션",
|
||||
"Create File": "새 파일",
|
||||
"Set File Name": "파일명 입력",
|
||||
"Create Folder": "새 폴더",
|
||||
"Set Folder Name": "폴더명 입력",
|
||||
"View as text (unfinished)": "텍스트로 보기 (미완성)",
|
||||
"Ignore read only": "읽기 전용 설정 무시",
|
||||
"Mount": "마운트",
|
||||
"Empty...": "비어있음...",
|
||||
"Open with DayBreak?": "DayBreak로 열까요?",
|
||||
"Launch ": "실행할까요 ",
|
||||
"Launch option for: ": "실행 옵션: ",
|
||||
"Select launcher for: ": "실행 런처: ",
|
||||
|
||||
"Homebrew": "홈브류",
|
||||
"Homebrew Options": "홈브류 옵션",
|
||||
"Hide Sphaira": "Sphaira 숨기기",
|
||||
"Install Forwarder": "바로가기 설치",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "경고: 시스낸드에 바로가기 설치 시, 밴 위험이 있습니다!",
|
||||
"Installing Forwarder": "바로가기 설치",
|
||||
"Creating Program": "프로그램 생성",
|
||||
"Creating Control": "컨트롤 생성",
|
||||
"Creating Meta": "메타 생성",
|
||||
"Writing Nca": "Nca 쓰기",
|
||||
"Updating ncm databse": "Ncm 데이터베이스 업데이트",
|
||||
"Pushing application record": "응용 프로그램 기록 푸싱",
|
||||
"Installed!": "설치 완료!",
|
||||
"Failed to install forwarder": "바로가기 설치 실패",
|
||||
"Unstarred ": "즐겨찾기 해제: ",
|
||||
"Starred ": "즐겨찾기 적용: ",
|
||||
|
||||
"AppStore": "앱스토어",
|
||||
"Filter: %s | Sort: %s | Order: %s": "필터: %s | 분류: %s | 정렬: %s",
|
||||
"AppStore Options": "앱스토어 옵션",
|
||||
"All": "모두",
|
||||
"Games": "게임",
|
||||
"Emulators": "에뮬레이터",
|
||||
"Tools": "도구",
|
||||
"Themes": "테마",
|
||||
"Legacy": "레거시",
|
||||
"version: %s": "버전: %s",
|
||||
"updated: %s": "업데이트: %s",
|
||||
"category: %s": "카테고리: %s",
|
||||
"extracted: %.2f MiB": "용량: %.2f MiB",
|
||||
"app_dls: %s": "다운로드 횟수: %s",
|
||||
"More by Author": "개발자의 다른 앱 더 보기",
|
||||
"Leave Feedback": "피드백 남기기",
|
||||
|
||||
"Irs": "조이콘 적외선 카메라",
|
||||
"Ambient Noise Level: ": "주변 노이즈 레벨: ",
|
||||
"Controller": "컨트롤러",
|
||||
"Pad ": "조이콘 ",
|
||||
" (Available)": " (사용 가능)",
|
||||
" (Unsupported)": " (지원 안됨)",
|
||||
" (Unconnected)": " (연결 없음)",
|
||||
"HandHeld": "본체 연결",
|
||||
"Rotation": "화면 회전",
|
||||
"0 (Sideways)": "반시계방향 90° 회전",
|
||||
"90 (Flat)": "정방향",
|
||||
"180 (-Sideways)": "시계방향 90° 회전",
|
||||
"270 (Upside down)": "상하반전",
|
||||
"Colour": "색상",
|
||||
"Grey": "회색",
|
||||
"Ironbow": "아이언보우",
|
||||
"Green": "초록색",
|
||||
"Red": "빨간색",
|
||||
"Blue": "파란색",
|
||||
"Light Target": "반사 표적",
|
||||
"All leds": "모든 LED 켜기",
|
||||
"Bright group": "Bright LED 켜기",
|
||||
"Dim group": "Dim LED 켜기",
|
||||
"None": "LED 끄기",
|
||||
"Gain": "대비",
|
||||
"Negative Image": "화상 이미지",
|
||||
"Normal image": "일반",
|
||||
"Negative image": "반전",
|
||||
"Format": "해상도",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "트리밍 해상도",
|
||||
"External Light Filter": "외부 조명 필터",
|
||||
"Load Default": "기본값으로 설정",
|
||||
|
||||
"Themezer": "Themezer",
|
||||
"Themezer Options": "Themezer 옵션",
|
||||
"Nsfw": "선정성 테마",
|
||||
"Page": "페이지",
|
||||
"Page %zu / %zu": "페이지 %zu / %zu",
|
||||
"Enter Page Number": "페이지 번호 입력",
|
||||
"Bad Page": "잘못된 페이지",
|
||||
"Download theme?": "테마를 다운로드할까요?",
|
||||
|
||||
"GitHub": "GitHub",
|
||||
"Downloading json": "JSON에서 다운로드",
|
||||
"Select asset to download for ": "다운로드 아이템: ",
|
||||
|
||||
"Installing ": "설치 ",
|
||||
"Uninstalling ": "설치 제거 ",
|
||||
"Deleting ": "삭제 ",
|
||||
"Deleting": "삭제",
|
||||
"Pasting ": "붙여넣기 ",
|
||||
"Pasting": "붙여넣기",
|
||||
"Removing ": "제거 ",
|
||||
"Scanning ": "스캔 ",
|
||||
"Creating ": "생성 ",
|
||||
"Copying ": "복사 ",
|
||||
"Trying to load ": "썸네일 받아오는 중... ",
|
||||
"Downloading ": "다운로드 ",
|
||||
"Downloaded ": "다운로드 완료: ",
|
||||
"Removed ": "제거 됨: ",
|
||||
"Checking MD5": "MD5 확인",
|
||||
"Loading...": "로딩 중...",
|
||||
"Loading": "로딩 중...",
|
||||
"Empty!": "찾을 수 없습니다!",
|
||||
"Not Ready...": "준비되지 않음...",
|
||||
"Error loading page!": "페이지 로딩 오류!",
|
||||
"Update avaliable: ": "업데이트 가능: ",
|
||||
"Download update: ": "업데이트 다운로드: ",
|
||||
"Updated to ": "업데이트: ",
|
||||
"Press OK to restart Sphaira": "확인 버튼 입력하여 Sphaira 재시작",
|
||||
"Restart Sphaira?": "Sphaira를 재시작할까요?",
|
||||
"Failed to download update": "업데이트 다운로드 실패함",
|
||||
"Restore hbmenu?": "hbmenu로 교체할까요?",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "/switch/hbmemu.nro를 찾을 수 없습니다\n앱스토어에서 다시 설치하세요",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "hbmenu 교체 실패함, hbmenu를 다시 다운로드하세요",
|
||||
"Failed to restore hbmenu, using sphaira instead": "hbmenu 교체 실패함, sphaira를 계속 사용합니다",
|
||||
"Restored hbmenu, closing sphaira": "hbmenu로 교체됨, sphaira를 종료합니다",
|
||||
"Restored hbmenu": "hbmenu로 교체됨",
|
||||
"Delete Selected files?": "선택한 파일을 삭제할까요?",
|
||||
"Completely remove ": "정말 삭제할까요 ",
|
||||
"Are you sure you want to delete ": "정말 삭제할까요 ",
|
||||
"Are you sure you wish to cancel?": "정말 취소할까요?",
|
||||
"If this message appears repeatedly, please open an issue.": "해당 메시지가 반복해서 나타나는 경우, 이슈를 등록하세요."
|
||||
}
|
||||
@@ -1,114 +1,255 @@
|
||||
{
|
||||
"Launch": "Launch",
|
||||
"[Applet Mode]": "[Applet-modus]",
|
||||
"No Internet": "Geen internet",
|
||||
"Files": "",
|
||||
"Apps": "",
|
||||
"Store": "",
|
||||
"Menu": "Menu",
|
||||
"Options": "Opties",
|
||||
"Homebrew Options": "Homebrew-opties",
|
||||
"OK": "",
|
||||
"Back": "Terug",
|
||||
"Select": "",
|
||||
"Open": "Open",
|
||||
"Launch": "Launch",
|
||||
"Info": "Info",
|
||||
"Install": "Installeren",
|
||||
"Delete": "Verwijderen",
|
||||
"Restart": "",
|
||||
"Changelog": "",
|
||||
"Details": "",
|
||||
"Update": "",
|
||||
"Remove": "",
|
||||
"Restore": "",
|
||||
"Download": "Downloaden",
|
||||
"Next Page": "Volgende pagina",
|
||||
"Prev Page": "Vorige pagina",
|
||||
"Unstar": "",
|
||||
"Star": "",
|
||||
"System memory": "",
|
||||
"microSD card": "",
|
||||
"Sd": "",
|
||||
"Image System memory": "",
|
||||
"Image microSD card": "",
|
||||
"Slow": "",
|
||||
"Normal": "",
|
||||
"Fast": "",
|
||||
"Yes": "Ja",
|
||||
"No": "Nee",
|
||||
"Enabled": "Ingeschakeld",
|
||||
"Disabled": "Gehandicapt",
|
||||
|
||||
"Sort By": "Sorteer op",
|
||||
"Sort Options": "Sorteeropties",
|
||||
"Updated": "Bijgewerkt",
|
||||
"Size": "Maat",
|
||||
"Alphabetical": "Alfabetisch",
|
||||
"Decending": "Aflopend",
|
||||
"Ascending": "Oplopend",
|
||||
"Filter": "Filter",
|
||||
"Sort": "Soort",
|
||||
"Order": "Volgorde",
|
||||
"Info": "Info",
|
||||
"Delete": "Verwijderen",
|
||||
"Hide Sphaira": "Verberg Sphaira",
|
||||
"Are you sure you want to delete ": "Weet u zeker dat u wilt verwijderen ",
|
||||
"Install Forwarder": "Forwarder installeren",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "WAARSCHUWING: Het installeren van forwarders leidt tot een ban!",
|
||||
"Back": "Terug",
|
||||
"Install": "Installeren",
|
||||
"Fs": "Fs",
|
||||
"App": "App",
|
||||
"Menu": "Menu",
|
||||
"Homebrew": "Zelf brouwen",
|
||||
"FileBrowser": "Bestandsbrowser",
|
||||
"Open": "Open",
|
||||
"Search": "Zoekopdracht",
|
||||
"Updated": "Bijgewerkt",
|
||||
"Updated (Star)": "",
|
||||
"Downloads": "Downloads",
|
||||
"Size": "Maat",
|
||||
"Size (Star)": "",
|
||||
"Alphabetical": "Alfabetisch",
|
||||
"Alphabetical (Star)": "",
|
||||
"Likes": "",
|
||||
"ID": "",
|
||||
"Descending": "Aflopend",
|
||||
"Descending (down)": "Aflopend",
|
||||
"Desc": "Aflopend",
|
||||
"Ascending": "Oplopend",
|
||||
"Ascending (Up)": "Oplopend",
|
||||
"Asc": "Oplopend",
|
||||
|
||||
"Menu Options": "Menu-opties",
|
||||
"Theme": "Thema",
|
||||
"Theme Options": "Thema Opties",
|
||||
"Select Theme": "Selecteer Thema",
|
||||
"Shuffle": "Schudden",
|
||||
"Music": "Muziek",
|
||||
"Network": "Netwerk",
|
||||
"Network Options": "Netwerkopties",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Nxlink Connected": "",
|
||||
"Nxlink Upload": "",
|
||||
"Nxlink Finished": "",
|
||||
"Switch-Handheld!": "",
|
||||
"Switch-Docked!": "",
|
||||
"Language": "Taal",
|
||||
"Auto": "",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "Loggen",
|
||||
"Replace hbmenu on exit": "Vervang hbmenu bij afsluiten",
|
||||
"Misc": "Diversen",
|
||||
"Misc Options": "Diverse opties",
|
||||
"Web": "Web",
|
||||
"Install forwarders": "",
|
||||
"Install location": "",
|
||||
"Show install warning": "",
|
||||
"Text scroll speed": "",
|
||||
|
||||
"FileBrowser": "Bestandsbrowser",
|
||||
"%zd files": "%zd files",
|
||||
"%zd dirs": "%zd dirs",
|
||||
"File Options": "Bestandsopties",
|
||||
"Show Hidden": "Toon verborgen",
|
||||
"Folders First": "Mappen eerst",
|
||||
"Hidden Last": "Verborgen laatste",
|
||||
"Yes": "Ja",
|
||||
"No": "Nee",
|
||||
"Network Options": "Netwerkopties",
|
||||
"Nxlink": "Nxlink",
|
||||
"Check for update": "Controleer op update",
|
||||
"File Options": "Bestandsopties",
|
||||
"Cut": "Snee",
|
||||
"Copy": "Kopiëren",
|
||||
"Paste": "",
|
||||
"Paste ": "",
|
||||
" file(s)?": "",
|
||||
"Rename": "Hernoemen",
|
||||
"Set New File Name": "",
|
||||
"Advanced": "Geavanceerd",
|
||||
"Advanced Options": "Bestand maken",
|
||||
"Create File": "Bestand maken",
|
||||
"Set File Name": "",
|
||||
"Create Folder": "Map maken",
|
||||
"View as text": "Bekijk als tekst",
|
||||
"Set Folder Name": "",
|
||||
"View as text (unfinished)": "Bekijk als tekst (onvoltooid)",
|
||||
"Set Archive Bit": "Archiefbit instellen",
|
||||
"Ignore read only": "",
|
||||
"Mount": "",
|
||||
"Empty...": "",
|
||||
"Open with DayBreak?": "",
|
||||
"Launch ": "",
|
||||
"Launch option for: ": "",
|
||||
"Select launcher for: ": "",
|
||||
|
||||
"Homebrew": "Zelf brouwen",
|
||||
"Homebrew Options": "Homebrew-opties",
|
||||
"Hide Sphaira": "Verberg Sphaira",
|
||||
"Install Forwarder": "Forwarder installeren",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "WAARSCHUWING: Het installeren van forwarders leidt tot een ban!",
|
||||
"Installing Forwarder": "",
|
||||
"Creating Program": "",
|
||||
"Creating Control": "",
|
||||
"Creating Meta": "",
|
||||
"Writing Nca": "",
|
||||
"Updating ncm databse": "",
|
||||
"Pushing application record": "",
|
||||
"Installed!": "",
|
||||
"Failed to install forwarder": "",
|
||||
"Unstarred ": "",
|
||||
"Starred ": "",
|
||||
|
||||
"AppStore": "",
|
||||
"Filter: %s | Sort: %s | Order: %s": "Filter: %s | Soort: %s | Volgorde: %s",
|
||||
"AppStore Options": "AppStore-opties",
|
||||
"All": "Alle",
|
||||
"Games": "Spellen",
|
||||
"Emulators": "Emulators",
|
||||
"Tools": "Hulpmiddelen",
|
||||
"Advanced": "Geavanceerd",
|
||||
"Themes": "Thema's",
|
||||
"Legacy": "Nalatenschap",
|
||||
"Misc": "Diversen",
|
||||
"Downloads": "Downloads",
|
||||
"Filter": "Filter",
|
||||
"Search": "Zoekopdracht",
|
||||
"Menu Options": "Menu-opties",
|
||||
"Header": "Koptekst",
|
||||
"Theme": "Thema",
|
||||
"Network": "Netwerk",
|
||||
"Logging": "Loggen",
|
||||
"Enabled": "Ingeschakeld",
|
||||
"Disabled": "Gehandicapt",
|
||||
"Replace hbmenu on exit": "Vervang hbmenu bij afsluiten",
|
||||
"Misc Options": "Diverse opties",
|
||||
"Themezer": "Themamaker",
|
||||
"version: %s": "version: %s",
|
||||
"updated: %s": "updated: %s",
|
||||
"category: %s": "category: %s",
|
||||
"extracted: %.2f MiB": "extracted: %.2f MiB",
|
||||
"app_dls: %s": "app_dls: %s",
|
||||
"More by Author": "",
|
||||
"Leave Feedback": "",
|
||||
|
||||
"Irs": "Ir",
|
||||
"Web": "Web",
|
||||
"Download": "Downloaden",
|
||||
"Next Page": "Volgende pagina",
|
||||
"Prev Page": "Vorige pagina",
|
||||
"Ambient Noise Level: ": "",
|
||||
"Controller": "Controleur",
|
||||
"Pad ": "Pad ",
|
||||
" (Available)": " (Beschikbaar)",
|
||||
" (Unsupported)": "",
|
||||
" (Unconnected)": " (Niet verbonden)",
|
||||
"HandHeld": "Handbediende",
|
||||
" (Available)": " (Beschikbaar)",
|
||||
"Rotation": "Rotatie",
|
||||
"0 (Sideways)": "0 (zijwaarts)",
|
||||
"90 (Flat)": "90 (plat)",
|
||||
"180 (-Sideways)": "180 (-zijwaarts)",
|
||||
"270 (Upside down)": "270 (ondersteboven)",
|
||||
"Colour": "Kleur",
|
||||
"Grey": "Grijs",
|
||||
"Ironbow": "Ijzerboog",
|
||||
"Green": "Groente",
|
||||
"Red": "Rood",
|
||||
"Blue": "Blauw",
|
||||
"Light Target": "Licht doel",
|
||||
"All leds": "Alle leds",
|
||||
"Bright group": "Heldere groep",
|
||||
"Dim group": "Dim groep",
|
||||
"None": "Geen",
|
||||
"Normal image": "Normaal beeld",
|
||||
"Negative image": "Negatief beeld",
|
||||
"320x240": "320x240",
|
||||
"160x120": "160x120",
|
||||
"80x60": "80x60",
|
||||
"40x30": "40x30",
|
||||
"20x15": "20x15",
|
||||
"Controller": "Controleur",
|
||||
"Rotation": "Rotatie",
|
||||
"Colour": "Kleur",
|
||||
"Light Target": "Licht doel",
|
||||
"Gain": "Verdienen",
|
||||
"Negative Image": "Negatief beeld",
|
||||
"Normal image": "Normaal beeld",
|
||||
"Negative image": "Negatief beeld",
|
||||
"Format": "Formaat",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "Trimformaat",
|
||||
"External Light Filter": "Extern lichtfilter",
|
||||
"Load Default": "Standaard laden",
|
||||
"No Internet": "Geen internet",
|
||||
"[Applet Mode]": "[Applet-modus]",
|
||||
"Language": "Taal"
|
||||
}
|
||||
|
||||
"Themezer": "Themamaker",
|
||||
"Themezer Options": "",
|
||||
"Nsfw": "",
|
||||
"Page": "",
|
||||
"Page %zu / %zu": "Page %zu / %zu",
|
||||
"Enter Page Number": "",
|
||||
"Bad Page": "",
|
||||
"Download theme?": "",
|
||||
|
||||
"GitHub": "",
|
||||
"Downloading json": "",
|
||||
"Select asset to download for ": "",
|
||||
|
||||
"Installing ": "",
|
||||
"Uninstalling ": "",
|
||||
"Deleting ": "",
|
||||
"Deleting": "",
|
||||
"Pasting ": "",
|
||||
"Pasting": "",
|
||||
"Removing ": "",
|
||||
"Scanning ": "",
|
||||
"Creating ": "",
|
||||
"Copying ": "",
|
||||
"Trying to load ": "",
|
||||
"Downloading ": "",
|
||||
"Downloaded ": "",
|
||||
"Removed ": "",
|
||||
"Checking MD5": "",
|
||||
"Loading...": "",
|
||||
"Loading": "",
|
||||
"Empty!": "",
|
||||
"Not Ready...": "",
|
||||
"Error loading page!": "",
|
||||
"Update avaliable: ": "",
|
||||
"Download update: ": "",
|
||||
"Updated to ": "",
|
||||
"Press OK to restart Sphaira": "",
|
||||
"Restart Sphaira?": "",
|
||||
"Failed to download update": "",
|
||||
"Restore hbmenu?": "",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "",
|
||||
"Failed to restore hbmenu, using sphaira instead": "",
|
||||
"Restored hbmenu, closing sphaira": "",
|
||||
"Restored hbmenu": "",
|
||||
"Delete Selected files?": "",
|
||||
"Completely remove ": "",
|
||||
"Are you sure you want to delete ": "Weet u zeker dat u wilt verwijderen ",
|
||||
"Are you sure you wish to cancel?": "",
|
||||
"If this message appears repeatedly, please open an issue.": ""
|
||||
}
|
||||
@@ -1,114 +1,255 @@
|
||||
{
|
||||
"Launch": "Lançar",
|
||||
"Options": "Opções",
|
||||
"Homebrew Options": "Opções de fermentação caseira",
|
||||
"Sort By": "Ordenar por",
|
||||
"Sort Options": "Opções de classificação",
|
||||
"Updated": "Atualizado",
|
||||
"Size": "Tamanho",
|
||||
"Alphabetical": "Alfabético",
|
||||
"Decending": "Decrescente",
|
||||
"Ascending": "Ascendente",
|
||||
"Sort": "Organizar",
|
||||
"Order": "Ordem",
|
||||
"Info": "Informações",
|
||||
"Delete": "Excluir",
|
||||
"Hide Sphaira": "Esconder Sphaira",
|
||||
"Are you sure you want to delete ": "Tem certeza de que deseja excluir ",
|
||||
"Install Forwarder": "Instalar encaminhador",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "AVISO: A instalação de encaminhadores levará ao banimento!",
|
||||
"Back": "Voltar",
|
||||
"Install": "Instalar",
|
||||
"Fs": "Fs",
|
||||
"App": "Aplicativo",
|
||||
"[Applet Mode]": "[Modo Applet]",
|
||||
"No Internet": "Sem Internet",
|
||||
"Files": "Arquivos",
|
||||
"Apps": "Aplicativos",
|
||||
"Store": "Loja",
|
||||
"Menu": "Menu",
|
||||
"Homebrew": "Cerveja caseira",
|
||||
"FileBrowser": "Navegador de arquivos",
|
||||
"Options": "Opções",
|
||||
"OK": "OK",
|
||||
"Back": "Voltar",
|
||||
"Select": "Selecionar",
|
||||
"Open": "Abrir",
|
||||
"Theme Options": "Opções de tema",
|
||||
"Select Theme": "Selecione o tema",
|
||||
"Shuffle": "Embaralhar",
|
||||
"Music": "Música",
|
||||
"Show Hidden": "Mostrar oculto",
|
||||
"Folders First": "Pastas primeiro",
|
||||
"Hidden Last": "Oculto por último",
|
||||
"Launch": "Iniciar",
|
||||
"Info": "Informações",
|
||||
"Install": "Instalar",
|
||||
"Delete": "Excluir",
|
||||
"Restart": "Reiniciar",
|
||||
"Changelog": "Alterações",
|
||||
"Details": "Detalhes",
|
||||
"Update": "Atualizar",
|
||||
"Remove": "Remover",
|
||||
"Restore": "Restaurar",
|
||||
"Download": "Baixar",
|
||||
"Next Page": "Próxima página",
|
||||
"Prev Page": "Página anterior",
|
||||
"Unstar": "Desfavoritar",
|
||||
"Star": "Favoritar",
|
||||
"System memory": "Memória do console",
|
||||
"microSD card": "Cartão microSD",
|
||||
"Sd": "SD",
|
||||
"Image System memory": "Imagem (memória do console)",
|
||||
"Image microSD card": "Imagem (cartão microSD)",
|
||||
"Slow": "Lenta",
|
||||
"Normal": "Normal",
|
||||
"Fast": "Rápida",
|
||||
"Yes": "Sim",
|
||||
"No": "Não",
|
||||
"Enabled": "Sim",
|
||||
"Disabled": "Não",
|
||||
|
||||
"Sort By": "Ordernar/Organizar",
|
||||
"Sort Options": "Ordernar/Organizar",
|
||||
"Filter": "Filtro",
|
||||
"Sort": "Organizar por",
|
||||
"Order": "Ordem",
|
||||
"Search": "Buscar",
|
||||
"Updated": "Atualizado",
|
||||
"Updated (Star)": "Atualizado (favoritos)",
|
||||
"Downloads": "Nº de downloads",
|
||||
"Size": "Tamanho",
|
||||
"Size (Star)": "Tamanho (favoritos)",
|
||||
"Alphabetical": "Ordem alfabética",
|
||||
"Alphabetical (Star)": "Ordem alfabética (favoritos)",
|
||||
"Likes": "Nº de curtidas",
|
||||
"ID": "ID",
|
||||
"Descending": "Decrescente",
|
||||
"Descending (down)": "Decrescente (baixo)",
|
||||
"Desc": "Decr.",
|
||||
"Ascending": "Ascendente",
|
||||
"Ascending (Up)": "Ascendente (cima)",
|
||||
"Asc": "Asc.",
|
||||
|
||||
"Menu Options": "Opções do menu",
|
||||
"Theme": "Tema",
|
||||
"Theme Options": "Opções de tema",
|
||||
"Select Theme": "Tema atual",
|
||||
"Shuffle": "Embaralhar temas",
|
||||
"Music": "Música",
|
||||
"Network": "Rede",
|
||||
"Network Options": "Opções de rede",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Check for update": "Verifique se há atualização",
|
||||
"Nxlink Connected": "Nxlink conectado",
|
||||
"Nxlink Upload": "Envio Nxlink",
|
||||
"Nxlink Finished": "Nxlink finalizado",
|
||||
"Switch-Handheld!": "Switch-Portátil",
|
||||
"Switch-Docked!": "Switch-Docado",
|
||||
"Language": "Idioma",
|
||||
"Auto": "Automático",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "Registro de depuração",
|
||||
"Replace hbmenu on exit": "Substituir hbmenu ao sair",
|
||||
"Misc": "Diversos",
|
||||
"Misc Options": "Opções diversas",
|
||||
"Web": "Navegador de internet",
|
||||
"Install forwarders": "Instalar forwarders",
|
||||
"Install location": "Local de instalação",
|
||||
"Show install warning": "Mostrar aviso de instalação",
|
||||
"Text scroll speed": "Rolagem do texto",
|
||||
|
||||
"FileBrowser": "Arquivos",
|
||||
"%zd files": "%zd arquivo(s)",
|
||||
"%zd dirs": "%zd diretório(s)",
|
||||
"File Options": "Opções de arquivo",
|
||||
"Cut": "Corte",
|
||||
"Copy": "Cópia",
|
||||
"Show Hidden": "Mostrar ocultos",
|
||||
"Folders First": "Pastas primeiro",
|
||||
"Hidden Last": "Ocultos por último",
|
||||
"Cut": "Recortar",
|
||||
"Copy": "Copiar",
|
||||
"Paste": "Colar",
|
||||
"Paste ": "Colar ",
|
||||
" file(s)?": " arquivo(s)?",
|
||||
"Rename": "Renomear",
|
||||
"Advanced Options": "Criar arquivo",
|
||||
"Set New File Name": "Defina o nome do novo arquivo",
|
||||
"Advanced": "Avançado",
|
||||
"Advanced Options": "Opções avançadas",
|
||||
"Create File": "Criar arquivo",
|
||||
"Set File Name": "Defina o nome do arquivo",
|
||||
"Create Folder": "Criar pasta",
|
||||
"View as text": "Ver como texto",
|
||||
"Set Folder Name": "Defina o nome da pasta",
|
||||
"View as text (unfinished)": "Ver como texto (inacabado)",
|
||||
"Set Archive Bit": "Definir bit de arquivo",
|
||||
"AppStore Options": "Opções da AppStore",
|
||||
"Ignore read only": "Ignorar somente leitura",
|
||||
"Mount": "Montar",
|
||||
"Empty...": "Vazio...",
|
||||
"Open with DayBreak?": "Abrir com DayBreak?",
|
||||
"Launch ": "Iniciar ",
|
||||
"Launch option for: ": "Opções de inicialização para: ",
|
||||
"Select launcher for: ": "Selecionar launcher para: ",
|
||||
|
||||
"Homebrew": "Aplicativos",
|
||||
"Homebrew Options": "Opções do aplicativo",
|
||||
"Hide Sphaira": "Esconder sphaira",
|
||||
"Install Forwarder": "Instalar forwarder",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "AVISO: Instalar forwarders pode\nresultar em um banimento!",
|
||||
"Installing Forwarder": "Instalando forwarder",
|
||||
"Creating Program": "Criando Program",
|
||||
"Creating Control": "Criando Control",
|
||||
"Creating Meta": "Criando Meta",
|
||||
"Writing Nca": "Escrevendo NCA",
|
||||
"Updating ncm databse": "Atualizando base de dados NCM",
|
||||
"Pushing application record": "Aplicando registro do aplicativo",
|
||||
"Installed!": "Instalado!",
|
||||
"Failed to install forwarder": "Falha ao instalar forwarder",
|
||||
"Unstarred ": "Desfavoritado ",
|
||||
"Starred ": "Favoritado ",
|
||||
|
||||
"AppStore": "Loja",
|
||||
"Filter: %s | Sort: %s | Order: %s": "Filtro: %s | Por: %s | Ordem: %s",
|
||||
"AppStore Options": "Opções da loja",
|
||||
"All": "Todos",
|
||||
"Games": "Jogos",
|
||||
"Emulators": "Emuladores",
|
||||
"Tools": "Ferramentas",
|
||||
"Advanced": "Avançado",
|
||||
"Themes": "Temas",
|
||||
"Legacy": "Legado",
|
||||
"Misc": "Diversos",
|
||||
"Downloads": "Transferências",
|
||||
"Filter": "Filtro",
|
||||
"Search": "Procurar",
|
||||
"Menu Options": "Opções de cardápio",
|
||||
"Header": "Cabeçalho",
|
||||
"Theme": "Tema",
|
||||
"Network": "Rede",
|
||||
"Logging": "Registro",
|
||||
"Enabled": "Habilitado",
|
||||
"Disabled": "Desabilitado",
|
||||
"Replace hbmenu on exit": "Substitua hbmenu ao sair",
|
||||
"Misc Options": "Opções diversas",
|
||||
"Themezer": "Temazer",
|
||||
"Irs": "Receita Federal",
|
||||
"Web": "Rede",
|
||||
"Download": "Download",
|
||||
"Next Page": "Próxima página",
|
||||
"Prev Page": "Página anterior",
|
||||
"Pad ": "Almofada ",
|
||||
" (Unconnected)": " (Desconectado)",
|
||||
"version: %s": "versão: %s",
|
||||
"updated: %s": "atualizado: %s",
|
||||
"category: %s": "categoria: %s",
|
||||
"extracted: %.2f MiB": "tam. extraído: %.2f MiB",
|
||||
"app_dls: %s": "downloads: %s",
|
||||
"More by Author": "Mais deste autor",
|
||||
"Leave Feedback": "Deixar um feedback",
|
||||
|
||||
"Irs": "IRS",
|
||||
"Ambient Noise Level: ": "Nível de ruído ambiente: ",
|
||||
"Controller": "Controle",
|
||||
"Pad ": "Pad ",
|
||||
" (Available)": " (disponível)",
|
||||
" (Unsupported)": "(não suportado)",
|
||||
" (Unconnected)": " (desconectado)",
|
||||
"HandHeld": "Portátil",
|
||||
" (Available)": " (Disponível)",
|
||||
"Rotation": "Rotação",
|
||||
"0 (Sideways)": "0 (lateralmente)",
|
||||
"90 (Flat)": "90 (plano)",
|
||||
"180 (-Sideways)": "180 (-lateralmente)",
|
||||
"270 (Upside down)": "270 (de cabeça para baixo)",
|
||||
"Colour": "Cor",
|
||||
"Grey": "Cinza",
|
||||
"Ironbow": "Arco de Ferro",
|
||||
"Ironbow": "Arco de ferro",
|
||||
"Green": "Verde",
|
||||
"Red": "Vermelho",
|
||||
"Blue": "Azul",
|
||||
"Light Target": "Alvo de luz",
|
||||
"All leds": "Todos os LEDs",
|
||||
"Bright group": "Grupo brilhante",
|
||||
"Bright group": "Grupo claro",
|
||||
"Dim group": "Grupo escuro",
|
||||
"None": "Nenhum",
|
||||
"Normal image": "Imagem normal",
|
||||
"Negative image": "Imagem negativa",
|
||||
"320x240": "320x240",
|
||||
"160x120": "160x120",
|
||||
"80x60": "80x60",
|
||||
"40x30": "40x30",
|
||||
"20x15": "20x15",
|
||||
"Controller": "Controlador",
|
||||
"Rotation": "Rotação",
|
||||
"Colour": "Cor",
|
||||
"Light Target": "Alvo leve",
|
||||
"Gain": "Ganho",
|
||||
"Negative Image": "Imagem negativa",
|
||||
"Format": "Formatar",
|
||||
"Normal image": "Imagem normal",
|
||||
"Negative image": "Imagem negativa",
|
||||
"Format": "Formato",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "Formato de corte",
|
||||
"External Light Filter": "Filtro de luz externo",
|
||||
"External Light Filter": "Filtro de luz externa",
|
||||
"Load Default": "Carregar padrão",
|
||||
"No Internet": "Sem Internet",
|
||||
"[Applet Mode]": "[Modo miniaplicativo]",
|
||||
"Language": "Idioma"
|
||||
|
||||
"Themezer": "Themezer",
|
||||
"Themezer Options": "Opções do Themezer",
|
||||
"Nsfw": "Temas 18+ (NSFW)",
|
||||
"Page": "Ir para página",
|
||||
"Page %zu / %zu": "Página %zu / %zu",
|
||||
"Enter Page Number": "Número da página",
|
||||
"Bad Page": "Página inválida",
|
||||
"Download theme?": "Baixar tema?",
|
||||
|
||||
"GitHub": "GitHub",
|
||||
"Downloading json": "Baixando JSON",
|
||||
"Select asset to download for ": "Selecione o recurso para baixar em ",
|
||||
|
||||
"Installing ": "Instalando ",
|
||||
"Uninstalling ": "Desinstalando ",
|
||||
"Deleting ": "Excluindo ",
|
||||
"Deleting": "Excluindo",
|
||||
"Pasting ": "Colando ",
|
||||
"Pasting": "Colando ",
|
||||
"Removing ": "Removendo ",
|
||||
"Scanning ": "Analisando ",
|
||||
"Creating ": "Criando ",
|
||||
"Copying ": "Copiando ",
|
||||
"Trying to load ": "Tentando carregar ",
|
||||
"Downloading ": "Baixando ",
|
||||
"Downloaded ": "Baixado ",
|
||||
"Removed ": "Removido ",
|
||||
"Checking MD5": "Checando MD5",
|
||||
"Loading...": "Carregando...",
|
||||
"Loading": "Carregando",
|
||||
"Empty!": "Vazio",
|
||||
"Not Ready...": "Não está pronto...",
|
||||
"Error loading page!": "Erro ao carregar página!",
|
||||
"Update avaliable: ": "Atualização disponível: ",
|
||||
"Download update: ": "Baixar autalização: ",
|
||||
"Updated to ": "Atualizado para ",
|
||||
"Press OK to restart Sphaira": "Selecione OK para reiniciar o sphaira",
|
||||
"Restart Sphaira?": "Reiniciar sphaira?",
|
||||
"Failed to download update": "Falha ao baixar a atualização",
|
||||
"Restore hbmenu?": "Restaurar hbmenu?",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "Falha ao buscar /switch/hbmenu.nro\nUse a AppStore para reinstalar o hbmenu",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "Falha ao restaurar o hbmenu, baixe o hbmenu novamente",
|
||||
"Failed to restore hbmenu, using sphaira instead": "Falha ao restaurar hbmenu, usando sphaira",
|
||||
"Restored hbmenu, closing sphaira": "hbmenu restaurado, fechando sphaira",
|
||||
"Restored hbmenu": "hbmenu restaurado",
|
||||
"Delete Selected files?": "Excluir os arquivos selecionados?",
|
||||
"Completely remove ": "Remover completamente ",
|
||||
"Are you sure you want to delete ": "Você tem certeza que quer excluir ",
|
||||
"Are you sure you wish to cancel?": "Você tem certeza que quer cancelar?",
|
||||
"If this message appears repeatedly, please open an issue.": "Se esta mensagem aparecer repetidamente, abra um issue."
|
||||
}
|
||||
|
||||
@@ -1,114 +1,255 @@
|
||||
{
|
||||
"[Applet Mode]": "[Режим апплета]",
|
||||
"No Internet": "Нет Интернета",
|
||||
"Files": "",
|
||||
"Apps": "",
|
||||
"Store": "",
|
||||
"Menu": "Меню",
|
||||
"Options": "Параметры темы",
|
||||
"OK": "",
|
||||
"Back": "Назад",
|
||||
"Select": "",
|
||||
"Open": "Открыть",
|
||||
"Launch": "Запуск",
|
||||
"Options": "Параметры",
|
||||
"Homebrew Options": "Варианты домашнего пивоварения",
|
||||
"Info": "Информация",
|
||||
"Install": "Установить",
|
||||
"Delete": "Удалить",
|
||||
"Restart": "",
|
||||
"Changelog": "",
|
||||
"Details": "",
|
||||
"Update": "",
|
||||
"Remove": "",
|
||||
"Restore": "",
|
||||
"Download": "Скачать",
|
||||
"Next Page": "Следующая страница",
|
||||
"Prev Page": "Предыдущая страница",
|
||||
"Unstar": "",
|
||||
"Star": "",
|
||||
"System memory": "",
|
||||
"microSD card": "",
|
||||
"Sd": "",
|
||||
"Image System memory": "",
|
||||
"Image microSD card": "",
|
||||
"Slow": "",
|
||||
"Normal": "",
|
||||
"Fast": "",
|
||||
"Yes": "Да",
|
||||
"No": "Нет",
|
||||
"Enabled": "Включено",
|
||||
"Disabled": "Отключено",
|
||||
|
||||
"Sort By": "Сортировать по",
|
||||
"Sort Options": "Параметры сортировки",
|
||||
"Updated": "Обновлено",
|
||||
"Size": "Размер",
|
||||
"Alphabetical": "Алфавитный",
|
||||
"Decending": "по убыванию",
|
||||
"Ascending": "восходящий",
|
||||
"Filter": "Фильтр",
|
||||
"Sort": "Сортировать",
|
||||
"Order": "Заказ",
|
||||
"Info": "Информация",
|
||||
"Delete": "Удалить",
|
||||
"Hide Sphaira": "Скрыть Сфаиру",
|
||||
"Are you sure you want to delete ": "Вы уверены, что хотите удалить ",
|
||||
"Install Forwarder": "Установить переадресатор",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ВНИМАНИЕ: Установка форвардеров приведет к бану!",
|
||||
"Back": "Назад",
|
||||
"Install": "Установить",
|
||||
"Fs": "Фс",
|
||||
"App": "Приложение",
|
||||
"Menu": "Меню",
|
||||
"Homebrew": "Домашнее пиво",
|
||||
"FileBrowser": "ФайлБраузер",
|
||||
"Open": "Открыть",
|
||||
"Order": "Порядок",
|
||||
"Search": "Поиск",
|
||||
"Updated": "Обновлено",
|
||||
"Updated (Star)": "",
|
||||
"Downloads": "Загрузки",
|
||||
"Size": "Размер",
|
||||
"Size (Star)": "",
|
||||
"Alphabetical": "По наименованию",
|
||||
"Alphabetical (Star)": "",
|
||||
"Likes": "",
|
||||
"ID": "",
|
||||
"Descending": "По убыванию",
|
||||
"Descending (down)": "По убыванию",
|
||||
"Desc": "По убыванию",
|
||||
"Ascending": "По возрастанию",
|
||||
"Ascending (Up)": "По возрастанию",
|
||||
"Asc": "По возрастанию",
|
||||
|
||||
"Menu Options": "Параметры меню",
|
||||
"Theme": "Тема",
|
||||
"Theme Options": "Параметры темы",
|
||||
"Select Theme": "Выберите тему",
|
||||
"Shuffle": "Перетасовать",
|
||||
"Music": "Музыка",
|
||||
"Show Hidden": "Показать скрытое",
|
||||
"Folders First": "Папки в первую очередь",
|
||||
"Hidden Last": "Скрытый последний",
|
||||
"Yes": "Да",
|
||||
"No": "Нет",
|
||||
"Network": "Сеть",
|
||||
"Network Options": "Параметры сети",
|
||||
"Nxlink": "Нкслинк",
|
||||
"Check for update": "Проверить наличие обновлений",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Nxlink Connected": "",
|
||||
"Nxlink Upload": "",
|
||||
"Nxlink Finished": "",
|
||||
"Switch-Handheld!": "",
|
||||
"Switch-Docked!": "",
|
||||
"Language": "Язык",
|
||||
"Auto": "",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "Журналирование",
|
||||
"Replace hbmenu on exit": "Заменить hbmenu при выходе",
|
||||
"Misc": "Прочее",
|
||||
"Misc Options": "Прочие параметры",
|
||||
"Web": "Интернет",
|
||||
"Install forwarders": "",
|
||||
"Install location": "",
|
||||
"Show install warning": "",
|
||||
"Text scroll speed": "",
|
||||
|
||||
"FileBrowser": "Файловый менеджер",
|
||||
"%zd files": "%zd files",
|
||||
"%zd dirs": "%zd dirs",
|
||||
"File Options": "Параметры файла",
|
||||
"Cut": "Резать",
|
||||
"Show Hidden": "Показать скрытые",
|
||||
"Folders First": "Папки в первую очередь",
|
||||
"Hidden Last": "Скрытые в последнюю очередь",
|
||||
"Cut": "Вырезать",
|
||||
"Copy": "Копировать",
|
||||
"Paste": "",
|
||||
"Paste ": "",
|
||||
" file(s)?": "",
|
||||
"Rename": "Переименовать",
|
||||
"Advanced Options": "Создать файл",
|
||||
"Set New File Name": "",
|
||||
"Advanced": "Продвинутые",
|
||||
"Advanced Options": "Расширенные параметры",
|
||||
"Create File": "Создать файл",
|
||||
"Set File Name": "",
|
||||
"Create Folder": "Создать папку",
|
||||
"View as text": "Посмотреть как текст",
|
||||
"Set Folder Name": "",
|
||||
"View as text (unfinished)": "Посмотреть как текст (незакончено)",
|
||||
"Set Archive Bit": "Установить бит архива",
|
||||
"Ignore read only": "",
|
||||
"Mount": "",
|
||||
"Empty...": "",
|
||||
"Open with DayBreak?": "",
|
||||
"Launch ": "",
|
||||
"Launch option for: ": "",
|
||||
"Select launcher for: ": "",
|
||||
|
||||
"Homebrew": "Homebrew",
|
||||
"Homebrew Options": "Параметры Homebrew",
|
||||
"Hide Sphaira": "Скрыть Sphaira",
|
||||
"Install Forwarder": "Установить форвардер",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ВНИМАНИЕ: Установка форвардеров приведет к бану!",
|
||||
"Installing Forwarder": "Установить форвардер",
|
||||
"Creating Program": "",
|
||||
"Creating Control": "",
|
||||
"Creating Meta": "",
|
||||
"Writing Nca": "",
|
||||
"Updating ncm databse": "",
|
||||
"Pushing application record": "",
|
||||
"Installed!": "",
|
||||
"Failed to install forwarder": "",
|
||||
"Unstarred ": "",
|
||||
"Starred ": "",
|
||||
|
||||
"AppStore": "",
|
||||
"Filter: %s | Sort: %s | Order: %s": "Фильтр: %s | Сортировать: %s | Порядок: %s",
|
||||
"AppStore Options": "Параметры магазина приложений",
|
||||
"All": "Все",
|
||||
"Games": "Игры",
|
||||
"Emulators": "Эмуляторы",
|
||||
"Tools": "Инструменты",
|
||||
"Advanced": "Передовой",
|
||||
"Themes": "Темы",
|
||||
"Legacy": "Наследие",
|
||||
"Misc": "Разное",
|
||||
"Downloads": "Загрузки",
|
||||
"Filter": "Фильтр",
|
||||
"Search": "Поиск",
|
||||
"Menu Options": "Опции меню",
|
||||
"Header": "Заголовок",
|
||||
"Theme": "Тема",
|
||||
"Network": "Сеть",
|
||||
"Logging": "Ведение журнала",
|
||||
"Enabled": "Включено",
|
||||
"Disabled": "Неполноценный",
|
||||
"Replace hbmenu on exit": "Заменить hbmenu при выходе",
|
||||
"Misc Options": "Разные параметры",
|
||||
"Themezer": "Темезер",
|
||||
"Irs": "IRS",
|
||||
"Web": "Интернет",
|
||||
"Download": "Скачать",
|
||||
"Next Page": "Следующая страница",
|
||||
"Prev Page": "Предыдущая страница",
|
||||
"Pad ": "Подушка ",
|
||||
"Legacy": "Легаси",
|
||||
"version: %s": "version: %s",
|
||||
"updated: %s": "updated: %s",
|
||||
"category: %s": "category: %s",
|
||||
"extracted: %.2f MiB": "extracted: %.2f MiB",
|
||||
"app_dls: %s": "app_dls: %s",
|
||||
"More by Author": "",
|
||||
"Leave Feedback": "",
|
||||
|
||||
"Irs": "Irs",
|
||||
"Ambient Noise Level: ": "",
|
||||
"Controller": "Контроллер",
|
||||
"Pad ": "Pad ",
|
||||
" (Available)": " (Доступно)",
|
||||
" (Unsupported)": "",
|
||||
" (Unconnected)": " (Не подключено)",
|
||||
"HandHeld": "Ручной",
|
||||
" (Available)": " (Доступный)",
|
||||
"0 (Sideways)": "0 (вбок)",
|
||||
"90 (Flat)": "90 (квартира)",
|
||||
"HandHeld": "Портативный",
|
||||
"Rotation": "Вращение",
|
||||
"0 (Sideways)": "0 (набок)",
|
||||
"90 (Flat)": "90 (ровно)",
|
||||
"180 (-Sideways)": "180 (-вбок)",
|
||||
"270 (Upside down)": "270 (перевернутый)",
|
||||
"270 (Upside down)": "270 (перевернуто)",
|
||||
"Colour": "Цвет",
|
||||
"Grey": "Серый",
|
||||
"Ironbow": "Железный лук",
|
||||
"Ironbow": "Стальной",
|
||||
"Green": "Зеленый",
|
||||
"Red": "Красный",
|
||||
"Blue": "Синий",
|
||||
"Light Target": "Световая мишень",
|
||||
"All leds": "Все светодиоды",
|
||||
"Bright group": "Яркая группа",
|
||||
"Dim group": "Тусклая группа",
|
||||
"None": "Никто",
|
||||
"Normal image": "Обычное изображение",
|
||||
"Negative image": "Негативный имидж",
|
||||
"320x240": "320x240",
|
||||
"160x120": "160x120",
|
||||
"80x60": "80х60",
|
||||
"40x30": "40x30",
|
||||
"20x15": "20x15",
|
||||
"Controller": "Контроллер",
|
||||
"Rotation": "Вращение",
|
||||
"Colour": "Цвет",
|
||||
"Light Target": "Легкая мишень",
|
||||
"Gain": "Прирост",
|
||||
"Negative Image": "Негативное изображение",
|
||||
"Normal image": "Обычное изображение",
|
||||
"Negative image": "Негативное изображение",
|
||||
"Format": "Формат",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "Формат обрезки",
|
||||
"External Light Filter": "Внешний светофильтр",
|
||||
"Load Default": "Загрузить по умолчанию",
|
||||
"No Internet": "Нет Интернета",
|
||||
"[Applet Mode]": "[Режим апплета]",
|
||||
"Language": "Язык"
|
||||
}
|
||||
"Load Default": "Загрузить умолчания",
|
||||
|
||||
"Themezer": "Themezer",
|
||||
"Themezer Options": "",
|
||||
"Nsfw": "",
|
||||
"Page": "",
|
||||
"Page %zu / %zu": "Page %zu / %zu",
|
||||
"Enter Page Number": "",
|
||||
"Bad Page": "",
|
||||
"Download theme?": "",
|
||||
|
||||
"GitHub": "",
|
||||
"Downloading json": "",
|
||||
"Select asset to download for ": "",
|
||||
|
||||
"Installing ": "",
|
||||
"Uninstalling ": "",
|
||||
"Deleting ": "",
|
||||
"Deleting": "",
|
||||
"Pasting ": "",
|
||||
"Pasting": "",
|
||||
"Removing ": "",
|
||||
"Scanning ": "",
|
||||
"Creating ": "",
|
||||
"Copying ": "",
|
||||
"Trying to load ": "",
|
||||
"Downloading ": "",
|
||||
"Downloaded ": "",
|
||||
"Removed ": "",
|
||||
"Checking MD5": "",
|
||||
"Loading...": "",
|
||||
"Loading": "",
|
||||
"Empty!": "",
|
||||
"Not Ready...": "",
|
||||
"Error loading page!": "",
|
||||
"Update avaliable: ": "",
|
||||
"Download update: ": "",
|
||||
"Updated to ": "",
|
||||
"Press OK to restart Sphaira": "",
|
||||
"Restart Sphaira?": "",
|
||||
"Failed to download update": "",
|
||||
"Restore hbmenu?": "",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "",
|
||||
"Failed to restore hbmenu, using sphaira instead": "",
|
||||
"Restored hbmenu, closing sphaira": "",
|
||||
"Restored hbmenu": "",
|
||||
"Delete Selected files?": "",
|
||||
"Completely remove ": "",
|
||||
"Are you sure you want to delete ": "Вы уверены, что хотите удалить ",
|
||||
"Are you sure you wish to cancel?": "",
|
||||
"If this message appears repeatedly, please open an issue.": ""
|
||||
}
|
||||
255
assets/romfs/i18n/se.json
Normal file
255
assets/romfs/i18n/se.json
Normal file
@@ -0,0 +1,255 @@
|
||||
{
|
||||
"[Applet Mode]": "[Applet-läge]",
|
||||
"No Internet": "Ingen Internetanslutning",
|
||||
"Files": "Filer",
|
||||
"Apps": "Appar",
|
||||
"Store": "Butik",
|
||||
"Menu": "Meny",
|
||||
"Options": "Alternativ",
|
||||
"OK": "OK",
|
||||
"Back": "Tillbaka",
|
||||
"Select": "Välj",
|
||||
"Open": "Öppna",
|
||||
"Launch": "Starta",
|
||||
"Info": "Info",
|
||||
"Install": "Installera",
|
||||
"Delete": "Radera",
|
||||
"Restart": "Starta om",
|
||||
"Changelog": "Ändringslogg",
|
||||
"Details": "Detaljer",
|
||||
"Update": "Uppdatera",
|
||||
"Remove": "Ta bort",
|
||||
"Restore": "Återställ",
|
||||
"Download": "Ladda ner",
|
||||
"Next Page": "Nästa sida",
|
||||
"Prev Page": "Föregående sida",
|
||||
"Unstar": "Avmarkera stjärna",
|
||||
"Star": "Markera stjärna",
|
||||
"System memory": "Systemminne",
|
||||
"microSD card": "microSD-kort",
|
||||
"Sd": "Sd",
|
||||
"Image System memory": "Avbild Systemminne",
|
||||
"Image microSD card": "Avbild microSD-kort",
|
||||
"Slow": "",
|
||||
"Normal": "",
|
||||
"Fast": "",
|
||||
"Yes": "Ja",
|
||||
"No": "Nej",
|
||||
"Enabled": "Aktiverad",
|
||||
"Disabled": "Inaktiverad",
|
||||
|
||||
"Sort By": "Sortera efter",
|
||||
"Sort Options": "Sorteringsalternativ",
|
||||
"Filter": "Filtrera",
|
||||
"Sort": "Sortera",
|
||||
"Order": "Ordning",
|
||||
"Search": "Sök",
|
||||
"Updated": "Uppdaterad",
|
||||
"Updated (Star)": "Uppdaterad (Stjärna)",
|
||||
"Downloads": "Nedladdningar",
|
||||
"Size": "Storlek",
|
||||
"Size (Star)": "Storlek (Stjärna)",
|
||||
"Alphabetical": "Alfabetisk",
|
||||
"Alphabetical (Star)": "Alfabetisk (Stjärna)",
|
||||
"Likes": "Gillar",
|
||||
"ID": "ID",
|
||||
"Descending": "Fallande",
|
||||
"Descending (down)": "Fallande (nedåt)",
|
||||
"Desc": "Fall",
|
||||
"Ascending": "Stigande",
|
||||
"Ascending (Up)": "Stigande (uppåt)",
|
||||
"Asc": "Stig",
|
||||
|
||||
"Menu Options": "Menyalternativ",
|
||||
"Theme": "Tema",
|
||||
"Theme Options": "Temaalternativ",
|
||||
"Select Theme": "Välj tema",
|
||||
"Shuffle": "Blanda",
|
||||
"Music": "Musik",
|
||||
"Network": "Nätverk",
|
||||
"Network Options": "Nätverksalternativ",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Nxlink Connected": "Nxlink ansluten",
|
||||
"Nxlink Upload": "Nxlink överför",
|
||||
"Nxlink Finished": "Nxlink klar",
|
||||
"Switch-Handheld!": "Switch Handhållen!",
|
||||
"Switch-Docked!": "Switch Dockad!",
|
||||
"Language": "Språk",
|
||||
"Auto": "Auto",
|
||||
"English": "Engelska",
|
||||
"Japanese": "Japanska",
|
||||
"French": "Franska",
|
||||
"German": "Tyska",
|
||||
"Italian": "Italienska",
|
||||
"Spanish": "Spanska",
|
||||
"Chinese": "Kinesiska",
|
||||
"Korean": "Koreanska",
|
||||
"Dutch": "Holländska",
|
||||
"Portuguese": "Portugisiska",
|
||||
"Russian": "Ryska",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "Loggning",
|
||||
"Replace hbmenu on exit": "Ersätt hbmenu vid avslut",
|
||||
"Misc": "Övrigt",
|
||||
"Misc Options": "Övriga alternativ",
|
||||
"Web": "Webb",
|
||||
"Install forwarders": "Installera genvägar",
|
||||
"Install location": "Installationsplats",
|
||||
"Show install warning": "Visa installationsvarning",
|
||||
"Text scroll speed": "",
|
||||
|
||||
"FileBrowser": "Filbläddrare",
|
||||
"%zd files": "%zd filer",
|
||||
"%zd dirs": "%zd kataloger",
|
||||
"File Options": "Filalternativ",
|
||||
"Show Hidden": "Visa dolda",
|
||||
"Folders First": "Mappar först",
|
||||
"Hidden Last": "Dolda sist",
|
||||
"Cut": "Klipp ut",
|
||||
"Copy": "Kopiera",
|
||||
"Paste": "Klistra in",
|
||||
"Paste ": "Klistra in ",
|
||||
" file(s)?": " fil(er)?",
|
||||
"Rename": "Byt namn",
|
||||
"Set New File Name": "Ange nytt filnamn",
|
||||
"Advanced": "Avancerat",
|
||||
"Advanced Options": "Avancerade alternativ",
|
||||
"Create File": "Skapa fil",
|
||||
"Set File Name": "Ange filnamn",
|
||||
"Create Folder": "Skapa mapp",
|
||||
"Set Folder Name": "Ange mappnamn",
|
||||
"View as text (unfinished)": "Visa som text (ofärdig)",
|
||||
"Ignore read only": "Ignorera skrivskydd",
|
||||
"Mount": "Montera",
|
||||
"Empty...": "Tom...",
|
||||
"Open with DayBreak?": "Öppna med DayBreak?",
|
||||
"Launch ": "Starta ",
|
||||
"Launch option for: ": "Startalternativ för: ",
|
||||
"Select launcher for: ": "Välj startprogram för: ",
|
||||
|
||||
"Homebrew": "Homebrew",
|
||||
"Homebrew Options": "Homebrew-alternativ",
|
||||
"Hide Sphaira": "Dölj Sphaira",
|
||||
"Install Forwarder": "Installera genväg",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "VARNING: Att installera genvägar kan leda till avstängning!",
|
||||
"Installing Forwarder": "Installerar genväg",
|
||||
"Creating Program": "Skapar program",
|
||||
"Creating Control": "Skapar kontroll",
|
||||
"Creating Meta": "Skapar metadata",
|
||||
"Writing Nca": "Skriver Nca",
|
||||
"Updating ncm databse": "Uppdaterar ncm-databas",
|
||||
"Pushing application record": "Skickar programpost",
|
||||
"Installed!": "Installerad!",
|
||||
"Failed to install forwarder": "Misslyckades att installera genväg",
|
||||
"Unstarred ": "Avmarkerad ",
|
||||
"Starred ": "Markerad ",
|
||||
|
||||
"AppStore": "AppStore",
|
||||
"Filter: %s | Sort: %s | Order: %s": "Filter: %s | Sortering: %s | Ordning: %s",
|
||||
"AppStore Options": "AppStore-alternativ",
|
||||
"All": "Alla",
|
||||
"Games": "Spel",
|
||||
"Emulators": "Emulatorer",
|
||||
"Tools": "Verktyg",
|
||||
"Themes": "Teman",
|
||||
"Legacy": "Legacy",
|
||||
"version: %s": "version: %s",
|
||||
"updated: %s": "uppdaterad: %s",
|
||||
"category: %s": "kategori: %s",
|
||||
"extracted: %.2f MiB": "extraherad: %.2f MiB",
|
||||
"app_dls: %s": "app_nedladdningar: %s",
|
||||
"More by Author": "Mer av författaren",
|
||||
"Leave Feedback": "Lämna feedback",
|
||||
|
||||
"Irs": "Irs",
|
||||
"Ambient Noise Level: ": "Omgivningsljudnivå: ",
|
||||
"Controller": "Kontroller",
|
||||
"Pad ": "Handkontroll ",
|
||||
" (Available)": " (Tillgänglig)",
|
||||
" (Unsupported)": " (Ej stödd)",
|
||||
" (Unconnected)": " (Ej ansluten)",
|
||||
"HandHeld": "Handhållen",
|
||||
"Rotation": "Rotation",
|
||||
"0 (Sideways)": "0 (Sidan)",
|
||||
"90 (Flat)": "90 (Platt)",
|
||||
"180 (-Sideways)": "180 (-Sidan)",
|
||||
"270 (Upside down)": "270 (Upp och ner)",
|
||||
"Colour": "Färg",
|
||||
"Grey": "Grå",
|
||||
"Ironbow": "Ironbow",
|
||||
"Green": "Grön",
|
||||
"Red": "Röd",
|
||||
"Blue": "Blå",
|
||||
"Light Target": "Ljusmål",
|
||||
"All leds": "Alla lysdioder",
|
||||
"Bright group": "Ljus grupp",
|
||||
"Dim group": "Dimma grupp",
|
||||
"None": "Ingen",
|
||||
"Gain": "Förstärkning",
|
||||
"Negative Image": "Negativ bild",
|
||||
"Normal image": "Normal bild",
|
||||
"Negative image": "Negativ bild",
|
||||
"Format": "Format",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "Trimningsformat",
|
||||
"External Light Filter": "Externt ljusfilter",
|
||||
"Load Default": "Ladda standard",
|
||||
|
||||
"Themezer": "Themezer",
|
||||
"Themezer Options": "Themezer-alternativ",
|
||||
"Nsfw": "Nsfw",
|
||||
"Page": "Sida",
|
||||
"Page %zu / %zu": "Sida %zu / %zu",
|
||||
"Enter Page Number": "Ange sidnummer",
|
||||
"Bad Page": "Ogiltig sida",
|
||||
"Download theme?": "Ladda ner tema?",
|
||||
|
||||
"GitHub": "GitHub",
|
||||
"Downloading json": "Laddar ner JSON",
|
||||
"Select asset to download for ": "Välj tillgång att ladda ner för ",
|
||||
|
||||
"Installing ": "Installerar ",
|
||||
"Uninstalling ": "Avinstallerar ",
|
||||
"Deleting ": "Raderar ",
|
||||
"Deleting": "Raderar",
|
||||
"Pasting ": "Klistrar in ",
|
||||
"Pasting": "Klistrar in",
|
||||
"Removing ": "Tar bort ",
|
||||
"Scanning ": "Skannar ",
|
||||
"Creating ": "Skapar ",
|
||||
"Copying ": "Kopierar ",
|
||||
"Trying to load ": "Försöker ladda ",
|
||||
"Downloading ": "Laddar ner ",
|
||||
"Downloaded ": "Nedladdad ",
|
||||
"Removed ": "Borttagen ",
|
||||
"Checking MD5": "Kontrollerar MD5",
|
||||
"Loading...": "Laddar...",
|
||||
"Loading": "Laddar",
|
||||
"Empty!": "Tomt!",
|
||||
"Not Ready...": "Inte redo...",
|
||||
"Error loading page!": "Fel vid laddning av sida!",
|
||||
"Update avaliable: ": "Uppdatering tillgänglig: ",
|
||||
"Download update: ": "Ladda ner uppdatering: ",
|
||||
"Updated to ": "Uppdaterad till ",
|
||||
"Press OK to restart Sphaira": "",
|
||||
"Restart Sphaira?": "Starta om Sphaira?",
|
||||
"Failed to download update": "Misslyckades att ladda ner uppdatering",
|
||||
"Restore hbmenu?": "Återställ hbmenu?",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "Kunde inte hitta /switch/hbmenu.nro\nInstallera om hbmenu från Appstore ",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "Misslyckades med att återställa hbmenu, vänligen ladda ner hbmenu igen.",
|
||||
"Failed to restore hbmenu, using sphaira instead": "Misslyckades med att återställa hbmenu, använder istället sphaira.",
|
||||
"Restored hbmenu, closing sphaira": "Återställde hbmenu, stänger sphaira.",
|
||||
"Restored hbmenu": "Återställde hbmenu.",
|
||||
"Delete Selected files?": "Radera valda filer?",
|
||||
"Completely remove ": "Ta bort helt ",
|
||||
"Are you sure you want to delete ": "Är du säker på att du vill radera ",
|
||||
"Are you sure you wish to cancel?": "Är du säker på att du vill avbryta?",
|
||||
"If this message appears repeatedly, please open an issue.": "Om detta meddelande visas upprepade gånger, vänligen öppna en felanmälan.",
|
||||
}
|
||||
255
assets/romfs/i18n/vi.json
Normal file
255
assets/romfs/i18n/vi.json
Normal file
@@ -0,0 +1,255 @@
|
||||
{
|
||||
"[Applet Mode]": "[Applet Mode]",
|
||||
"No Internet": "Không có Internet",
|
||||
"Files": "Tập tin",
|
||||
"Apps": "Ứng dụng",
|
||||
"Store": "Cửa hàng",
|
||||
"Menu": "Menu",
|
||||
"Options": "Tuỳ chọn",
|
||||
"OK": "OK",
|
||||
"Back": "Trở về",
|
||||
"Select": "Chọn",
|
||||
"Open": "Mở",
|
||||
"Launch": "Chạy",
|
||||
"Info": "Thông tin",
|
||||
"Install": "Cài đặt",
|
||||
"Delete": "Xoá",
|
||||
"Restart": "Khởi động lại",
|
||||
"Changelog": "Thay đổi",
|
||||
"Details": "Chi tiết",
|
||||
"Update": "Cập nhật",
|
||||
"Remove": "Gỡ",
|
||||
"Restore": "Khôi phục",
|
||||
"Download": "Tải về",
|
||||
"Next Page": "Trang kế",
|
||||
"Prev Page": "Trang trước",
|
||||
"Unstar": "Xoá yêu thích",
|
||||
"Star": "Yêu thích",
|
||||
"System memory": "Bộ nhớ máy",
|
||||
"microSD card": "Thẻ nhớ",
|
||||
"Sd": "Sd",
|
||||
"Image System memory": "Bộ nhớ hệ thống hình ảnh",
|
||||
"Image microSD card": "Thẻ nhớ hệ thống hình ảnh",
|
||||
"Slow": "",
|
||||
"Normal": "",
|
||||
"Fast": "",
|
||||
"Yes": "Có",
|
||||
"No": "Không",
|
||||
"Enabled": "Bật",
|
||||
"Disabled": "Tắt",
|
||||
|
||||
"Sort By": "Sắp xếp bởi",
|
||||
"Sort Options": "Tuỳ chọn sắp xếp",
|
||||
"Filter": "Lọc",
|
||||
"Sort": "Sắp xếp",
|
||||
"Order": "Thứ tự",
|
||||
"Search": "Tìm kiếm",
|
||||
"Updated": "Updated",
|
||||
"Updated (Star)": "Đã cập nhật (Yêu thích)",
|
||||
"Downloads": "Danh sách tải về",
|
||||
"Size": "Kích thước",
|
||||
"Size (Star)": "Kích thước (Yêu thích)",
|
||||
"Alphabetical": "A-Z",
|
||||
"Alphabetical (Star)": "A-Z (Yêu thích)",
|
||||
"Likes": "Thích",
|
||||
"ID": "ID",
|
||||
"Descending": "Giảm dần",
|
||||
"Descending (down)": "Giảm dần (xuống)",
|
||||
"Desc": "Giảm",
|
||||
"Ascending": "Tăng dần",
|
||||
"Ascending (Up)": "Tăng dần (lên)",
|
||||
"Asc": "Tăng",
|
||||
|
||||
"Menu Options": "Menu tuỳ chọn",
|
||||
"Theme": "Theme",
|
||||
"Theme Options": "Theme tuỳ chọn",
|
||||
"Select Theme": "Chọn Theme",
|
||||
"Shuffle": "Trộn",
|
||||
"Music": "Âm nhạc",
|
||||
"Network": "Mạng",
|
||||
"Network Options": "Tuỳ chọn mạng",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Nxlink Connected": "Nxlink Kết Nối",
|
||||
"Nxlink Upload": "Nxlink Đăng Tải",
|
||||
"Nxlink Finished": "Nxlink Hoàn Thành",
|
||||
"Switch-Handheld!": "Switch-Handheld!",
|
||||
"Switch-Docked!": "Switch-Docked!",
|
||||
"Language": "Ngôn ngữ",
|
||||
"Auto": "Tự động",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Việt Nam",
|
||||
"Logging": "Logging",
|
||||
"Replace hbmenu on exit": "Thay thế hbmenu khi thoát",
|
||||
"Misc": "Tiện ích",
|
||||
"Misc Options": "Tiện ích mở rộng",
|
||||
"Web": "Web",
|
||||
"Install forwarders": "Cài ra màn hình",
|
||||
"Install location": "Vị trí cài đặt",
|
||||
"Show install warning": "Hiển thị cảnh báo cài đặt",
|
||||
"Text scroll speed": "",
|
||||
|
||||
"FileBrowser": "Duyệt tập tin",
|
||||
"%zd files": "%zd tập tin",
|
||||
"%zd dirs": "%zd thư mục",
|
||||
"File Options": "Tuỳ chọn tập tin",
|
||||
"Show Hidden": "Hiển thị tập tin ẩn",
|
||||
"Folders First": "Thư mục đầu tiên",
|
||||
"Hidden Last": "Ẩn cuối",
|
||||
"Cut": "Cắt",
|
||||
"Copy": "Sao chép",
|
||||
"Paste": "Dán",
|
||||
"Paste ": "Paste ",
|
||||
" file(s)?": " tập tin(nhiều)?",
|
||||
"Rename": "Đổi tên",
|
||||
"Set New File Name": "Đặt tên mới cho tập tin",
|
||||
"Advanced": "Mở rộng",
|
||||
"Advanced Options": "Tuỳ chọn mở rộng",
|
||||
"Create File": "Tạo tập tin",
|
||||
"Set File Name": "Đặt tên cho tập tin",
|
||||
"Create Folder": "Tạo thư mục",
|
||||
"Set Folder Name": "Đặt tên thư mục",
|
||||
"View as text (unfinished)": "Xem dạng văn bản (chưa xong)",
|
||||
"Ignore read only": "Bỏ qua chỉ đọc",
|
||||
"Mount": "Gắn",
|
||||
"Empty...": "Rỗng...",
|
||||
"Open with DayBreak?": "Mở với DayBreak?",
|
||||
"Launch ": "Chạy ",
|
||||
"Launch option for: ": "Chạy với tuỳ chọn cho: ",
|
||||
"Select launcher for: ": "Chọn trình chạy cho: ",
|
||||
|
||||
"Homebrew": "Homebrew",
|
||||
"Homebrew Options": "Tuỳ chọn Homebrew",
|
||||
"Hide Sphaira": "Ẩn Sphaira",
|
||||
"Install Forwarder": "Cài ra ngoài màn hình",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "CẢNH BÁO: Bạn có chắn muốn cài ra ngoài màn hình!",
|
||||
"Installing Forwarder": "Đang cài đặt ra ngoài màn hình",
|
||||
"Creating Program": "Tạo chương trình",
|
||||
"Creating Control": "Tạo điều khiển",
|
||||
"Creating Meta": "Tạo Meta",
|
||||
"Writing Nca": "Ghi Nca",
|
||||
"Updating ncm databse": "Cập nhật ncm databse",
|
||||
"Pushing application record": "Đẩy ứng dụng",
|
||||
"Installed!": "Đã cài xong!",
|
||||
"Failed to install forwarder": "Cài đặt ra ngoài màn hình thất bại",
|
||||
"Unstarred ": "Bỏ yêu thích ",
|
||||
"Starred ": "Đã yêu thích ",
|
||||
|
||||
"AppStore": "AppStore",
|
||||
"Filter: %s | Sort: %s | Order: %s": "Lọc: %s | Sắp xếp: %s | Thứ tự: %s",
|
||||
"AppStore Options": "Tuỳ chọn AppStore",
|
||||
"All": "Tất cả",
|
||||
"Games": "Games",
|
||||
"Emulators": "Emulators",
|
||||
"Tools": "Tools",
|
||||
"Themes": "Themes",
|
||||
"Legacy": "Legacy",
|
||||
"version: %s": "version: %s",
|
||||
"updated: %s": "updated: %s",
|
||||
"category: %s": "category: %s",
|
||||
"extracted: %.2f MiB": "extracted: %.2f MiB",
|
||||
"app_dls: %s": "app_dls: %s",
|
||||
"More by Author": "Xem thêm tác giả",
|
||||
"Leave Feedback": "Để lại phản hồi",
|
||||
|
||||
"Irs": "Irs",
|
||||
"Ambient Noise Level: ": "Mức ồn xung quanh: ",
|
||||
"Controller": "Điều khiển",
|
||||
"Pad ": "Pad ",
|
||||
" (Available)": " (Có sẵn)",
|
||||
" (Unsupported)": " (Không hỗ trợ)",
|
||||
" (Unconnected)": " (Không kết nối)",
|
||||
"HandHeld": "Cầm tay",
|
||||
"Rotation": "Xoay",
|
||||
"0 (Sideways)": "0 (Đi ngang)",
|
||||
"90 (Flat)": "90 (Phẳng)",
|
||||
"180 (-Sideways)": "180 (-Đi ngang)",
|
||||
"270 (Upside down)": "270 (Lộn ngược)",
|
||||
"Colour": "Màu sắc",
|
||||
"Grey": "Xám",
|
||||
"Ironbow": "Ironbow",
|
||||
"Green": "Xanh",
|
||||
"Red": "Đỏ",
|
||||
"Blue": "Xanh dương",
|
||||
"Light Target": "Điểm sáng",
|
||||
"All leds": "Tất cả đèn led",
|
||||
"Bright group": "Nhóm sáng",
|
||||
"Dim group": "Nhóm tối",
|
||||
"None": "Không có",
|
||||
"Gain": "Tăng",
|
||||
"Negative Image": "Ảnh âm bản",
|
||||
"Normal image": "Ảnh bình thường",
|
||||
"Negative image": "Ảnh âm bản",
|
||||
"Format": "Định dạng",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "Định dạng cắt tỉa",
|
||||
"External Light Filter": "Bộ lộc ánh sáng bên ngoài",
|
||||
"Load Default": "Tải mặc định",
|
||||
|
||||
"Themezer": "Themezer",
|
||||
"Themezer Options": "Tuỳ chọn Themezer",
|
||||
"Nsfw": "18+",
|
||||
"Page": "Trang",
|
||||
"Page %zu / %zu": "Trang %zu / %zu",
|
||||
"Enter Page Number": "Nhập số trang",
|
||||
"Bad Page": "Trang không tồn tại",
|
||||
"Download theme?": "Tải theme?",
|
||||
|
||||
"GitHub": "GitHub",
|
||||
"Downloading json": "Đang tải json",
|
||||
"Select asset to download for ": "Chọn nội dung để tải xuống cho ",
|
||||
|
||||
"Installing ": "Đang cài đặt ",
|
||||
"Uninstalling ": "Đang gỡ cài đặt ",
|
||||
"Deleting ": "Đang xoá ",
|
||||
"Deleting": "Đang xoá",
|
||||
"Pasting ": "Đang dán ",
|
||||
"Pasting": "Đang dán",
|
||||
"Removing ": "Đang gỡ ",
|
||||
"Scanning ": "Đang quét ",
|
||||
"Creating ": "Đang tạo ",
|
||||
"Copying ": "Đang sao chép ",
|
||||
"Trying to load ": "Đang cố gắn mở ",
|
||||
"Downloading ": "Đang tải xuống ",
|
||||
"Downloaded ": "Đã tải xong ",
|
||||
"Removed ": "Đã gỡ ",
|
||||
"Checking MD5": "Kiểm tra MD5",
|
||||
"Loading...": "Đang tải...",
|
||||
"Loading": "Đang tải",
|
||||
"Empty!": "Trống!",
|
||||
"Not Ready...": "Chưa sẵn sàng...",
|
||||
"Error loading page!": "Lỗi tải trang!",
|
||||
"Update avaliable: ": "Cập nhậc có sẵn: ",
|
||||
"Download update: ": "Tải cập nhật: ",
|
||||
"Updated to ": "Đã cập nhật ",
|
||||
"Press OK to restart Sphaira": "",
|
||||
"Restart Sphaira?": "Khởi động lại Sphaira?",
|
||||
"Failed to download update": "Cập nhật thất bại",
|
||||
"Restore hbmenu?": "Khôi phục hbmenu?",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "Không tìm thấy /switch/hbmenu.nro\nSử dụng AppStore để cài lại hbmenu",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "Không thể khôi phục hbmenu, Vui lòng tải lại hbmenu",
|
||||
"Failed to restore hbmenu, using sphaira instead": "Không thể khôi phục hbmenu, thay vào đó sử dụng Sphira",
|
||||
"Restored hbmenu, closing sphaira": "Khôi mục hbmenu thành công, đóng sphaira",
|
||||
"Restored hbmenu": "Đã khôi phục hbmenu",
|
||||
"Delete Selected files?": "Xoá những tập tin được chọn?",
|
||||
"Completely remove ": "Đã gỡ thành công ",
|
||||
"Are you sure you want to delete ": "Bạn có muốn xoá ",
|
||||
"Are you sure you wish to cancel?": "Bạn có chắn muốn huỷ không?",
|
||||
"If this message appears repeatedly, please open an issue.": "Nếu thấy tin nhắn này, hãy báo lỗi."
|
||||
}
|
||||
@@ -1,114 +1,255 @@
|
||||
{
|
||||
"Launch": "发射",
|
||||
"[Applet Mode]": "[小程序模式]",
|
||||
"No Internet": "网络未连接",
|
||||
"Files": "文件",
|
||||
"Apps": "应用",
|
||||
"Store": "商店",
|
||||
"Menu": "菜单",
|
||||
"Options": "选项",
|
||||
"Homebrew Options": "自制选项",
|
||||
"OK": "确定",
|
||||
"Back": "返回",
|
||||
"Select": "选择",
|
||||
"Open": "打开",
|
||||
"Launch": "启动",
|
||||
"Info": "信息",
|
||||
"Install": "安装",
|
||||
"Delete": "删除",
|
||||
"Restart": "重启",
|
||||
"Changelog": "更新日志",
|
||||
"Details": "详情",
|
||||
"Update": "更新",
|
||||
"Remove": "删除",
|
||||
"Restore": "恢复",
|
||||
"Download": "下载",
|
||||
"Next Page": "下一页",
|
||||
"Prev Page": "上一页",
|
||||
"Unstar": "取消星标",
|
||||
"Star": "星标",
|
||||
"System memory": "主机内存",
|
||||
"microSD card": "SD卡",
|
||||
"Sd": "SD卡",
|
||||
"Image System memory": "主机内存图像",
|
||||
"Image microSD card": "SD卡图像",
|
||||
"Slow": "",
|
||||
"Normal": "",
|
||||
"Fast": "",
|
||||
"Yes": "是",
|
||||
"No": "否",
|
||||
"Enabled": "启用",
|
||||
"Disabled": "禁用",
|
||||
|
||||
"Sort By": "排序方式",
|
||||
"Sort Options": "排序选项",
|
||||
"Updated": "已更新",
|
||||
"Size": "尺寸",
|
||||
"Filter": "筛选",
|
||||
"Sort": "排序",
|
||||
"Order": "顺序",
|
||||
"Search": "搜索",
|
||||
"Updated": "最近使用",
|
||||
"Updated (Star)": "最近更新(星标优先)",
|
||||
"Downloads": "下载",
|
||||
"Size": "按大小",
|
||||
"Size (Star)": "按大小(星标优先)",
|
||||
"Alphabetical": "按字母顺序",
|
||||
"Decending": "降序",
|
||||
"Alphabetical (Star)": "按字母顺序(星标优先)",
|
||||
"Likes": "点赞量",
|
||||
"ID": "ID",
|
||||
"Descending": "降序",
|
||||
"Descending (down)": "降序",
|
||||
"Desc": "降序",
|
||||
"Ascending": "升序",
|
||||
"Sort": "种类",
|
||||
"Order": "命令",
|
||||
"Info": "信息",
|
||||
"Delete": "删除",
|
||||
"Hide Sphaira": "隐藏斯菲拉",
|
||||
"Are you sure you want to delete ": "您确定要删除吗 ",
|
||||
"Install Forwarder": "安装转发器",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "警告:安装转发器将导致禁止!",
|
||||
"Back": "后退",
|
||||
"Install": "安装",
|
||||
"Fs": "FS",
|
||||
"App": "应用程序",
|
||||
"Menu": "菜单",
|
||||
"Homebrew": "自制",
|
||||
"FileBrowser": "文件浏览器",
|
||||
"Open": "打开",
|
||||
"Ascending (Up)": "升序",
|
||||
"Asc": "升序",
|
||||
|
||||
"Menu Options": "菜单选项",
|
||||
"Theme": "主题",
|
||||
"Theme Options": "主题选项",
|
||||
"Select Theme": "选择主题",
|
||||
"Shuffle": "随机播放",
|
||||
"Music": "音乐",
|
||||
"Show Hidden": "显示隐藏",
|
||||
"Folders First": "文件夹优先",
|
||||
"Hidden Last": "隐藏最后",
|
||||
"Yes": "是的",
|
||||
"No": "不",
|
||||
"Network": "网络",
|
||||
"Network Options": "网络选项",
|
||||
"Nxlink": "恩克斯联",
|
||||
"Check for update": "检查更新",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink插件提交",
|
||||
"Nxlink Connected": "Nxlink 已连接",
|
||||
"Nxlink Upload": "Nxlink 上传中",
|
||||
"Nxlink Finished": "Nxlink 已结束",
|
||||
"Switch-Handheld!": "切换至掌机模式!",
|
||||
"Switch-Docked!": "切换至底座模式!",
|
||||
"Language": "语言",
|
||||
"Auto": "自动",
|
||||
"English": "English",
|
||||
"Japanese": "日本語",
|
||||
"French": "Français",
|
||||
"German": "Deutsch",
|
||||
"Italian": "Italiano",
|
||||
"Spanish": "Español",
|
||||
"Chinese": "中文",
|
||||
"Korean": "한국어",
|
||||
"Dutch": "Dutch",
|
||||
"Portuguese": "Português",
|
||||
"Russian": "Русский",
|
||||
"Swedish": "Svenska",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Logging": "日志",
|
||||
"Replace hbmenu on exit": "退出后用Sphaira替换hbmenu",
|
||||
"Misc": "拓展",
|
||||
"Misc Options": "拓展设置",
|
||||
"Web": "网页浏览器",
|
||||
"Install forwarders": "允许安装前端应用",
|
||||
"Install location": "安装位置",
|
||||
"Show install warning": "显示安装警告",
|
||||
"Text scroll speed": "",
|
||||
|
||||
"FileBrowser": "文件浏览",
|
||||
"%zd files": "%zd 个文件",
|
||||
"%zd dirs": "%zd 个文件夹",
|
||||
"File Options": "文件选项",
|
||||
"Cut": "切",
|
||||
"Show Hidden": "显示隐藏项目",
|
||||
"Folders First": "文件夹靠前",
|
||||
"Hidden Last": "隐藏项目置后",
|
||||
"Cut": "剪切",
|
||||
"Copy": "复制",
|
||||
"Paste": "粘贴",
|
||||
"Paste ": "粘贴 ",
|
||||
" file(s)?": "个文件(夹)?",
|
||||
"Rename": "重命名",
|
||||
"Advanced Options": "创建文件",
|
||||
"Create File": "创建文件",
|
||||
"Create Folder": "创建文件夹",
|
||||
"View as text": "以文本形式查看",
|
||||
"View as text (unfinished)": "以文本形式查看(未完成)",
|
||||
"Set Archive Bit": "设置存档位",
|
||||
"Set New File Name": "输入新命名",
|
||||
"Advanced": "高级",
|
||||
"Advanced Options": "高级选项",
|
||||
"Create File": "新建文件",
|
||||
"Set File Name": "输入文件名",
|
||||
"Create Folder": "新建文件夹",
|
||||
"Set Folder Name": "输入文件夹名",
|
||||
"View as text (unfinished)": "以文本形式查看(未完善)",
|
||||
"Ignore read only": "忽略只读",
|
||||
"Mount": "挂载",
|
||||
"Empty...": "空...",
|
||||
"Open with DayBreak?": "使用DayBreak打开?",
|
||||
"Launch ": "启动 ",
|
||||
"Launch option for: ": "启动选项:",
|
||||
"Select launcher for: ": "选择启动器用于:",
|
||||
|
||||
"Homebrew": "应用列表",
|
||||
"Homebrew Options": "应用选项",
|
||||
"Hide Sphaira": "在应用列表中隐藏Sphaira",
|
||||
"Install Forwarder": "安装前端应用",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "警告:安装前端应用可能导致ban机!",
|
||||
"Installing Forwarder": "正在生成前端应用",
|
||||
"Creating Program": "正在创建程序",
|
||||
"Creating Control": "正在创建控制器",
|
||||
"Creating Meta": "正在创建元数据",
|
||||
"Writing Nca": "正在写入Nca",
|
||||
"Updating ncm databse": "正在更新ncm数据库",
|
||||
"Pushing application record": "正在推送应用记录",
|
||||
"Installed!": "安装完成!",
|
||||
"Failed to install forwarder": "前端应用安装失败",
|
||||
"Unstarred ": "取消星标 ",
|
||||
"Starred ": "已星标 ",
|
||||
|
||||
"AppStore": "应用商店",
|
||||
"Filter: %s | Sort: %s | Order: %s": "筛选: %s | 排序: %s | 顺序: %s",
|
||||
"AppStore Options": "应用商店选项",
|
||||
"All": "全部",
|
||||
"Games": "游戏",
|
||||
"Emulators": "模拟器",
|
||||
"Tools": "工具",
|
||||
"Advanced": "先进的",
|
||||
"Themes": "主题",
|
||||
"Legacy": "遗产",
|
||||
"Misc": "杂项",
|
||||
"Downloads": "下载",
|
||||
"Filter": "筛选",
|
||||
"Search": "搜索",
|
||||
"Menu Options": "菜单选项",
|
||||
"Header": "标头",
|
||||
"Theme": "主题",
|
||||
"Network": "网络",
|
||||
"Logging": "记录",
|
||||
"Enabled": "启用",
|
||||
"Disabled": "残疾人",
|
||||
"Replace hbmenu on exit": "退出时替换 hbmenu",
|
||||
"Misc Options": "其他选项",
|
||||
"Themezer": "主题器",
|
||||
"Irs": "国税局",
|
||||
"Web": "网络",
|
||||
"Download": "下载",
|
||||
"Next Page": "下一页",
|
||||
"Prev Page": "上一页",
|
||||
"Pad ": "软垫 ",
|
||||
" (Unconnected)": " (未连接)",
|
||||
"HandHeld": "手持式",
|
||||
" (Available)": " (可用的)",
|
||||
"0 (Sideways)": "0(横向)",
|
||||
"90 (Flat)": "90(平)",
|
||||
"180 (-Sideways)": "180(-横向)",
|
||||
"270 (Upside down)": "270(颠倒)",
|
||||
"Grey": "灰色的",
|
||||
"Ironbow": "铁弓",
|
||||
"Green": "绿色的",
|
||||
"Red": "红色的",
|
||||
"Blue": "蓝色的",
|
||||
"All leds": "所有 LED",
|
||||
"Bright group": "光明集团",
|
||||
"Dim group": "昏暗组",
|
||||
"None": "没有任何",
|
||||
"Normal image": "正常图像",
|
||||
"Negative image": "负像",
|
||||
"320x240": "320x240",
|
||||
"160x120": "160x120",
|
||||
"80x60": "80x60",
|
||||
"40x30": "40x30",
|
||||
"20x15": "20x15",
|
||||
"Legacy": "可更新",
|
||||
"version: %s": "版本: %s",
|
||||
"updated: %s": "更新时间: %s",
|
||||
"category: %s": "分类: %s",
|
||||
"extracted: %.2f MiB": "应用大小: %.2f MiB",
|
||||
"app_dls: %s": "下载量: %s",
|
||||
"More by Author": "作者更多作品",
|
||||
"Leave Feedback": "留言反馈",
|
||||
|
||||
"Irs": "红外成像",
|
||||
"Ambient Noise Level: ": "环境噪声等级:",
|
||||
"Controller": "控制器",
|
||||
"Pad ": "手柄 ",
|
||||
" (Available)": " (可用的)",
|
||||
" (Unsupported)": "",
|
||||
" (Unconnected)": " (未连接)",
|
||||
"HandHeld": "掌机模式",
|
||||
"Rotation": "旋转",
|
||||
"0 (Sideways)": "0度",
|
||||
"90 (Flat)": "90度",
|
||||
"180 (-Sideways)": "180度",
|
||||
"270 (Upside down)": "270度",
|
||||
"Colour": "颜色",
|
||||
"Light Target": "光目标",
|
||||
"Gain": "获得",
|
||||
"Negative Image": "负面形象",
|
||||
"Grey": "灰色",
|
||||
"Ironbow": "紫黄",
|
||||
"Green": "绿色",
|
||||
"Red": "红色",
|
||||
"Blue": "蓝色",
|
||||
"Light Target": "光源目标",
|
||||
"All leds": "全部",
|
||||
"Bright group": "亮色组",
|
||||
"Dim group": "暗色组",
|
||||
"None": "无",
|
||||
"Gain": "曝光",
|
||||
"Negative Image": "负片图像",
|
||||
"Normal image": "正常图像",
|
||||
"Negative image": "负片图像",
|
||||
"Format": "格式",
|
||||
"Trimming Format": "修剪格式",
|
||||
"External Light Filter": "外部滤光片",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"Trimming Format": "裁剪格式",
|
||||
"External Light Filter": "外部光滤镜",
|
||||
"Load Default": "加载默认值",
|
||||
"No Internet": "没有互联网",
|
||||
"[Applet Mode]": "[小程序模式]",
|
||||
"Language": "语言"
|
||||
|
||||
"Themezer": "在线主题",
|
||||
"Themezer Options": "在线主题选项",
|
||||
"Nsfw": "公共场合不宜的主题",
|
||||
"Page": "页面",
|
||||
"Page %zu / %zu": "页面 %zu / %zu",
|
||||
"Enter Page Number": "输入跳转的页码",
|
||||
"Bad Page": "错误的页面",
|
||||
"Download theme?": "下载该主题?",
|
||||
|
||||
"GitHub": "GitHub",
|
||||
"Downloading json": "正在下载 json",
|
||||
"Select asset to download for ": "选择要下载的资源用于 ",
|
||||
|
||||
"Installing ": "正在安装 ",
|
||||
"Uninstalling ": "正在卸载 ",
|
||||
"Deleting ": "正在删除 ",
|
||||
"Deleting": "正在删除",
|
||||
"Pasting ": "正在粘贴 ",
|
||||
"Pasting": "正在粘贴",
|
||||
"Removing ": "正在移除 ",
|
||||
"Scanning ": "正在扫描 ",
|
||||
"Creating ": "正在创建 ",
|
||||
"Copying ": "正在复制 ",
|
||||
"Trying to load ": "尝试加载 ",
|
||||
"Downloading ": "正在下载 ",
|
||||
"Downloaded ": "已下载 ",
|
||||
"Removed ": "已移除 ",
|
||||
"Checking MD5": "正在校验 MD5",
|
||||
"Loading...": "加载中...",
|
||||
"Loading": "加载中",
|
||||
"Empty!": "空空如野!",
|
||||
"Not Ready...": "尚未准备好...",
|
||||
"Error loading page!": "页面加载失败!",
|
||||
"Update avaliable: ": "有可用更新!",
|
||||
"Download update: ": "下载更新:",
|
||||
"Updated to ": "更新至 ",
|
||||
"Press OK to restart Sphaira": "",
|
||||
"Restart Sphaira?": "重启 Sphaira?",
|
||||
"Failed to download update": "更新下载失败",
|
||||
"Restore hbmenu?": "恢复 hbmenu?",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "未能找到 /switch/hbmenu.nro\n请使用应用商店重新安装 hbmenu",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "恢复 hbmenu 失败,请重新下载 hbmenu",
|
||||
"Failed to restore hbmenu, using sphaira instead": "恢复 hbmenu 失败,改用 Sphaira",
|
||||
"Restored hbmenu, closing sphaira": "已恢复 hbmenu,正在关闭 Sphaira",
|
||||
"Restored hbmenu": "已恢复 hbmenu",
|
||||
"Delete Selected files?": "删除选中的文件?",
|
||||
"Completely remove ": "彻底删除 ",
|
||||
"Are you sure you want to delete ": "您确定要删除吗 ",
|
||||
"Are you sure you wish to cancel?": "您确定要取消吗?",
|
||||
"If this message appears repeatedly, please open an issue.": "如果此消息反复出现,请提交一个 issue。"
|
||||
}
|
||||
|
||||
BIN
assets/romfs/theme/bubble1.png
Normal file
BIN
assets/romfs/theme/bubble1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.0 KiB |
BIN
assets/romfs/theme/bubble2.png
Normal file
BIN
assets/romfs/theme/bubble2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.4 KiB |
BIN
assets/romfs/theme/bubble3.png
Normal file
BIN
assets/romfs/theme/bubble3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.0 KiB |
@@ -1,22 +1,23 @@
|
||||
[meta]
|
||||
name=Abyss
|
||||
author=TotalJustice
|
||||
version=1.0.0
|
||||
; unused currently
|
||||
preview=romfs:/theme/preview.jpg
|
||||
version=1.1.0
|
||||
inherit=romfs:/themes/base_black_theme.ini
|
||||
|
||||
[theme]
|
||||
background=0x0f111aff
|
||||
grid=0x0f115c30
|
||||
selected=0x0f115cff
|
||||
selected_overlay=0x529cffff
|
||||
text=0xffbc41ff
|
||||
text_selected=0x529cffff
|
||||
background = 0x0f111a
|
||||
grid = 0x0f115c30
|
||||
popup = 0x0f115c
|
||||
|
||||
icon_audio=romfs:/theme/icon_audio.png
|
||||
icon_video=romfs:/theme/icon_video.png
|
||||
icon_image=romfs:/theme/icon_image.png
|
||||
icon_file=romfs:/theme/icon_file.png
|
||||
icon_folder=romfs:/theme/icon_folder.png
|
||||
icon_zip=romfs:/theme/icon_zip.png
|
||||
icon_nro=romfs:/theme/icon_nro.png
|
||||
line = 0xffbc41
|
||||
line_seperator = 0xffbc41
|
||||
|
||||
text = 0xffbc41
|
||||
text_info = 0xd79f36
|
||||
text_selected = 0x529cff
|
||||
selected_background = 0x0f115c
|
||||
|
||||
scrollbar = 0x529cff
|
||||
scrollbar_background = ; hide the background
|
||||
|
||||
progressbar = 0x3250f0
|
||||
|
||||
33
assets/romfs/themes/base_black_theme.ini
Normal file
33
assets/romfs/themes/base_black_theme.ini
Normal file
@@ -0,0 +1,33 @@
|
||||
[theme]
|
||||
background = 0x2d2d2d
|
||||
grid = 0x46464630
|
||||
popup = 0x2d2d2d
|
||||
error = 0xfa5a3a
|
||||
|
||||
line = 0xfbfbfb
|
||||
line_separator = 0x707070
|
||||
|
||||
text = 0xfbfbfb
|
||||
text_info = 0xd1d1d1
|
||||
text_selected = 0x00ffc8
|
||||
selected_background = 0x212227
|
||||
|
||||
sidebar = 0x000000dc
|
||||
|
||||
scrollbar = 0x00ffc8
|
||||
scrollbar_background = ; hide the background
|
||||
; scrollbar_background = 0x464646
|
||||
|
||||
progressbar = 0x00ffc8
|
||||
progressbar_background = 0x464646
|
||||
|
||||
highlight_1 = 0x1989c6
|
||||
highlight_2 = 0x89f0f2
|
||||
|
||||
icon_audio = romfs:/theme/icon_audio.png
|
||||
icon_video = romfs:/theme/icon_video.png
|
||||
icon_image = romfs:/theme/icon_image.png
|
||||
icon_file = romfs:/theme/icon_file.png
|
||||
icon_folder = romfs:/theme/icon_folder.png
|
||||
icon_zip = romfs:/theme/icon_zip.png
|
||||
icon_nro = romfs:/theme/icon_nro.png
|
||||
34
assets/romfs/themes/base_white_theme.ini
Normal file
34
assets/romfs/themes/base_white_theme.ini
Normal file
@@ -0,0 +1,34 @@
|
||||
[theme]
|
||||
background = 0xebebeb
|
||||
grid = 0xf0f0f0
|
||||
popup = 0xebebeb
|
||||
error = 0xfa5a3a
|
||||
|
||||
line = 0x373737
|
||||
line_separator = 0x6d787a
|
||||
|
||||
text = 0x373737
|
||||
text_info = 0x808080
|
||||
text_selected = 0x3250f0
|
||||
selected_background = 0xfdfdfd
|
||||
|
||||
sidebar = 0xe2e2e2f5
|
||||
|
||||
scrollbar = 0xB0B0B0
|
||||
scrollbar_background = ; hide the background
|
||||
; scrollbar_background = 0xababab
|
||||
|
||||
progressbar = 0x3250f0
|
||||
progressbar_background = 0x808080
|
||||
|
||||
highlight_1 = 0x1989c6
|
||||
highlight_2 = 0x89f0f2
|
||||
|
||||
icon_colour = 0x6d787a
|
||||
icon_audio = romfs:/theme/icon_audio.png
|
||||
icon_video = romfs:/theme/icon_video.png
|
||||
icon_image = romfs:/theme/icon_image.png
|
||||
icon_file = romfs:/theme/icon_file.png
|
||||
icon_folder = romfs:/theme/icon_folder.png
|
||||
icon_zip = romfs:/theme/icon_zip.png
|
||||
icon_nro = romfs:/theme/icon_nro.png
|
||||
@@ -1,23 +1,5 @@
|
||||
[meta]
|
||||
name=Black
|
||||
author=TotalJustice
|
||||
version=1.0.0
|
||||
preview=romfs:/theme/preview.jpg
|
||||
|
||||
[theme]
|
||||
background=0x2d2d2dff
|
||||
cursor=romfs:/theme/cursor.png
|
||||
cursor_drag=romfs:/theme/cursor_drag.png
|
||||
grid=0x46464630
|
||||
selected=0x464646ff
|
||||
selected_overlay=0x00ffc8ff
|
||||
text=0xfbfbfbff
|
||||
text_selected=0x00ffc8ff
|
||||
|
||||
icon_audio=romfs:/theme/icon_audio.png
|
||||
icon_video=romfs:/theme/icon_video.png
|
||||
icon_image=romfs:/theme/icon_image.png
|
||||
icon_file=romfs:/theme/icon_file.png
|
||||
icon_folder=romfs:/theme/icon_folder.png
|
||||
icon_zip=romfs:/theme/icon_zip.png
|
||||
icon_nro=romfs:/theme/icon_nro.png
|
||||
version=1.1.0
|
||||
inherit=romfs:/themes/base_black_theme.ini
|
||||
|
||||
13
assets/romfs/themes/oled_black_theme.ini
Normal file
13
assets/romfs/themes/oled_black_theme.ini
Normal file
@@ -0,0 +1,13 @@
|
||||
[meta]
|
||||
name=OLED Black
|
||||
author=TotalJustice/Sanras
|
||||
version=1.1.0
|
||||
inherit=romfs:/themes/base_black_theme.ini
|
||||
|
||||
[theme]
|
||||
background = 0x000000
|
||||
grid = 0x46464640
|
||||
popup = 0x323232
|
||||
text = 0xfbfbfb
|
||||
text_selected = 0x00ffc8
|
||||
selected_background = 0x323232
|
||||
@@ -1,23 +1,5 @@
|
||||
[meta]
|
||||
name="White not finished"
|
||||
author=TotalJustice
|
||||
name=White
|
||||
author=TotalJustice/Yorunokyujitsu
|
||||
version=1.0.0
|
||||
preview=romfs:/theme/preview.jpg
|
||||
|
||||
[theme]
|
||||
background=0xEBEBEBff
|
||||
cursor=romfs:/theme/cursor.png
|
||||
cursor_drag=romfs:/theme/cursor_drag.png
|
||||
grid=0x46464630
|
||||
selected=0x464646ff
|
||||
selected_overlay=0x00ffc8ff
|
||||
text=0x2D2D2Dff
|
||||
text_selected=0x3A50F0ff
|
||||
|
||||
icon_audio=romfs:/theme/icon_audio.png
|
||||
icon_video=romfs:/theme/icon_video.png
|
||||
icon_image=romfs:/theme/icon_image.png
|
||||
icon_file=romfs:/theme/icon_file.png
|
||||
icon_folder=romfs:/theme/icon_folder.png
|
||||
icon_zip=romfs:/theme/icon_zip.png
|
||||
icon_nro=romfs:/theme/icon_nro.png
|
||||
inherit=romfs:/themes/base_white_theme.ini
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
set(sphaira_VERSION 0.3.0)
|
||||
set(sphaira_VERSION 0.6.0)
|
||||
|
||||
project(sphaira
|
||||
VERSION ${sphaira_VERSION}
|
||||
@@ -45,18 +45,19 @@ add_executable(sphaira
|
||||
source/ui/menus/main_menu.cpp
|
||||
source/ui/menus/menu_base.cpp
|
||||
source/ui/menus/themezer.cpp
|
||||
source/ui/menus/ghdl.cpp
|
||||
|
||||
source/ui/error_box.cpp
|
||||
source/ui/notification.cpp
|
||||
source/ui/nvg_util.cpp
|
||||
source/ui/option_box.cpp
|
||||
source/ui/option_list.cpp
|
||||
source/ui/popup_list.cpp
|
||||
source/ui/progress_box.cpp
|
||||
source/ui/scrollable_text.cpp
|
||||
source/ui/scrollbar.cpp
|
||||
source/ui/sidebar.cpp
|
||||
source/ui/widget.cpp
|
||||
source/ui/list.cpp
|
||||
source/ui/bubbles.cpp
|
||||
|
||||
source/app.cpp
|
||||
source/download.cpp
|
||||
@@ -72,6 +73,7 @@ add_executable(sphaira
|
||||
source/swkbd.cpp
|
||||
source/web.cpp
|
||||
source/i18n.cpp
|
||||
source/ftpsrv_helper.cpp
|
||||
)
|
||||
|
||||
target_compile_definitions(sphaira PRIVATE
|
||||
@@ -79,17 +81,69 @@ target_compile_definitions(sphaira PRIVATE
|
||||
-DAPP_VERSION_HASH="${sphaira_VERSION_HASH}"
|
||||
)
|
||||
|
||||
target_compile_options(sphaira PRIVATE
|
||||
-Wall
|
||||
-Wextra
|
||||
|
||||
# unsure if it's a good idea to enable these by default as
|
||||
# it may cause breakage upon compiler updates.
|
||||
# -Werror
|
||||
# -Wfatal-errors
|
||||
|
||||
# disabled as nx uses s64 for size and offset, however stl uses size_t instead, thus
|
||||
# there being a lot of warnings.
|
||||
-Wno-sign-compare
|
||||
# disabled as many overriden methods don't use the params.
|
||||
-Wno-unused-parameter
|
||||
# pedantic warning, missing fields are set to 0.
|
||||
-Wno-missing-field-initializers
|
||||
# disabled as it warns for strcat 2 paths together, but it will never
|
||||
# overflow due to fs enforcing a max path len anyway.
|
||||
-Wno-format-truncation
|
||||
|
||||
# the below are taken from my gba emulator, they've served me well ;)
|
||||
-Wformat-overflow=2
|
||||
-Wundef
|
||||
-Wmissing-include-dirs
|
||||
-fstrict-aliasing
|
||||
-Wstrict-overflow=2
|
||||
-Walloca
|
||||
-Wduplicated-cond
|
||||
-Wwrite-strings
|
||||
-Wdate-time
|
||||
-Wlogical-op
|
||||
-Wpacked
|
||||
-Wcast-qual
|
||||
-Wcast-align
|
||||
-Wimplicit-fallthrough=5
|
||||
-Wsuggest-final-types
|
||||
-Wuninitialized
|
||||
-fimplicit-constexpr
|
||||
-Wmissing-requires
|
||||
)
|
||||
|
||||
include(FetchContent)
|
||||
set(FETCHCONTENT_QUIET FALSE)
|
||||
|
||||
FetchContent_Declare(ftpsrv
|
||||
GIT_REPOSITORY https://github.com/ITotalJustice/ftpsrv.git
|
||||
GIT_TAG 1.2.2
|
||||
SOURCE_SUBDIR NONE
|
||||
)
|
||||
|
||||
FetchContent_Declare(libhaze
|
||||
GIT_REPOSITORY https://github.com/ITotalJustice/libhaze.git
|
||||
GIT_TAG 3244b9e
|
||||
)
|
||||
|
||||
FetchContent_Declare(libpulsar
|
||||
GIT_REPOSITORY https://github.com/ITotalJustice/switch-libpulsar.git
|
||||
GIT_TAG d729be3
|
||||
GIT_TAG de656e4
|
||||
)
|
||||
|
||||
FetchContent_Declare(nanovg
|
||||
GIT_REPOSITORY https://github.com/ITotalJustice/nanovg-deko3d.git
|
||||
GIT_TAG 1902b38
|
||||
GIT_TAG 845c9fc
|
||||
)
|
||||
|
||||
FetchContent_Declare(stb
|
||||
@@ -102,12 +156,12 @@ FetchContent_Declare(yyjson
|
||||
GIT_TAG 0.10.0
|
||||
)
|
||||
|
||||
FetchContent_Declare(minIni-sphaira
|
||||
FetchContent_Declare(minIni
|
||||
GIT_REPOSITORY https://github.com/ITotalJustice/minIni-nx.git
|
||||
GIT_TAG 63ec295
|
||||
GIT_TAG 11cac8b
|
||||
)
|
||||
|
||||
set(MININI_LIB_NAME minIni-sphaira)
|
||||
set(MININI_LIB_NAME minIni)
|
||||
set(MININI_USE_STDIO ON)
|
||||
set(MININI_USE_NX ON)
|
||||
set(MININI_USE_FLOAT OFF)
|
||||
@@ -124,11 +178,9 @@ set(NANOVG_NO_GIF ON)
|
||||
set(NANOVG_NO_HDR ON)
|
||||
set(NANOVG_NO_PIC ON)
|
||||
set(NANOVG_NO_PNM ON)
|
||||
set(NANOVG_STBI_STATIC OFF)
|
||||
set(NANOVG_STBTT_STATIC ON)
|
||||
|
||||
set(YYJSON_DISABLE_READER OFF)
|
||||
set(YYJSON_DISABLE_WRITER ON)
|
||||
set(YYJSON_DISABLE_WRITER OFF)
|
||||
set(YYJSON_DISABLE_UTILS ON)
|
||||
set(YYJSON_DISABLE_FAST_FP_CONV ON)
|
||||
set(YYJSON_DISABLE_NON_STANDARD ON)
|
||||
@@ -136,44 +188,79 @@ set(YYJSON_DISABLE_UTF8_VALIDATION ON)
|
||||
set(YYJSON_DISABLE_UNALIGNED_MEMORY_ACCESS OFF)
|
||||
|
||||
FetchContent_MakeAvailable(
|
||||
ftpsrv
|
||||
libhaze
|
||||
libpulsar
|
||||
nanovg
|
||||
stb
|
||||
minIni-sphaira
|
||||
minIni
|
||||
yyjson
|
||||
)
|
||||
|
||||
# todo: upstream cmake
|
||||
add_library(libpulsar
|
||||
${libpulsar_SOURCE_DIR}/src/archive/archive_file.c
|
||||
${libpulsar_SOURCE_DIR}/src/archive/archive.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfgrp/bfgrp_location.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfgrp/bfgrp.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfsar/bfsar_file.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfsar/bfsar_group.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfsar/bfsar_sound.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfsar/bfsar_string.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfsar/bfsar_wave_archive.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfsar/bfsar.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfstm/bfstm_channel.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfstm/bfstm_info.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfstm/bfstm.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfwar/bfwar_file.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfwar/bfwar.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfwav/bfwav_info.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfwav/bfwav.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfwsd/bfwsd_sound_data.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfwsd/bfwsd_wave_id.c
|
||||
${libpulsar_SOURCE_DIR}/src/bfwsd/bfwsd.c
|
||||
${libpulsar_SOURCE_DIR}/src/player/player_load_formats.c
|
||||
${libpulsar_SOURCE_DIR}/src/player/player_load_lookup.c
|
||||
${libpulsar_SOURCE_DIR}/src/player/player_load.c
|
||||
${libpulsar_SOURCE_DIR}/src/player/player.c
|
||||
set(FTPSRV_LIB_BUILD TRUE)
|
||||
set(FTPSRV_LIB_SOCK_UNISTD TRUE)
|
||||
set(FTPSRV_LIB_VFS_CUSTOM ${ftpsrv_SOURCE_DIR}/src/platform/nx/vfs_nx.h)
|
||||
set(FTPSRV_LIB_PATH_SIZE 0x301)
|
||||
set(FTPSRV_LIB_SESSIONS 32)
|
||||
set(FTPSRV_LIB_BUF_SIZE 1024*64)
|
||||
|
||||
# workaround until a64 container has latest libnx release.
|
||||
if (NOT DEFINED USE_VFS_GC)
|
||||
set(USE_VFS_GC TRUE)
|
||||
endif()
|
||||
|
||||
set(FTPSRV_LIB_CUSTOM_DEFINES
|
||||
USE_VFS_SAVE=$<BOOL:TRUE>
|
||||
USE_VFS_STORAGE=$<BOOL:TRUE>
|
||||
USE_VFS_GC=$<BOOL:${USE_VFS_GC}>
|
||||
USE_VFS_USBHSFS=$<BOOL:FALSE>
|
||||
VFS_NX_BUFFER_IO=$<BOOL:TRUE>
|
||||
)
|
||||
target_include_directories(libpulsar PUBLIC ${libpulsar_SOURCE_DIR}/include)
|
||||
set_target_properties(libpulsar PROPERTIES
|
||||
|
||||
add_subdirectory(${ftpsrv_SOURCE_DIR} binary_dir)
|
||||
|
||||
add_library(ftpsrv_helper
|
||||
${ftpsrv_SOURCE_DIR}/src/platform/nx/vfs_nx.c
|
||||
${ftpsrv_SOURCE_DIR}/src/platform/nx/vfs/vfs_nx_none.c
|
||||
${ftpsrv_SOURCE_DIR}/src/platform/nx/vfs/vfs_nx_root.c
|
||||
${ftpsrv_SOURCE_DIR}/src/platform/nx/vfs/vfs_nx_fs.c
|
||||
${ftpsrv_SOURCE_DIR}/src/platform/nx/vfs/vfs_nx_save.c
|
||||
${ftpsrv_SOURCE_DIR}/src/platform/nx/vfs/vfs_nx_storage.c
|
||||
${ftpsrv_SOURCE_DIR}/src/platform/nx/utils.c
|
||||
)
|
||||
|
||||
target_link_libraries(ftpsrv_helper PUBLIC ftpsrv)
|
||||
target_include_directories(ftpsrv_helper PUBLIC ${ftpsrv_SOURCE_DIR}/src/platform)
|
||||
|
||||
if (USE_VFS_GC)
|
||||
target_sources(ftpsrv_helper PRIVATE
|
||||
${ftpsrv_SOURCE_DIR}/src/platform/nx/vfs/vfs_nx_gc.c
|
||||
)
|
||||
endif()
|
||||
|
||||
# todo: upstream cmake
|
||||
add_library(libhaze
|
||||
${libhaze_SOURCE_DIR}/source/async_usb_server.cpp
|
||||
${libhaze_SOURCE_DIR}/source/device_properties.cpp
|
||||
${libhaze_SOURCE_DIR}/source/event_reactor.cpp
|
||||
${libhaze_SOURCE_DIR}/source/haze.cpp
|
||||
${libhaze_SOURCE_DIR}/source/ptp_object_database.cpp
|
||||
${libhaze_SOURCE_DIR}/source/ptp_object_heap.cpp
|
||||
${libhaze_SOURCE_DIR}/source/ptp_responder_android_operations.cpp
|
||||
${libhaze_SOURCE_DIR}/source/ptp_responder_mtp_operations.cpp
|
||||
${libhaze_SOURCE_DIR}/source/ptp_responder_ptp_operations.cpp
|
||||
${libhaze_SOURCE_DIR}/source/ptp_responder.cpp
|
||||
${libhaze_SOURCE_DIR}/source/usb_session.cpp
|
||||
)
|
||||
target_include_directories(libhaze PUBLIC ${libhaze_SOURCE_DIR}/include)
|
||||
set_target_properties(libhaze PROPERTIES
|
||||
C_STANDARD 11
|
||||
C_EXTENSIONS ON
|
||||
CXX_STANDARD 20
|
||||
CXX_EXTENSIONS ON
|
||||
# force optimisations in debug mode as otherwise vapor errors
|
||||
# due to force_inline attribute failing...
|
||||
COMPILE_OPTIONS "$<$<CONFIG:Debug>:-Os>"
|
||||
)
|
||||
|
||||
add_library(stb INTERFACE)
|
||||
@@ -195,8 +282,10 @@ set_target_properties(sphaira PROPERTIES
|
||||
)
|
||||
|
||||
target_link_libraries(sphaira PRIVATE
|
||||
ftpsrv_helper
|
||||
libhaze
|
||||
libpulsar
|
||||
minIni-sphaira
|
||||
minIni
|
||||
nanovg
|
||||
stb
|
||||
yyjson
|
||||
|
||||
@@ -25,6 +25,7 @@ enum SoundEffect {
|
||||
SoundEffect_Startup,
|
||||
SoundEffect_Install,
|
||||
SoundEffect_Error,
|
||||
SoundEffect_MAX,
|
||||
};
|
||||
|
||||
enum class LaunchType {
|
||||
@@ -33,7 +34,9 @@ enum class LaunchType {
|
||||
Forwader_Sphaira,
|
||||
};
|
||||
|
||||
// todo: why is this global???
|
||||
void DrawElement(float x, float y, float w, float h, ThemeEntryID id);
|
||||
void DrawElement(const Vec4&, ThemeEntryID id);
|
||||
|
||||
class App {
|
||||
public:
|
||||
@@ -42,39 +45,55 @@ public:
|
||||
void Loop();
|
||||
|
||||
static void Exit();
|
||||
static void ExitRestart();
|
||||
static auto GetVg() -> NVGcontext*;
|
||||
static void Push(std::shared_ptr<ui::Widget>);
|
||||
// pops all widgets above a menu
|
||||
static void PopToMenu();
|
||||
|
||||
// this is thread safe (todo: make it thread safe)
|
||||
// this is thread safe
|
||||
static void Notify(std::string text, ui::NotifEntry::Side side = ui::NotifEntry::Side::RIGHT);
|
||||
static void Notify(ui::NotifEntry entry);
|
||||
static void NotifyPop(ui::NotifEntry::Side side = ui::NotifEntry::Side::RIGHT);
|
||||
static void NotifyClear(ui::NotifEntry::Side side = ui::NotifEntry::Side::RIGHT);
|
||||
static void NotifyFlashLed();
|
||||
|
||||
static auto GetThemeMetaList() -> std::span<ThemeMeta>;
|
||||
static void SetTheme(u64 theme_index);
|
||||
static auto GetThemeIndex() -> u64;
|
||||
static void SetTheme(s64 theme_index);
|
||||
static auto GetThemeIndex() -> s64;
|
||||
|
||||
static auto GetDefaultImage(int* w = nullptr, int* h = nullptr) -> int;
|
||||
|
||||
// returns argv[0]
|
||||
static auto GetExePath() -> fs::FsPath;
|
||||
// returns true if we are hbmenu.
|
||||
static auto IsHbmenu() -> bool;
|
||||
|
||||
static auto GetMtpEnable() -> bool;
|
||||
static auto GetFtpEnable() -> bool;
|
||||
static auto GetNxlinkEnable() -> bool;
|
||||
static auto GetLogEnable() -> bool;
|
||||
static auto GetReplaceHbmenuEnable() -> bool;
|
||||
static auto GetInstallEnable() -> bool;
|
||||
static auto GetInstallSdEnable() -> bool;
|
||||
static auto GetInstallPrompt() -> bool;
|
||||
static auto GetThemeShuffleEnable() -> bool;
|
||||
static auto GetThemeMusicEnable() -> bool;
|
||||
static auto GetLanguage() -> long;
|
||||
static auto GetTextScrollSpeed() -> long;
|
||||
|
||||
static void SetMtpEnable(bool enable);
|
||||
static void SetFtpEnable(bool enable);
|
||||
static void SetNxlinkEnable(bool enable);
|
||||
static void SetLogEnable(bool enable);
|
||||
static void SetReplaceHbmenuEnable(bool enable);
|
||||
static void SetInstallEnable(bool enable);
|
||||
static void SetInstallSdEnable(bool enable);
|
||||
static void SetInstallPrompt(bool enable);
|
||||
static void SetThemeShuffleEnable(bool enable);
|
||||
static void SetThemeMusicEnable(bool enable);
|
||||
static void SetLanguage(long index);
|
||||
static void SetTextScrollSpeed(long index);
|
||||
|
||||
static auto Install(OwoConfig& config) -> Result;
|
||||
static auto Install(ui::ProgressBox* pbox, OwoConfig& config) -> Result;
|
||||
@@ -85,15 +104,12 @@ public:
|
||||
void Update();
|
||||
void Poll();
|
||||
|
||||
void DrawBackground();
|
||||
void DrawTouch();
|
||||
|
||||
// void DrawElement(float x, float y, float w, float h, ui::ThemeEntryID id);
|
||||
auto LoadElementImage(std::string_view value) -> ElementEntry;
|
||||
auto LoadElementColour(std::string_view value) -> ElementEntry;
|
||||
auto LoadElement(std::string_view data) -> ElementEntry;
|
||||
auto LoadElement(std::string_view data, ElementType type) -> ElementEntry;
|
||||
|
||||
void LoadTheme(const fs::FsPath& path);
|
||||
void LoadTheme(const ThemeMeta& meta);
|
||||
void CloseTheme();
|
||||
void ScanThemes(const std::string& path);
|
||||
void ScanThemeEntries();
|
||||
@@ -112,6 +128,7 @@ public:
|
||||
u64 m_start_timestamp{};
|
||||
u64 m_prev_timestamp{};
|
||||
fs::FsPath m_prev_last_launch{};
|
||||
int m_default_image{};
|
||||
|
||||
bool m_is_launched_via_sphaira_forwader{};
|
||||
|
||||
@@ -131,20 +148,25 @@ public:
|
||||
|
||||
Theme m_theme{};
|
||||
fs::FsPath theme_path{};
|
||||
std::size_t m_theme_index{};
|
||||
s64 m_theme_index{};
|
||||
|
||||
bool m_quit{};
|
||||
|
||||
option::OptionBool m_nxlink_enabled{INI_SECTION, "nxlink_enabled", true};
|
||||
option::OptionBool m_mtp_enabled{INI_SECTION, "mtp_enabled", false};
|
||||
option::OptionBool m_ftp_enabled{INI_SECTION, "ftp_enabled", false};
|
||||
option::OptionBool m_log_enabled{INI_SECTION, "log_enabled", false};
|
||||
option::OptionBool m_replace_hbmenu{INI_SECTION, "replace_hbmenu", false};
|
||||
option::OptionBool m_install{INI_SECTION, "install", false};
|
||||
option::OptionBool m_install_sd{INI_SECTION, "install_sd", true};
|
||||
option::OptionLong m_install_prompt{INI_SECTION, "install_prompt", true};
|
||||
option::OptionBool m_theme_shuffle{INI_SECTION, "theme_shuffle", false};
|
||||
option::OptionBool m_theme_music{INI_SECTION, "theme_music", true};
|
||||
option::OptionLong m_language{INI_SECTION, "language", 0}; // auto
|
||||
// todo: move this into it's own menu
|
||||
option::OptionLong m_text_scroll_speed{"accessibility", "text_scroll_speed", 1}; // normal
|
||||
|
||||
PLSR_BFSAR m_qlaunch_bfsar{};
|
||||
PLSR_PlayerSoundId m_sound_ids[24]{};
|
||||
PLSR_PlayerSoundId m_sound_ids[SoundEffect_MAX]{};
|
||||
|
||||
private: // from nanovg decko3d example by adubbz
|
||||
static constexpr unsigned NumFramebuffers = 2;
|
||||
|
||||
@@ -224,18 +224,18 @@ enum SvcError {
|
||||
};
|
||||
|
||||
enum FsError {
|
||||
FsError_ResultPathNotFound = 0x202,
|
||||
FsError_ResultPathAlreadyExists = 0x402,
|
||||
FsError_ResultTargetLocked = 0xE02,
|
||||
FsError_PathNotFound = 0x202,
|
||||
FsError_PathAlreadyExists = 0x402,
|
||||
FsError_TargetLocked = 0xE02,
|
||||
FsError_UsableSpaceNotEnoughMmcCalibration = 0x4602,
|
||||
FsError_UsableSpaceNotEnoughMmcSafe = 0x4802,
|
||||
FsError_UsableSpaceNotEnoughMmcUser = 0x4A02,
|
||||
FsError_UsableSpaceNotEnoughMmcSystem = 0x4C02,
|
||||
FsError_ResultUsableSpaceNotEnoughSdCard = 0x4E02,
|
||||
FsError_ResultUnsupportedSdkVersion = 0x6402,
|
||||
FsError_ResultMountNameAlreadyExists = 0x7802,
|
||||
FsError_ResultPartitionNotFound = 0x7D202,
|
||||
FsError_ResultTargetNotFound = 0x7D402,
|
||||
FsError_UsableSpaceNotEnoughSdCard = 0x4E02,
|
||||
FsError_UnsupportedSdkVersion = 0x6402,
|
||||
FsError_MountNameAlreadyExists = 0x7802,
|
||||
FsError_PartitionNotFound = 0x7D202,
|
||||
FsError_TargetNotFound = 0x7D402,
|
||||
FsError_PortSdCardNoDevice = 0xFA202,
|
||||
FsError_GameCardCardNotInserted = 0x13B002,
|
||||
FsError_GameCardCardNotActivated = 0x13B402,
|
||||
@@ -286,9 +286,9 @@ enum FsError {
|
||||
FsError_GameCardFsCheckHandleInGetStatusFailure = 0x171402,
|
||||
FsError_GameCardFsCheckHandleInCreateReadOnlyFailure = 0x172002,
|
||||
FsError_GameCardFsCheckHandleInCreateSecureReadOnlyFailure = 0x172202,
|
||||
FsError_ResultNotImplemented = 0x177202,
|
||||
FsError_ResultAlreadyExists = 0x177602,
|
||||
FsError_ResultOutOfRange = 0x177A02,
|
||||
FsError_NotImplemented = 0x177202,
|
||||
FsError_AlreadyExists = 0x177602,
|
||||
FsError_OutOfRange = 0x177A02,
|
||||
FsError_AllocationMemoryFailedInFatFileSystemA = 0x190202,
|
||||
FsError_AllocationMemoryFailedInFatFileSystemB = 0x190402,
|
||||
FsError_AllocationMemoryFailedInFatFileSystemC = 0x190602,
|
||||
@@ -348,18 +348,18 @@ enum FsError {
|
||||
FsError_FatFsFormatIllegalSectorsC = 0x280C02,
|
||||
FsError_FatFsFormatIllegalSectorsD = 0x280E02,
|
||||
FsError_UnexpectedInMountTableA = 0x296A02,
|
||||
FsError_ResultTooLongPath = 0x2EE602,
|
||||
FsError_ResultInvalidCharacter = 0x2EE802,
|
||||
FsError_ResultInvalidPathFormat = 0x2EEA02,
|
||||
FsError_ResultDirectoryUnobtainable = 0x2EEC02,
|
||||
FsError_ResultInvalidOffset = 0x2F5A02,
|
||||
FsError_ResultInvalidSize = 0x2F5C02,
|
||||
FsError_ResultNullptrArgument = 0x2F5E02,
|
||||
FsError_ResultInvalidAlignment = 0x2F6002,
|
||||
FsError_ResultInvalidMountName = 0x2F6202,
|
||||
FsError_ResultExtensionSizeTooLarge = 0x2F6402,
|
||||
FsError_ResultExtensionSizeInvalid = 0x2F6602,
|
||||
FsError_ResultFileExtensionWithoutOpenModeAllowAppend = 0x307202,
|
||||
FsError_TooLongPath = 0x2EE602,
|
||||
FsError_InvalidCharacter = 0x2EE802,
|
||||
FsError_InvalidPathFormat = 0x2EEA02,
|
||||
FsError_DirectoryUnobtainable = 0x2EEC02,
|
||||
FsError_InvalidOffset = 0x2F5A02,
|
||||
FsError_InvalidSize = 0x2F5C02,
|
||||
FsError_NullptrArgument = 0x2F5E02,
|
||||
FsError_InvalidAlignment = 0x2F6002,
|
||||
FsError_InvalidMountName = 0x2F6202,
|
||||
FsError_ExtensionSizeTooLarge = 0x2F6402,
|
||||
FsError_ExtensionSizeInvalid = 0x2F6602,
|
||||
FsError_FileExtensionWithoutOpenModeAllowAppend = 0x307202,
|
||||
FsError_UnsupportedCommitTarget = 0x313A02,
|
||||
FsError_UnsupportedSetSizeForNotResizableSubStorage = 0x313C02,
|
||||
FsError_UnsupportedSetSizeForResizableSubStorage = 0x313E02,
|
||||
@@ -444,14 +444,14 @@ enum FsError {
|
||||
FsError_UnsupportedCommitProvisionallyForDirectorySaveDataFileSystem = 0x31E002,
|
||||
FsError_UnsupportedWriteForZeroBitmapHashStorageFile = 0x31E202,
|
||||
FsError_UnsupportedSetSizeForZeroBitmapHashStorageFile = 0x31E402,
|
||||
FsError_ResultNcaExternalKeyUnregisteredDeprecated = 0x326602,
|
||||
FsError_ResultFileNotClosed = 0x326E02,
|
||||
FsError_ResultDirectoryNotClosed = 0x327002,
|
||||
FsError_ResultWriteModeFileNotClosed = 0x327202,
|
||||
FsError_ResultAllocatorAlreadyRegistered = 0x327402,
|
||||
FsError_ResultDefaultAllocatorAlreadyUsed = 0x327602,
|
||||
FsError_ResultAllocatorAlignmentViolation = 0x327A02,
|
||||
FsError_ResultUserNotExist = 0x328202,
|
||||
FsError_NcaExternalKeyUnregisteredDeprecated = 0x326602,
|
||||
FsError_FileNotClosed = 0x326E02,
|
||||
FsError_DirectoryNotClosed = 0x327002,
|
||||
FsError_WriteModeFileNotClosed = 0x327202,
|
||||
FsError_AllocatorAlreadyRegistered = 0x327402,
|
||||
FsError_DefaultAllocatorAlreadyUsed = 0x327602,
|
||||
FsError_AllocatorAlignmentViolation = 0x327A02,
|
||||
FsError_UserNotExist = 0x328202,
|
||||
FsError_FileNotFound = 0x339402,
|
||||
FsError_DirectoryNotFound = 0x339602,
|
||||
FsError_MappingTableFull = 0x346402,
|
||||
|
||||
@@ -1,41 +1,235 @@
|
||||
#pragma once
|
||||
|
||||
#include "fs.hpp"
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <functional>
|
||||
#include <unordered_map>
|
||||
#include <algorithm>
|
||||
#include <stop_token>
|
||||
#include <switch.h>
|
||||
|
||||
namespace sphaira {
|
||||
namespace sphaira::curl {
|
||||
|
||||
using DownloadCallback = std::function<void(std::vector<u8>& data, bool success)>;
|
||||
using ProgressCallback = std::function<bool(u32 dltotal, u32 dlnow, u32 ultotal, u32 ulnow)>;
|
||||
enum {
|
||||
Flag_None = 0,
|
||||
// requests to download send etag in the header.
|
||||
// the received etag is then saved on success.
|
||||
// this api is only available on downloading to file.
|
||||
Flag_Cache = 1 << 0,
|
||||
};
|
||||
|
||||
enum class DownloadPriority {
|
||||
enum class Priority {
|
||||
Normal, // gets pushed to the back of the queue
|
||||
High, // gets pushed to the front of the queue
|
||||
};
|
||||
|
||||
struct DownloadEventData {
|
||||
DownloadCallback callback;
|
||||
std::vector<u8> data;
|
||||
bool result;
|
||||
struct Api;
|
||||
struct ApiResult;
|
||||
|
||||
using Path = fs::FsPath;
|
||||
using OnComplete = std::function<void(ApiResult& result)>;
|
||||
using OnProgress = std::function<bool(u32 dltotal, u32 dlnow, u32 ultotal, u32 ulnow)>;
|
||||
using StopToken = std::stop_token;
|
||||
|
||||
struct Url {
|
||||
Url() = default;
|
||||
Url(const std::string& str) : m_str{str} {}
|
||||
std::string m_str;
|
||||
};
|
||||
|
||||
auto DownloadInit() -> bool;
|
||||
void DownloadExit();
|
||||
struct Fields {
|
||||
Fields() = default;
|
||||
Fields(const std::string& str) : m_str{str} {}
|
||||
std::string m_str;
|
||||
};
|
||||
|
||||
struct Header {
|
||||
Header() = default;
|
||||
Header(std::initializer_list<std::pair<const std::string, std::string>> p) : m_map{p} {}
|
||||
std::unordered_map<std::string, std::string> m_map;
|
||||
|
||||
auto Find(const std::string& key) const {
|
||||
return std::find_if(m_map.cbegin(), m_map.cend(), [&key](auto& e) {
|
||||
return !strcasecmp(key.c_str(), e.first.c_str());
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
struct Flags {
|
||||
Flags() = default;
|
||||
Flags(u32 flags) : m_flags{flags} {}
|
||||
u32 m_flags{Flag_None};
|
||||
};
|
||||
|
||||
struct ApiResult {
|
||||
bool success;
|
||||
long code;
|
||||
Header header; // returned headers in request
|
||||
std::vector<u8> data; // empty if downloaded a file
|
||||
fs::FsPath path; // empty if downloaded memory
|
||||
};
|
||||
|
||||
struct DownloadEventData {
|
||||
OnComplete callback;
|
||||
ApiResult result;
|
||||
StopToken stoken;
|
||||
};
|
||||
|
||||
auto Init() -> bool;
|
||||
void Exit();
|
||||
|
||||
// sync functions
|
||||
auto DownloadMemory(const std::string& url, const std::string& post, ProgressCallback pcallback = nullptr) -> std::vector<u8>;
|
||||
auto DownloadFile(const std::string& url, const std::string& out, const std::string& post, ProgressCallback pcallback = nullptr) -> bool;
|
||||
auto ToMemory(const Api& e) -> ApiResult;
|
||||
auto ToFile(const Api& e) -> ApiResult;
|
||||
|
||||
// async functions
|
||||
// starts the downloads in a new thread, pushes an event when complete
|
||||
// then, the callback will be called on the main thread.
|
||||
// auto DownloadMemoryAsync(const std::string& url, DownloadCallback callback, DownloadPriority prio = DownloadPriority::Normal) -> bool;
|
||||
// auto DownloadFileAsync(const std::string& url, const std::string& out, DownloadCallback callback, DownloadPriority prio = DownloadPriority::Normal) -> bool;
|
||||
auto ToMemoryAsync(const Api& e) -> bool;
|
||||
auto ToFileAsync(const Api& e) -> bool;
|
||||
|
||||
auto DownloadMemoryAsync(const std::string& url, const std::string& post, DownloadCallback callback, ProgressCallback pcallback = nullptr, DownloadPriority prio = DownloadPriority::Normal) -> bool;
|
||||
auto DownloadFileAsync(const std::string& url, const std::string& out, const std::string& post, DownloadCallback callback, ProgressCallback pcallback = nullptr, DownloadPriority prio = DownloadPriority::Normal) -> bool;
|
||||
struct Api {
|
||||
Api() = default;
|
||||
|
||||
void DownloadClearCache(const std::string& url);
|
||||
template <typename... Ts>
|
||||
Api(Ts&&... ts) {
|
||||
Api::set_option(std::forward<Ts>(ts)...);
|
||||
}
|
||||
|
||||
} // namespace sphaira
|
||||
template <typename... Ts>
|
||||
auto To(Ts&&... ts) {
|
||||
if constexpr(std::disjunction_v<std::is_same<Path, Ts>...>) {
|
||||
return ToFile(std::forward<Ts>(ts)...);
|
||||
} else {
|
||||
return ToMemory(std::forward<Ts>(ts)...);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename... Ts>
|
||||
auto ToAsync(Ts&&... ts) {
|
||||
if constexpr(std::disjunction_v<std::is_same<Path, Ts>...>) {
|
||||
return ToFileAsync(std::forward<Ts>(ts)...);
|
||||
} else {
|
||||
return ToMemoryAsync(std::forward<Ts>(ts)...);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename... Ts>
|
||||
auto ToMemory(Ts&&... ts) {
|
||||
static_assert(std::disjunction_v<std::is_same<Url, Ts>...>, "Url must be specified");
|
||||
static_assert(!std::disjunction_v<std::is_same<Path, Ts>...>, "Path must not valid for memory");
|
||||
static_assert(!std::disjunction_v<std::is_same<OnComplete, Ts>...>, "OnComplete must not be specified");
|
||||
Api::set_option(std::forward<Ts>(ts)...);
|
||||
return curl::ToMemory(*this);
|
||||
}
|
||||
|
||||
template <typename... Ts>
|
||||
auto ToFile(Ts&&... ts) {
|
||||
static_assert(std::disjunction_v<std::is_same<Url, Ts>...>, "Url must be specified");
|
||||
static_assert(std::disjunction_v<std::is_same<Path, Ts>...>, "Path must be specified");
|
||||
static_assert(!std::disjunction_v<std::is_same<OnComplete, Ts>...>, "OnComplete must not be specified");
|
||||
Api::set_option(std::forward<Ts>(ts)...);
|
||||
return curl::ToFile(*this);
|
||||
}
|
||||
|
||||
template <typename... Ts>
|
||||
auto ToMemoryAsync(Ts&&... ts) {
|
||||
static_assert(std::disjunction_v<std::is_same<Url, Ts>...>, "Url must be specified");
|
||||
static_assert(std::disjunction_v<std::is_same<OnComplete, Ts>...>, "OnComplete must be specified");
|
||||
static_assert(!std::disjunction_v<std::is_same<Path, Ts>...>, "Path must not valid for memory");
|
||||
static_assert(std::disjunction_v<std::is_same<StopToken, Ts>...>, "StopToken must be specified");
|
||||
Api::set_option(std::forward<Ts>(ts)...);
|
||||
return curl::ToMemoryAsync(*this);
|
||||
}
|
||||
|
||||
template <typename... Ts>
|
||||
auto ToFileAsync(Ts&&... ts) {
|
||||
static_assert(std::disjunction_v<std::is_same<Url, Ts>...>, "Url must be specified");
|
||||
static_assert(std::disjunction_v<std::is_same<Path, Ts>...>, "Path must be specified");
|
||||
static_assert(std::disjunction_v<std::is_same<OnComplete, Ts>...>, "OnComplete must be specified");
|
||||
static_assert(std::disjunction_v<std::is_same<StopToken, Ts>...>, "StopToken must be specified");
|
||||
Api::set_option(std::forward<Ts>(ts)...);
|
||||
return curl::ToFileAsync(*this);
|
||||
}
|
||||
|
||||
auto& GetUrl() const {
|
||||
return m_url.m_str;
|
||||
}
|
||||
auto& GetFields() const {
|
||||
return m_fields.m_str;
|
||||
}
|
||||
auto& GetHeader() const {
|
||||
return m_header;
|
||||
}
|
||||
auto& GetFlags() const {
|
||||
return m_flags.m_flags;
|
||||
}
|
||||
auto& GetPath() const {
|
||||
return m_path;
|
||||
}
|
||||
auto& GetOnComplete() const {
|
||||
return m_on_complete;
|
||||
}
|
||||
auto& GetOnProgress() const {
|
||||
return m_on_progress;
|
||||
}
|
||||
auto& GetPriority() const {
|
||||
return m_prio;
|
||||
}
|
||||
auto& GetToken() const {
|
||||
return m_stoken;
|
||||
}
|
||||
|
||||
private:
|
||||
void SetOption(Url&& v) {
|
||||
m_url = v;
|
||||
}
|
||||
void SetOption(Fields&& v) {
|
||||
m_fields = v;
|
||||
}
|
||||
void SetOption(Header&& v) {
|
||||
m_header = v;
|
||||
}
|
||||
void SetOption(Flags&& v) {
|
||||
m_flags = v;
|
||||
}
|
||||
void SetOption(Path&& v) {
|
||||
m_path = v;
|
||||
}
|
||||
void SetOption(OnComplete&& v) {
|
||||
m_on_complete = v;
|
||||
}
|
||||
void SetOption(OnProgress&& v) {
|
||||
m_on_progress = v;
|
||||
}
|
||||
void SetOption(Priority&& v) {
|
||||
m_prio = v;
|
||||
}
|
||||
void SetOption(StopToken&& v) {
|
||||
m_stoken = v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void set_option(T&& t) {
|
||||
SetOption(std::forward<T>(t));
|
||||
}
|
||||
|
||||
template <typename T, typename... Ts>
|
||||
void set_option(T&& t, Ts&&... ts) {
|
||||
set_option(std::forward<T>(t));
|
||||
set_option(std::forward<Ts>(ts)...);
|
||||
}
|
||||
|
||||
private:
|
||||
Url m_url;
|
||||
Fields m_fields{};
|
||||
Header m_header{};
|
||||
Flags m_flags{};
|
||||
Path m_path{};
|
||||
OnComplete m_on_complete{nullptr};
|
||||
OnProgress m_on_progress{nullptr};
|
||||
Priority m_prio{Priority::High};
|
||||
std::stop_source m_stop_source{};
|
||||
StopToken m_stoken{m_stop_source.get_token()};
|
||||
};
|
||||
|
||||
} // namespace sphaira::curl
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <string>
|
||||
#include <switch.h>
|
||||
#include <nxlink.h>
|
||||
#include <haze.h>
|
||||
#include "download.hpp"
|
||||
|
||||
namespace sphaira::evman {
|
||||
@@ -23,8 +24,9 @@ struct ExitEventData {
|
||||
using EventData = std::variant<
|
||||
LaunchNroEventData,
|
||||
ExitEventData,
|
||||
HazeCallbackData,
|
||||
NxlinkCallbackData,
|
||||
DownloadEventData
|
||||
curl::DownloadEventData
|
||||
>;
|
||||
|
||||
// returns number of events
|
||||
|
||||
@@ -171,39 +171,39 @@ static_assert(FsPath::TestFrom(FsPath{"abc"}));
|
||||
|
||||
FsPath AppendPath(const fs::FsPath& root_path, const fs::FsPath& file_path);
|
||||
|
||||
Result CreateFile(FsFileSystem* fs, const FsPath& path, u64 size = 0, u32 option = 0, bool ignore_read_only = false);
|
||||
Result CreateDirectory(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = false);
|
||||
Result CreateDirectoryRecursively(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = false);
|
||||
Result CreateDirectoryRecursivelyWithPath(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = false);
|
||||
Result DeleteFile(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = false);
|
||||
Result DeleteDirectory(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = false);
|
||||
Result DeleteDirectoryRecursively(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = false);
|
||||
Result RenameFile(FsFileSystem* fs, const FsPath& src, const FsPath& dst, bool ignore_read_only = false);
|
||||
Result RenameDirectory(FsFileSystem* fs, const FsPath& src, const FsPath& dst, bool ignore_read_only = false);
|
||||
Result CreateFile(FsFileSystem* fs, const FsPath& path, u64 size = 0, u32 option = 0, bool ignore_read_only = true);
|
||||
Result CreateDirectory(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = true);
|
||||
Result CreateDirectoryRecursively(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = true);
|
||||
Result CreateDirectoryRecursivelyWithPath(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = true);
|
||||
Result DeleteFile(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = true);
|
||||
Result DeleteDirectory(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = true);
|
||||
Result DeleteDirectoryRecursively(FsFileSystem* fs, const FsPath& path, bool ignore_read_only = true);
|
||||
Result RenameFile(FsFileSystem* fs, const FsPath& src, const FsPath& dst, bool ignore_read_only = true);
|
||||
Result RenameDirectory(FsFileSystem* fs, const FsPath& src, const FsPath& dst, bool ignore_read_only = true);
|
||||
Result GetEntryType(FsFileSystem* fs, const FsPath& path, FsDirEntryType* out);
|
||||
Result GetFileTimeStampRaw(FsFileSystem* fs, const FsPath& path, FsTimeStampRaw *out);
|
||||
bool FileExists(FsFileSystem* fs, const FsPath& path);
|
||||
bool DirExists(FsFileSystem* fs, const FsPath& path);
|
||||
Result read_entire_file(FsFileSystem* fs, const FsPath& path, std::vector<u8>& out);
|
||||
Result write_entire_file(FsFileSystem* fs, const FsPath& path, const std::vector<u8>& in, bool ignore_read_only = false);
|
||||
Result copy_entire_file(FsFileSystem* fs, const FsPath& dst, const FsPath& src, bool ignore_read_only = false);
|
||||
Result write_entire_file(FsFileSystem* fs, const FsPath& path, const std::vector<u8>& in, bool ignore_read_only = true);
|
||||
Result copy_entire_file(FsFileSystem* fs, const FsPath& dst, const FsPath& src, bool ignore_read_only = true);
|
||||
|
||||
Result CreateFile(const FsPath& path, u64 size = 0, u32 option = 0, bool ignore_read_only = false);
|
||||
Result CreateDirectory(const FsPath& path, bool ignore_read_only = false);
|
||||
Result CreateDirectoryRecursively(const FsPath& path, bool ignore_read_only = false);
|
||||
Result CreateDirectoryRecursivelyWithPath(const FsPath& path, bool ignore_read_only = false);
|
||||
Result DeleteFile(const FsPath& path, bool ignore_read_only = false);
|
||||
Result DeleteDirectory(const FsPath& path, bool ignore_read_only = false);
|
||||
Result DeleteDirectoryRecursively(const FsPath& path, bool ignore_read_only = false);
|
||||
Result RenameFile(const FsPath& src, const FsPath& dst, bool ignore_read_only = false);
|
||||
Result RenameDirectory(const FsPath& src, const FsPath& dst, bool ignore_read_only = false);
|
||||
Result CreateFile(const FsPath& path, u64 size = 0, u32 option = 0, bool ignore_read_only = true);
|
||||
Result CreateDirectory(const FsPath& path, bool ignore_read_only = true);
|
||||
Result CreateDirectoryRecursively(const FsPath& path, bool ignore_read_only = true);
|
||||
Result CreateDirectoryRecursivelyWithPath(const FsPath& path, bool ignore_read_only = true);
|
||||
Result DeleteFile(const FsPath& path, bool ignore_read_only = true);
|
||||
Result DeleteDirectory(const FsPath& path, bool ignore_read_only = true);
|
||||
Result DeleteDirectoryRecursively(const FsPath& path, bool ignore_read_only = true);
|
||||
Result RenameFile(const FsPath& src, const FsPath& dst, bool ignore_read_only = true);
|
||||
Result RenameDirectory(const FsPath& src, const FsPath& dst, bool ignore_read_only = true);
|
||||
Result GetEntryType(const FsPath& path, FsDirEntryType* out);
|
||||
Result GetFileTimeStampRaw(const FsPath& path, FsTimeStampRaw *out);
|
||||
bool FileExists(const FsPath& path);
|
||||
bool DirExists(const FsPath& path);
|
||||
Result read_entire_file(const FsPath& path, std::vector<u8>& out);
|
||||
Result write_entire_file(const FsPath& path, const std::vector<u8>& in, bool ignore_read_only = false);
|
||||
Result copy_entire_file(const FsPath& dst, const FsPath& src, bool ignore_read_only = false);
|
||||
Result write_entire_file(const FsPath& path, const std::vector<u8>& in, bool ignore_read_only = true);
|
||||
Result copy_entire_file(const FsPath& dst, const FsPath& src, bool ignore_read_only = true);
|
||||
|
||||
struct Fs {
|
||||
static constexpr inline u32 FsModule = 505;
|
||||
@@ -222,51 +222,64 @@ struct Fs {
|
||||
static constexpr inline Result ResultUnknownStdioError = MAKERESULT(FsModule, 13);
|
||||
static constexpr inline Result ResultReadOnly = MAKERESULT(FsModule, 14);
|
||||
|
||||
virtual Result CreateFile(const FsPath& path, u64 size = 0, u32 option = 0, bool ignore_read_only = false) = 0;
|
||||
virtual Result CreateDirectory(const FsPath& path, bool ignore_read_only = false) = 0;
|
||||
virtual Result CreateDirectoryRecursively(const FsPath& path, bool ignore_read_only = false) = 0;
|
||||
virtual Result CreateDirectoryRecursivelyWithPath(const FsPath& path, bool ignore_read_only = false) = 0;
|
||||
virtual Result DeleteFile(const FsPath& path, bool ignore_read_only = false) = 0;
|
||||
virtual Result DeleteDirectory(const FsPath& path, bool ignore_read_only = false) = 0;
|
||||
virtual Result DeleteDirectoryRecursively(const FsPath& path, bool ignore_read_only = false) = 0;
|
||||
virtual Result RenameFile(const FsPath& src, const FsPath& dst, bool ignore_read_only = false) = 0;
|
||||
virtual Result RenameDirectory(const FsPath& src, const FsPath& dst, bool ignore_read_only = false) = 0;
|
||||
Fs(bool ignore_read_only = true) : m_ignore_read_only{ignore_read_only} {}
|
||||
virtual ~Fs() = default;
|
||||
|
||||
virtual Result CreateFile(const FsPath& path, u64 size = 0, u32 option = 0) = 0;
|
||||
virtual Result CreateDirectory(const FsPath& path) = 0;
|
||||
virtual Result CreateDirectoryRecursively(const FsPath& path) = 0;
|
||||
virtual Result CreateDirectoryRecursivelyWithPath(const FsPath& path) = 0;
|
||||
virtual Result DeleteFile(const FsPath& path) = 0;
|
||||
virtual Result DeleteDirectory(const FsPath& path) = 0;
|
||||
virtual Result DeleteDirectoryRecursively(const FsPath& path) = 0;
|
||||
virtual Result RenameFile(const FsPath& src, const FsPath& dst) = 0;
|
||||
virtual Result RenameDirectory(const FsPath& src, const FsPath& dst) = 0;
|
||||
virtual Result GetEntryType(const FsPath& path, FsDirEntryType* out) = 0;
|
||||
virtual Result GetFileTimeStampRaw(const FsPath& path, FsTimeStampRaw *out) = 0;
|
||||
virtual bool FileExists(const FsPath& path) = 0;
|
||||
virtual bool DirExists(const FsPath& path) = 0;
|
||||
virtual Result read_entire_file(const FsPath& path, std::vector<u8>& out) = 0;
|
||||
virtual Result write_entire_file(const FsPath& path, const std::vector<u8>& in, bool ignore_read_only = false) = 0;
|
||||
virtual Result copy_entire_file(const FsPath& dst, const FsPath& src, bool ignore_read_only = false) = 0;
|
||||
virtual Result write_entire_file(const FsPath& path, const std::vector<u8>& in) = 0;
|
||||
virtual Result copy_entire_file(const FsPath& dst, const FsPath& src) = 0;
|
||||
|
||||
void SetIgnoreReadOnly(bool enable) {
|
||||
m_ignore_read_only = enable;
|
||||
}
|
||||
|
||||
protected:
|
||||
bool m_ignore_read_only;
|
||||
};
|
||||
|
||||
struct FsStdio : Fs {
|
||||
Result CreateFile(const FsPath& path, u64 size = 0, u32 option = 0, bool ignore_read_only = false) override {
|
||||
return fs::CreateFile(path, size, option, ignore_read_only);
|
||||
FsStdio(bool ignore_read_only = true) : Fs{ignore_read_only} {}
|
||||
virtual ~FsStdio() = default;
|
||||
|
||||
Result CreateFile(const FsPath& path, u64 size = 0, u32 option = 0) override {
|
||||
return fs::CreateFile(path, size, option, m_ignore_read_only);
|
||||
}
|
||||
Result CreateDirectory(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::CreateDirectory(path, ignore_read_only);
|
||||
Result CreateDirectory(const FsPath& path) override {
|
||||
return fs::CreateDirectory(path, m_ignore_read_only);
|
||||
}
|
||||
Result CreateDirectoryRecursively(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::CreateDirectoryRecursively(path, ignore_read_only);
|
||||
Result CreateDirectoryRecursively(const FsPath& path) override {
|
||||
return fs::CreateDirectoryRecursively(path, m_ignore_read_only);
|
||||
}
|
||||
Result CreateDirectoryRecursivelyWithPath(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::CreateDirectoryRecursivelyWithPath(path, ignore_read_only);
|
||||
Result CreateDirectoryRecursivelyWithPath(const FsPath& path) override {
|
||||
return fs::CreateDirectoryRecursivelyWithPath(path, m_ignore_read_only);
|
||||
}
|
||||
Result DeleteFile(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::DeleteFile(path, ignore_read_only);
|
||||
Result DeleteFile(const FsPath& path) override {
|
||||
return fs::DeleteFile(path, m_ignore_read_only);
|
||||
}
|
||||
Result DeleteDirectory(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::DeleteDirectory(path, ignore_read_only);
|
||||
Result DeleteDirectory(const FsPath& path) override {
|
||||
return fs::DeleteDirectory(path, m_ignore_read_only);
|
||||
}
|
||||
Result DeleteDirectoryRecursively(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::DeleteDirectoryRecursively(path, ignore_read_only);
|
||||
Result DeleteDirectoryRecursively(const FsPath& path) override {
|
||||
return fs::DeleteDirectoryRecursively(path, m_ignore_read_only);
|
||||
}
|
||||
Result RenameFile(const FsPath& src, const FsPath& dst, bool ignore_read_only = false) override {
|
||||
return fs::RenameFile(src, dst, ignore_read_only);
|
||||
Result RenameFile(const FsPath& src, const FsPath& dst) override {
|
||||
return fs::RenameFile(src, dst, m_ignore_read_only);
|
||||
}
|
||||
Result RenameDirectory(const FsPath& src, const FsPath& dst, bool ignore_read_only = false) override {
|
||||
return fs::RenameDirectory(src, dst, ignore_read_only);
|
||||
Result RenameDirectory(const FsPath& src, const FsPath& dst) override {
|
||||
return fs::RenameDirectory(src, dst, m_ignore_read_only);
|
||||
}
|
||||
Result GetEntryType(const FsPath& path, FsDirEntryType* out) override {
|
||||
return fs::GetEntryType(path, out);
|
||||
@@ -283,17 +296,17 @@ struct FsStdio : Fs {
|
||||
Result read_entire_file(const FsPath& path, std::vector<u8>& out) override {
|
||||
return fs::read_entire_file(path, out);
|
||||
}
|
||||
Result write_entire_file(const FsPath& path, const std::vector<u8>& in, bool ignore_read_only = false) override {
|
||||
return fs::write_entire_file(path, in, ignore_read_only);
|
||||
Result write_entire_file(const FsPath& path, const std::vector<u8>& in) override {
|
||||
return fs::write_entire_file(path, in, m_ignore_read_only);
|
||||
}
|
||||
Result copy_entire_file(const FsPath& dst, const FsPath& src, bool ignore_read_only = false) override {
|
||||
return fs::copy_entire_file(dst, src, ignore_read_only);
|
||||
Result copy_entire_file(const FsPath& dst, const FsPath& src) override {
|
||||
return fs::copy_entire_file(dst, src, m_ignore_read_only);
|
||||
}
|
||||
};
|
||||
|
||||
struct FsNative : Fs {
|
||||
FsNative() = default;
|
||||
FsNative(FsFileSystem* fs, bool own) : m_fs{*fs}, m_own{own} {}
|
||||
explicit FsNative(bool ignore_read_only = true) : Fs{ignore_read_only} {}
|
||||
explicit FsNative(FsFileSystem* fs, bool own, bool ignore_read_only = true) : Fs{ignore_read_only}, m_fs{*fs}, m_own{own} {}
|
||||
|
||||
virtual ~FsNative() {
|
||||
if (m_own) {
|
||||
@@ -355,32 +368,32 @@ struct FsNative : Fs {
|
||||
return m_open_result;
|
||||
}
|
||||
|
||||
Result CreateFile(const FsPath& path, u64 size = 0, u32 option = 0, bool ignore_read_only = false) override {
|
||||
return fs::CreateFile(&m_fs, path, size, option, ignore_read_only);
|
||||
Result CreateFile(const FsPath& path, u64 size = 0, u32 option = 0) override {
|
||||
return fs::CreateFile(&m_fs, path, size, option, m_ignore_read_only);
|
||||
}
|
||||
Result CreateDirectory(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::CreateDirectory(&m_fs, path, ignore_read_only);
|
||||
Result CreateDirectory(const FsPath& path) override {
|
||||
return fs::CreateDirectory(&m_fs, path, m_ignore_read_only);
|
||||
}
|
||||
Result CreateDirectoryRecursively(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::CreateDirectoryRecursively(&m_fs, path, ignore_read_only);
|
||||
Result CreateDirectoryRecursively(const FsPath& path) override {
|
||||
return fs::CreateDirectoryRecursively(&m_fs, path, m_ignore_read_only);
|
||||
}
|
||||
Result CreateDirectoryRecursivelyWithPath(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::CreateDirectoryRecursivelyWithPath(&m_fs, path, ignore_read_only);
|
||||
Result CreateDirectoryRecursivelyWithPath(const FsPath& path) override {
|
||||
return fs::CreateDirectoryRecursivelyWithPath(&m_fs, path, m_ignore_read_only);
|
||||
}
|
||||
Result DeleteFile(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::DeleteFile(&m_fs, path, ignore_read_only);
|
||||
Result DeleteFile(const FsPath& path) override {
|
||||
return fs::DeleteFile(&m_fs, path, m_ignore_read_only);
|
||||
}
|
||||
Result DeleteDirectory(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::DeleteDirectory(&m_fs, path, ignore_read_only);
|
||||
Result DeleteDirectory(const FsPath& path) override {
|
||||
return fs::DeleteDirectory(&m_fs, path, m_ignore_read_only);
|
||||
}
|
||||
Result DeleteDirectoryRecursively(const FsPath& path, bool ignore_read_only = false) override {
|
||||
return fs::DeleteDirectoryRecursively(&m_fs, path, ignore_read_only);
|
||||
Result DeleteDirectoryRecursively(const FsPath& path) override {
|
||||
return fs::DeleteDirectoryRecursively(&m_fs, path, m_ignore_read_only);
|
||||
}
|
||||
Result RenameFile(const FsPath& src, const FsPath& dst, bool ignore_read_only = false) override {
|
||||
return fs::RenameFile(&m_fs, src, dst, ignore_read_only);
|
||||
Result RenameFile(const FsPath& src, const FsPath& dst) override {
|
||||
return fs::RenameFile(&m_fs, src, dst, m_ignore_read_only);
|
||||
}
|
||||
Result RenameDirectory(const FsPath& src, const FsPath& dst, bool ignore_read_only = false) override {
|
||||
return fs::RenameDirectory(&m_fs, src, dst, ignore_read_only);
|
||||
Result RenameDirectory(const FsPath& src, const FsPath& dst) override {
|
||||
return fs::RenameDirectory(&m_fs, src, dst, m_ignore_read_only);
|
||||
}
|
||||
Result GetEntryType(const FsPath& path, FsDirEntryType* out) override {
|
||||
return fs::GetEntryType(&m_fs, path, out);
|
||||
@@ -397,11 +410,11 @@ struct FsNative : Fs {
|
||||
Result read_entire_file(const FsPath& path, std::vector<u8>& out) override {
|
||||
return fs::read_entire_file(&m_fs, path, out);
|
||||
}
|
||||
Result write_entire_file(const FsPath& path, const std::vector<u8>& in, bool ignore_read_only = false) override {
|
||||
return fs::write_entire_file(&m_fs, path, in, ignore_read_only);
|
||||
Result write_entire_file(const FsPath& path, const std::vector<u8>& in) override {
|
||||
return fs::write_entire_file(&m_fs, path, in, m_ignore_read_only);
|
||||
}
|
||||
Result copy_entire_file(const FsPath& dst, const FsPath& src, bool ignore_read_only = false) override {
|
||||
return fs::copy_entire_file(&m_fs, dst, src, ignore_read_only);
|
||||
Result copy_entire_file(const FsPath& dst, const FsPath& src) override {
|
||||
return fs::copy_entire_file(&m_fs, dst, src, m_ignore_read_only);
|
||||
}
|
||||
|
||||
FsFileSystem m_fs{};
|
||||
@@ -417,43 +430,28 @@ struct FsNativeSd final : FsNative {
|
||||
};
|
||||
#else
|
||||
struct FsNativeSd final : FsNative {
|
||||
FsNativeSd() : FsNative{fsdevGetDeviceFileSystem("sdmc:"), false} {
|
||||
FsNativeSd(bool ignore_read_only = true) : FsNative{fsdevGetDeviceFileSystem("sdmc:"), false, ignore_read_only} {
|
||||
m_open_result = 0;
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
struct FsNativeBis final : FsNative {
|
||||
FsNativeBis(FsBisPartitionId id, const FsPath& string) {
|
||||
FsNativeBis(FsBisPartitionId id, const FsPath& string, bool ignore_read_only = true) : FsNative{ignore_read_only} {
|
||||
m_open_result = fsOpenBisFileSystem(&m_fs, id, string);
|
||||
}
|
||||
};
|
||||
|
||||
struct FsNativeImage final : FsNative {
|
||||
FsNativeImage(FsImageDirectoryId id) {
|
||||
FsNativeImage(FsImageDirectoryId id, bool ignore_read_only = true) : FsNative{ignore_read_only} {
|
||||
m_open_result = fsOpenImageDirectoryFileSystem(&m_fs, id);
|
||||
}
|
||||
};
|
||||
|
||||
struct FsNativeContentStorage final : FsNative {
|
||||
FsNativeContentStorage(FsContentStorageId id) {
|
||||
FsNativeContentStorage(FsContentStorageId id, bool ignore_read_only = true) : FsNative{ignore_read_only} {
|
||||
m_open_result = fsOpenContentStorageFileSystem(&m_fs, id);
|
||||
}
|
||||
};
|
||||
|
||||
// auto file_exists(const FsPath& path) -> bool;
|
||||
// auto create_file(const FsPath& path, u64 size = 0) -> Result;
|
||||
// auto delete_file(const FsPath& path) -> Result;
|
||||
// auto create_directory(const FsPath& path) -> Result;
|
||||
// auto create_directory_recursively(const FsPath& path) -> Result;
|
||||
// auto delete_directory(const FsPath& path) -> Result;
|
||||
// auto delete_directory_recursively(const FsPath& path) -> Result;
|
||||
// auto rename_file(const FsPath& src, const FsPath& dst) -> Result;
|
||||
// auto rename_directory(const FsPath& src, const FsPath& dst) -> Result;
|
||||
|
||||
// auto read_entire_file(const FsPath& path, std::vector<u8>& out) -> Result;
|
||||
// auto write_entire_file(const FsPath& path, const std::vector<u8>& in) -> Result;
|
||||
// // single threaded one shot copy, only use for very small files!
|
||||
// auto copy_entire_file(const FsPath& dst, const FsPath& src) -> Result;
|
||||
|
||||
} // namespace fs
|
||||
|
||||
8
sphaira/include/ftpsrv_helper.hpp
Normal file
8
sphaira/include/ftpsrv_helper.hpp
Normal file
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
namespace sphaira::ftpsrv {
|
||||
|
||||
bool Init();
|
||||
void Exit();
|
||||
|
||||
} // namespace sphaira::ftpsrv
|
||||
@@ -7,6 +7,8 @@ namespace sphaira::i18n {
|
||||
bool init(long index);
|
||||
void exit();
|
||||
|
||||
std::string get(const char* str);
|
||||
|
||||
} // namespace sphaira::i18n
|
||||
|
||||
inline namespace literals {
|
||||
|
||||
@@ -2,12 +2,15 @@
|
||||
|
||||
#define sphaira_USE_LOG 1
|
||||
|
||||
#include <cstdarg>
|
||||
|
||||
#if sphaira_USE_LOG
|
||||
auto log_file_init() -> bool;
|
||||
auto log_nxlink_init() -> bool;
|
||||
void log_file_exit();
|
||||
void log_nxlink_exit();
|
||||
void log_write(const char* s, ...) __attribute__ ((format (printf, 1, 2)));
|
||||
void log_write_arg(const char* s, std::va_list& v);
|
||||
#else
|
||||
inline auto log_file_init() -> bool {
|
||||
return true;
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <span>
|
||||
#include <optional>
|
||||
#include "fs.hpp"
|
||||
|
||||
namespace sphaira {
|
||||
@@ -14,20 +15,20 @@ struct Hbini {
|
||||
};
|
||||
|
||||
struct NroEntry {
|
||||
fs::FsPath path;
|
||||
s64 size;
|
||||
NacpStruct nacp;
|
||||
fs::FsPath path{};
|
||||
s64 size{};
|
||||
NacpStruct nacp{};
|
||||
|
||||
std::vector<u8> icon;
|
||||
u64 icon_size;
|
||||
u64 icon_offset;
|
||||
u64 icon_size{};
|
||||
u64 icon_offset{};
|
||||
|
||||
FsTimeStampRaw timestamp;
|
||||
Hbini hbini;
|
||||
FsTimeStampRaw timestamp{};
|
||||
Hbini hbini{};
|
||||
|
||||
int image; // nvg image
|
||||
int x,y,w,h; // image
|
||||
bool is_nacp_valid;
|
||||
int image{}; // nvg image
|
||||
int x,y,w,h{}; // image
|
||||
bool is_nacp_valid{};
|
||||
std::optional<bool> has_star{std::nullopt};
|
||||
|
||||
auto GetName() const -> const char* {
|
||||
return nacp.lang[0].name;
|
||||
@@ -74,4 +75,10 @@ auto nro_add_arg_file(std::string arg) -> std::string;
|
||||
// strips sdmc:
|
||||
auto nro_normalise_path(const std::string& p) -> std::string;
|
||||
|
||||
// helpers to find nro entry, will be made methods soon once i convert vector into a struct.
|
||||
auto nro_find(std::span<const NroEntry> array, std::string_view name, std::string_view author, const fs::FsPath& path) -> std::optional<NroEntry>;
|
||||
auto nro_find_name(std::span<const NroEntry> array, std::string_view name) -> std::optional<NroEntry>;
|
||||
auto nro_find_author(std::span<const NroEntry> array, std::string_view author) -> std::optional<NroEntry>;
|
||||
auto nro_find_path(std::span<const NroEntry> array, const fs::FsPath& path) -> std::optional<NroEntry>;
|
||||
|
||||
} // namespace sphaira
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
namespace sphaira::swkbd {
|
||||
|
||||
Result ShowText(std::string& out, const char* guide = nullptr, s64 len_min = -1, s64 len_max = -1);
|
||||
Result ShowNumPad(s64& out, const char* guide = nullptr, s64 len_min = -1, s64 len_max = -1);
|
||||
Result ShowText(std::string& out, const char* guide = nullptr, const char* initial = nullptr, s64 len_min = -1, s64 len_max = FS_MAX_PATH);
|
||||
Result ShowNumPad(s64& out, const char* guide = nullptr, const char* initial = nullptr, s64 len_min = -1, s64 len_max = FS_MAX_PATH);
|
||||
|
||||
} // namespace sphaira::swkbd
|
||||
|
||||
10
sphaira/include/ui/bubbles.hpp
Normal file
10
sphaira/include/ui/bubbles.hpp
Normal file
@@ -0,0 +1,10 @@
|
||||
#include "ui/types.hpp"
|
||||
#include "ui/object.hpp"
|
||||
|
||||
namespace sphaira::ui::bubble {
|
||||
|
||||
void Init();
|
||||
void Draw(NVGcontext* vg, Theme* theme);
|
||||
void Exit();
|
||||
|
||||
} // namespace sphaira::ui::bubble
|
||||
@@ -10,14 +10,13 @@ public:
|
||||
ErrorBox(Result code, const std::string& message);
|
||||
|
||||
auto Update(Controller* controller, TouchInfo* touch) -> void override;
|
||||
auto OnLayoutChange() -> void override;
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
|
||||
private:
|
||||
Result m_code;
|
||||
std::string m_message;
|
||||
std::string m_module_str;
|
||||
std::string m_description_str;
|
||||
Result m_code{};
|
||||
std::string m_message{};
|
||||
std::string m_module_str{};
|
||||
std::string m_description_str{};
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui
|
||||
|
||||
57
sphaira/include/ui/list.hpp
Normal file
57
sphaira/include/ui/list.hpp
Normal file
@@ -0,0 +1,57 @@
|
||||
#pragma once
|
||||
|
||||
#include "ui/object.hpp"
|
||||
|
||||
namespace sphaira::ui {
|
||||
|
||||
struct List final : Object {
|
||||
using Callback = std::function<void(NVGcontext* vg, Theme* theme, Vec4 v, s64 index)>;
|
||||
using TouchCallback = std::function<void(s64 index)>;
|
||||
|
||||
List(s64 row, s64 page, const Vec4& pos, const Vec4& v, const Vec2& pad = {});
|
||||
|
||||
void OnUpdate(Controller* controller, TouchInfo* touch, s64 count, TouchCallback callback);
|
||||
|
||||
void Draw(NVGcontext* vg, Theme* theme, s64 count, Callback callback) const;
|
||||
|
||||
auto SetScrollBarPos(float x, float y, float h) {
|
||||
m_scrollbar.x = x;
|
||||
m_scrollbar.y = y;
|
||||
m_scrollbar.h = h;
|
||||
}
|
||||
|
||||
auto ScrollDown(s64& index, s64 step, s64 count) -> bool;
|
||||
auto ScrollUp(s64& index, s64 step, s64 count) -> bool;
|
||||
|
||||
auto GetYoff() const {
|
||||
return m_yoff;
|
||||
}
|
||||
|
||||
void SetYoff(float y = 0) {
|
||||
m_yoff = y;
|
||||
}
|
||||
|
||||
auto GetMaxY() const {
|
||||
return m_v.h + m_pad.y;
|
||||
}
|
||||
|
||||
private:
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override {}
|
||||
auto ClampY(float y, s64 count) const -> float;
|
||||
|
||||
private:
|
||||
const s64 m_row;
|
||||
const s64 m_page;
|
||||
|
||||
Vec4 m_v{};
|
||||
Vec2 m_pad{};
|
||||
|
||||
Vec4 m_scrollbar{};
|
||||
|
||||
// current y offset.
|
||||
float m_yoff{};
|
||||
// in progress y offset, used when scrolling.
|
||||
float m_y_prog{};
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "ui/menus/menu_base.hpp"
|
||||
#include "ui/scrollable_text.hpp"
|
||||
#include "ui/list.hpp"
|
||||
#include "nro.hpp"
|
||||
#include "fs.hpp"
|
||||
#include <span>
|
||||
@@ -27,6 +28,8 @@ struct LazyImage {
|
||||
~LazyImage();
|
||||
int image{};
|
||||
int w{}, h{};
|
||||
bool tried_cache{};
|
||||
bool cached{};
|
||||
ImageDownloadState state{ImageDownloadState::None};
|
||||
u8 first_pixel[4]{};
|
||||
};
|
||||
@@ -39,26 +42,26 @@ enum class EntryStatus {
|
||||
};
|
||||
|
||||
struct Entry {
|
||||
std::string category; // todo: lable
|
||||
std::string binary; // optional, only valid for .nro
|
||||
std::string updated; // date of update
|
||||
std::string name;
|
||||
std::string license; // optional
|
||||
std::string title; // same as name but with spaces
|
||||
std::string url; // url of repo (optional?)
|
||||
std::string description;
|
||||
std::string author;
|
||||
std::string changelog; // optional
|
||||
u64 screens; // number of screenshots
|
||||
u64 extracted; // extracted size in KiB
|
||||
std::string version;
|
||||
u64 filesize; // compressed size in KiB
|
||||
std::string details;
|
||||
u64 app_dls;
|
||||
std::string md5; // md5 of the zip
|
||||
std::string category{}; // todo: lable
|
||||
std::string binary{}; // optional, only valid for .nro
|
||||
std::string updated{}; // date of update
|
||||
std::string name{};
|
||||
std::string license{}; // optional
|
||||
std::string title{}; // same as name but with spaces
|
||||
std::string url{}; // url of repo (optional?)
|
||||
std::string description{};
|
||||
std::string author{};
|
||||
std::string changelog{}; // optional
|
||||
u64 screens{}; // number of screenshots
|
||||
u64 extracted{}; // extracted size in KiB
|
||||
std::string version{};
|
||||
u64 filesize{}; // compressed size in KiB
|
||||
std::string details{};
|
||||
u64 app_dls{};
|
||||
std::string md5{}; // md5 of the zip
|
||||
|
||||
LazyImage image;
|
||||
u32 updated_num;
|
||||
LazyImage image{};
|
||||
u32 updated_num{};
|
||||
EntryStatus status{EntryStatus::Get};
|
||||
};
|
||||
|
||||
@@ -75,7 +78,7 @@ struct EntryMenu final : MenuBase {
|
||||
// void OnFocusGained() override;
|
||||
|
||||
void ShowChangelogAction();
|
||||
void SetIndex(std::size_t index);
|
||||
void SetIndex(s64 index);
|
||||
|
||||
void UpdateOptions();
|
||||
|
||||
@@ -95,14 +98,14 @@ private:
|
||||
const LazyImage& m_default_icon;
|
||||
Menu& m_menu;
|
||||
|
||||
std::size_t m_index{}; // where i am in the array
|
||||
std::vector<Option> m_options;
|
||||
LazyImage m_banner;
|
||||
std::vector<LazyImage> m_screens;
|
||||
s64 m_index{}; // where i am in the array
|
||||
std::vector<Option> m_options{};
|
||||
LazyImage m_banner{};
|
||||
std::unique_ptr<List> m_list{};
|
||||
|
||||
std::shared_ptr<ScrollableText> m_details;
|
||||
std::shared_ptr<ScrollableText> m_changelog;
|
||||
std::shared_ptr<ScrollableText> m_detail_changelog;
|
||||
std::shared_ptr<ScrollableText> m_details{};
|
||||
std::shared_ptr<ScrollableText> m_changelog{};
|
||||
std::shared_ptr<ScrollableText> m_detail_changelog{};
|
||||
|
||||
bool m_show_changlog{};
|
||||
};
|
||||
@@ -127,39 +130,10 @@ enum SortType {
|
||||
};
|
||||
|
||||
enum OrderType {
|
||||
OrderType_Decending,
|
||||
OrderType_Descending,
|
||||
OrderType_Ascending,
|
||||
};
|
||||
|
||||
struct FeedbackEntry {
|
||||
u32 id;
|
||||
u64 time;
|
||||
std::string package; // name of package
|
||||
std::string content; // the feedback message that was sent
|
||||
std::string reply; // the reply, "" if no reply yet :)
|
||||
};
|
||||
|
||||
struct FeedbackMenu final : MenuBase {
|
||||
FeedbackMenu(const std::vector<Entry>& package_entries, LazyImage& default_image);
|
||||
~FeedbackMenu();
|
||||
|
||||
void Update(Controller* controller, TouchInfo* touch) override;
|
||||
void Draw(NVGcontext* vg, Theme* theme) override;
|
||||
void OnFocusGained() override;
|
||||
|
||||
void SetIndex(std::size_t index);
|
||||
void ScanHomebrew();
|
||||
void Sort();
|
||||
|
||||
private:
|
||||
const std::vector<Entry>& m_package_entries;
|
||||
LazyImage& m_default_image;
|
||||
std::vector<FeedbackEntry> m_entries;
|
||||
std::size_t m_start{};
|
||||
std::size_t m_index{}; // where i am in the array
|
||||
ImageDownloadState m_repo_download_state{ImageDownloadState::None};
|
||||
};
|
||||
|
||||
struct Menu final : MenuBase {
|
||||
Menu(const std::vector<NroEntry>& nro_entries);
|
||||
~Menu();
|
||||
@@ -168,7 +142,7 @@ struct Menu final : MenuBase {
|
||||
void Draw(NVGcontext* vg, Theme* theme) override;
|
||||
void OnFocusGained() override;
|
||||
|
||||
void SetIndex(std::size_t index);
|
||||
void SetIndex(s64 index);
|
||||
void ScanHomebrew();
|
||||
void Sort();
|
||||
|
||||
@@ -189,29 +163,29 @@ struct Menu final : MenuBase {
|
||||
|
||||
private:
|
||||
const std::vector<NroEntry>& m_nro_entries;
|
||||
std::vector<Entry> m_entries;
|
||||
std::vector<EntryMini> m_entries_index[Filter_MAX];
|
||||
std::vector<EntryMini> m_entries_index_author;
|
||||
std::vector<EntryMini> m_entries_index_search;
|
||||
std::span<EntryMini> m_entries_current;
|
||||
std::vector<Entry> m_entries{};
|
||||
std::vector<EntryMini> m_entries_index[Filter_MAX]{};
|
||||
std::vector<EntryMini> m_entries_index_author{};
|
||||
std::vector<EntryMini> m_entries_index_search{};
|
||||
std::span<EntryMini> m_entries_current{};
|
||||
|
||||
Filter m_filter{Filter::Filter_All};
|
||||
SortType m_sort{SortType::SortType_Updated};
|
||||
OrderType m_order{OrderType::OrderType_Decending};
|
||||
OrderType m_order{OrderType::OrderType_Descending};
|
||||
|
||||
std::size_t m_start{};
|
||||
std::size_t m_index{}; // where i am in the array
|
||||
LazyImage m_default_image;
|
||||
LazyImage m_update;
|
||||
LazyImage m_get;
|
||||
LazyImage m_local;
|
||||
LazyImage m_installed;
|
||||
s64 m_index{}; // where i am in the array
|
||||
LazyImage m_default_image{};
|
||||
LazyImage m_update{};
|
||||
LazyImage m_get{};
|
||||
LazyImage m_local{};
|
||||
LazyImage m_installed{};
|
||||
ImageDownloadState m_repo_download_state{ImageDownloadState::None};
|
||||
std::unique_ptr<List> m_list{};
|
||||
|
||||
std::string m_search_term;
|
||||
std::string m_author_term;
|
||||
u64 m_entry_search_jump_back{};
|
||||
u64 m_entry_author_jump_back{};
|
||||
std::string m_search_term{};
|
||||
std::string m_author_term{};
|
||||
s64 m_entry_search_jump_back{};
|
||||
s64 m_entry_author_jump_back{};
|
||||
bool m_is_search{};
|
||||
bool m_is_author{};
|
||||
bool m_dirty{}; // if set, does a sort
|
||||
|
||||
@@ -16,15 +16,15 @@ struct Menu final : MenuBase {
|
||||
|
||||
private:
|
||||
const fs::FsPath m_path;
|
||||
fs::FsNativeSd m_fs;
|
||||
FsFile m_file;
|
||||
fs::FsNativeSd m_fs{};
|
||||
FsFile m_file{};
|
||||
s64 m_file_size{};
|
||||
s64 m_file_offset{};
|
||||
|
||||
std::unique_ptr<ScrollableText> m_scroll_text;
|
||||
std::unique_ptr<ScrollableText> m_scroll_text{};
|
||||
|
||||
std::size_t m_start{};
|
||||
std::size_t m_index{}; // where i am in the array
|
||||
s64 m_start{};
|
||||
s64 m_index{}; // where i am in the array
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui::menu::fileview
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "ui/menus/menu_base.hpp"
|
||||
#include "ui/list.hpp"
|
||||
#include "nro.hpp"
|
||||
#include "fs.hpp"
|
||||
#include "option.hpp"
|
||||
@@ -9,6 +10,12 @@
|
||||
|
||||
namespace sphaira::ui::menu::filebrowser {
|
||||
|
||||
enum class FsType {
|
||||
Sd,
|
||||
ImageNand,
|
||||
ImageSd,
|
||||
};
|
||||
|
||||
enum class SelectedType {
|
||||
None,
|
||||
Copy,
|
||||
@@ -22,7 +29,7 @@ enum SortType {
|
||||
};
|
||||
|
||||
enum OrderType {
|
||||
OrderType_Decending,
|
||||
OrderType_Descending,
|
||||
OrderType_Ascending,
|
||||
};
|
||||
|
||||
@@ -79,17 +86,27 @@ struct FileEntry : FsDirectoryEntry {
|
||||
|
||||
struct FileAssocEntry {
|
||||
fs::FsPath path{}; // ini name
|
||||
std::string name; // ini name
|
||||
std::vector<std::string> ext; // list of ext
|
||||
std::vector<std::string> database; // list of systems
|
||||
std::string name{}; // ini name
|
||||
std::vector<std::string> ext{}; // list of ext
|
||||
std::vector<std::string> database{}; // list of systems
|
||||
};
|
||||
|
||||
struct LastFile {
|
||||
fs::FsPath name;
|
||||
u64 index;
|
||||
u64 offset;
|
||||
u64 entries_count;
|
||||
fs::FsPath name{};
|
||||
s64 index{};
|
||||
float offset{};
|
||||
s64 entries_count{};
|
||||
};
|
||||
|
||||
struct FsDirCollection {
|
||||
fs::FsPath path{};
|
||||
fs::FsPath parent_name{};
|
||||
std::vector<FsDirectoryEntry> files{};
|
||||
std::vector<FsDirectoryEntry> dirs{};
|
||||
};
|
||||
|
||||
using FsDirCollections = std::vector<FsDirCollection>;
|
||||
|
||||
struct Menu final : MenuBase {
|
||||
Menu(const std::vector<NroEntry>& nro_entries);
|
||||
~Menu();
|
||||
@@ -103,26 +120,25 @@ struct Menu final : MenuBase {
|
||||
}
|
||||
|
||||
private:
|
||||
void SetIndex(std::size_t index);
|
||||
void SetIndex(s64 index);
|
||||
void InstallForwarder();
|
||||
auto Scan(const fs::FsPath& new_path, bool is_walk_up = false) -> Result;
|
||||
|
||||
void LoadAssocEntriesPath(const fs::FsPath& path);
|
||||
void LoadAssocEntries();
|
||||
auto FindFileAssocFor() -> std::vector<FileAssocEntry>;
|
||||
void OnIndexChange();
|
||||
|
||||
auto GetNewPath(const FileEntry& entry) const -> fs::FsPath {
|
||||
return GetNewPath(m_path, entry.name);
|
||||
};
|
||||
}
|
||||
|
||||
auto GetNewPath(u64 index) const -> fs::FsPath {
|
||||
auto GetNewPath(s64 index) const -> fs::FsPath {
|
||||
return GetNewPath(m_path, GetEntry(index).name);
|
||||
};
|
||||
}
|
||||
|
||||
auto GetNewPathCurrent() const -> fs::FsPath {
|
||||
return GetNewPath(m_index);
|
||||
};
|
||||
}
|
||||
|
||||
auto GetSelectedEntries() const -> std::vector<FileEntry> {
|
||||
if (!m_selected_count) {
|
||||
@@ -204,46 +220,54 @@ private:
|
||||
void OnDeleteCallback();
|
||||
void OnPasteCallback();
|
||||
void OnRenameCallback();
|
||||
auto CheckIfUpdateFolder() -> Result;
|
||||
|
||||
auto get_collection(const fs::FsPath& path, const fs::FsPath& parent_name, FsDirCollection& out, bool inc_file, bool inc_dir, bool inc_size) -> Result;
|
||||
auto get_collections(const fs::FsPath& path, const fs::FsPath& parent_name, FsDirCollections& out) -> Result;
|
||||
|
||||
void SetFs(const fs::FsPath& new_path, u32 new_type);
|
||||
|
||||
private:
|
||||
static constexpr inline const char* INI_SECTION = "filebrowser";
|
||||
|
||||
const std::vector<NroEntry>& m_nro_entries;
|
||||
fs::FsPath m_path;
|
||||
std::vector<FileEntry> m_entries;
|
||||
std::vector<u32> m_entries_index; // files not including hidden
|
||||
std::vector<u32> m_entries_index_hidden; // includes hidden files
|
||||
std::vector<u32> m_entries_index_search; // files found via search
|
||||
std::span<u32> m_entries_current;
|
||||
std::unique_ptr<fs::FsNative> m_fs{};
|
||||
FsType m_fs_type{};
|
||||
fs::FsPath m_path{};
|
||||
std::vector<FileEntry> m_entries{};
|
||||
std::vector<u32> m_entries_index{}; // files not including hidden
|
||||
std::vector<u32> m_entries_index_hidden{}; // includes hidden files
|
||||
std::vector<u32> m_entries_index_search{}; // files found via search
|
||||
std::span<u32> m_entries_current{};
|
||||
|
||||
std::unique_ptr<List> m_list{};
|
||||
std::optional<fs::FsPath> m_daybreak_path{};
|
||||
|
||||
// search options
|
||||
// show files [X]
|
||||
// show folders [X]
|
||||
// recursive (slow) [ ]
|
||||
|
||||
std::vector<FileAssocEntry> m_assoc_entries;
|
||||
std::vector<FileEntry> m_selected_files;
|
||||
std::vector<FileAssocEntry> m_assoc_entries{};
|
||||
std::vector<FileEntry> m_selected_files{};
|
||||
|
||||
// this keeps track of the highlighted file before opening a folder
|
||||
// if the user presses B to go back to the previous dir
|
||||
// this vector is popped, then, that entry is checked if it still exists
|
||||
// if it does, the index becomes that file.
|
||||
std::vector<LastFile> m_previous_highlighted_file;
|
||||
fs::FsPath m_selected_path;
|
||||
std::size_t m_index{};
|
||||
std::size_t m_index_offset{};
|
||||
std::size_t m_selected_count{};
|
||||
std::vector<LastFile> m_previous_highlighted_file{};
|
||||
fs::FsPath m_selected_path{};
|
||||
s64 m_index{};
|
||||
s64 m_selected_count{};
|
||||
SelectedType m_selected_type{SelectedType::None};
|
||||
|
||||
option::OptionLong m_sort{INI_SECTION, "sort", SortType::SortType_Alphabetical};
|
||||
option::OptionLong m_order{INI_SECTION, "order", OrderType::OrderType_Decending};
|
||||
option::OptionLong m_order{INI_SECTION, "order", OrderType::OrderType_Descending};
|
||||
option::OptionBool m_show_hidden{INI_SECTION, "show_hidden", false};
|
||||
option::OptionBool m_folders_first{INI_SECTION, "folders_first", true};
|
||||
option::OptionBool m_hidden_last{INI_SECTION, "hidden_last", false};
|
||||
|
||||
option::OptionBool m_search_show_files{INI_SECTION, "search_show_files", true};
|
||||
option::OptionBool m_search_show_folders{INI_SECTION, "search_show_folders", true};
|
||||
option::OptionBool m_search_recursive{INI_SECTION, "search_recursive", false};
|
||||
option::OptionBool m_ignore_read_only{INI_SECTION, "ignore_read_only", false};
|
||||
option::OptionLong m_mount{INI_SECTION, "mount", 0};
|
||||
|
||||
bool m_loaded_assoc_entries{};
|
||||
bool m_is_update_folder{};
|
||||
|
||||
74
sphaira/include/ui/menus/ghdl.hpp
Normal file
74
sphaira/include/ui/menus/ghdl.hpp
Normal file
@@ -0,0 +1,74 @@
|
||||
#pragma once
|
||||
|
||||
#include "ui/menus/menu_base.hpp"
|
||||
#include "ui/list.hpp"
|
||||
#include "fs.hpp"
|
||||
#include "option.hpp"
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
namespace sphaira::ui::menu::gh {
|
||||
|
||||
struct AssetEntry {
|
||||
std::string name{};
|
||||
std::string path{};
|
||||
std::string pre_install_message{};
|
||||
std::string post_install_message{};
|
||||
};
|
||||
|
||||
struct Entry {
|
||||
fs::FsPath json_path{};
|
||||
std::string url{};
|
||||
std::string owner{};
|
||||
std::string repo{};
|
||||
std::string tag{};
|
||||
std::string pre_install_message{};
|
||||
std::string post_install_message{};
|
||||
std::vector<AssetEntry> assets{};
|
||||
};
|
||||
|
||||
struct GhApiAsset {
|
||||
std::string name{};
|
||||
std::string content_type{};
|
||||
u64 size{};
|
||||
u64 download_count{};
|
||||
std::string browser_download_url{};
|
||||
};
|
||||
|
||||
struct GhApiEntry {
|
||||
std::string tag_name{};
|
||||
std::string name{};
|
||||
std::vector<GhApiAsset> assets{};
|
||||
};
|
||||
|
||||
struct Menu final : MenuBase {
|
||||
Menu();
|
||||
~Menu();
|
||||
|
||||
void Update(Controller* controller, TouchInfo* touch) override;
|
||||
void Draw(NVGcontext* vg, Theme* theme) override;
|
||||
void OnFocusGained() override;
|
||||
|
||||
private:
|
||||
void SetIndex(s64 index);
|
||||
void Scan();
|
||||
void LoadEntriesFromPath(const fs::FsPath& path);
|
||||
|
||||
auto GetEntry() -> Entry& {
|
||||
return m_entries[m_index];
|
||||
}
|
||||
|
||||
auto GetEntry() const -> const Entry& {
|
||||
return m_entries[m_index];
|
||||
}
|
||||
|
||||
void Sort();
|
||||
void UpdateSubheading();
|
||||
|
||||
private:
|
||||
std::vector<Entry> m_entries{};
|
||||
s64 m_index{};
|
||||
std::unique_ptr<List> m_list{};
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui::menu::gh
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "ui/menus/menu_base.hpp"
|
||||
#include "ui/list.hpp"
|
||||
#include "nro.hpp"
|
||||
#include "fs.hpp"
|
||||
#include "option.hpp"
|
||||
@@ -9,12 +10,15 @@ namespace sphaira::ui::menu::homebrew {
|
||||
|
||||
enum SortType {
|
||||
SortType_Updated,
|
||||
SortType_Size,
|
||||
SortType_Alphabetical,
|
||||
SortType_Size,
|
||||
SortType_UpdatedStar,
|
||||
SortType_AlphabeticalStar,
|
||||
SortType_SizeStar,
|
||||
};
|
||||
|
||||
enum OrderType {
|
||||
OrderType_Decending,
|
||||
OrderType_Descending,
|
||||
OrderType_Ascending,
|
||||
};
|
||||
|
||||
@@ -26,7 +30,7 @@ struct Menu final : MenuBase {
|
||||
void Draw(NVGcontext* vg, Theme* theme) override;
|
||||
void OnFocusGained() override;
|
||||
|
||||
void SetIndex(std::size_t index);
|
||||
void SetIndex(s64 index);
|
||||
void InstallHomebrew();
|
||||
void ScanHomebrew();
|
||||
void Sort();
|
||||
@@ -36,16 +40,23 @@ struct Menu final : MenuBase {
|
||||
return m_entries;
|
||||
}
|
||||
|
||||
auto IsStarEnabled() -> bool {
|
||||
return m_sort.Get() >= SortType_UpdatedStar;
|
||||
}
|
||||
|
||||
static Result InstallHomebrew(const fs::FsPath& path, const NacpStruct& nacp, const std::vector<u8>& icon);
|
||||
static Result InstallHomebrewFromPath(const fs::FsPath& path);
|
||||
|
||||
private:
|
||||
static constexpr inline const char* INI_SECTION = "homebrew";
|
||||
|
||||
std::vector<NroEntry> m_entries;
|
||||
std::size_t m_start{};
|
||||
std::size_t m_index{}; // where i am in the array
|
||||
std::vector<NroEntry> m_entries{};
|
||||
s64 m_index{}; // where i am in the array
|
||||
std::unique_ptr<List> m_list{};
|
||||
|
||||
option::OptionLong m_sort{INI_SECTION, "sort", SortType::SortType_Updated};
|
||||
option::OptionLong m_order{INI_SECTION, "order", OrderType::OrderType_Decending};
|
||||
option::OptionBool m_hide_sphaira{INI_SECTION, "hide_sphaira", false};}
|
||||
;
|
||||
option::OptionLong m_sort{INI_SECTION, "sort", SortType::SortType_AlphabeticalStar};
|
||||
option::OptionLong m_order{INI_SECTION, "order", OrderType::OrderType_Descending};
|
||||
option::OptionBool m_hide_sphaira{INI_SECTION, "hide_sphaira", false};
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui::menu::homebrew
|
||||
|
||||
@@ -61,7 +61,7 @@ private:
|
||||
Rotation m_rotation{Rotation_90};
|
||||
Colour m_colour{Colour_Grey};
|
||||
int m_image{};
|
||||
std::size_t m_index{};
|
||||
s64 m_index{};
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui::menu::irs
|
||||
|
||||
@@ -7,6 +7,17 @@
|
||||
|
||||
namespace sphaira::ui::menu::main {
|
||||
|
||||
enum class UpdateState {
|
||||
// still downloading json from github
|
||||
Pending,
|
||||
// no update available.
|
||||
None,
|
||||
// update available!
|
||||
Update,
|
||||
// there was an error whilst checking for updates.
|
||||
Error,
|
||||
};
|
||||
|
||||
// this holds 2 menus and allows for switching between them
|
||||
struct MainMenu final : Widget {
|
||||
MainMenu();
|
||||
@@ -17,10 +28,13 @@ struct MainMenu final : Widget {
|
||||
void OnFocusGained() override;
|
||||
void OnFocusLost() override;
|
||||
|
||||
auto IsMenu() const -> bool override {
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
void OnLRPress(std::shared_ptr<MenuBase> menu, Button b);
|
||||
void AddOnLPress();
|
||||
void AddOnRPress();
|
||||
void AddOnLRPress();
|
||||
|
||||
private:
|
||||
std::shared_ptr<homebrew::Menu> m_homebrew_menu{};
|
||||
@@ -31,7 +45,7 @@ private:
|
||||
std::string m_update_url{};
|
||||
std::string m_update_version{};
|
||||
std::string m_update_description{};
|
||||
bool m_update_avaliable{};
|
||||
UpdateState m_update_state{UpdateState::Pending};
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui::menu::main
|
||||
|
||||
@@ -12,15 +12,31 @@ struct MenuBase : Widget {
|
||||
|
||||
virtual void Update(Controller* controller, TouchInfo* touch);
|
||||
virtual void Draw(NVGcontext* vg, Theme* theme);
|
||||
|
||||
auto IsMenu() const -> bool override {
|
||||
return true;
|
||||
}
|
||||
|
||||
void SetTitle(std::string title);
|
||||
void SetTitleSubHeading(std::string sub_heading);
|
||||
void SetSubHeading(std::string sub_heading);
|
||||
|
||||
private:
|
||||
std::string m_title;
|
||||
std::string m_title_sub_heading;
|
||||
std::string m_sub_heading;
|
||||
AppletType m_applet_type;
|
||||
void UpdateVars();
|
||||
|
||||
private:
|
||||
std::string m_title{};
|
||||
std::string m_title_sub_heading{};
|
||||
std::string m_sub_heading{};
|
||||
|
||||
struct tm m_tm{};
|
||||
TimeStamp m_poll_timestamp{};
|
||||
u32 m_battery_percetange{};
|
||||
PsmChargerType m_charger_type{};
|
||||
NifmInternetConnectionType m_type{};
|
||||
NifmInternetConnectionStatus m_status{};
|
||||
u32 m_strength{};
|
||||
u32 m_ip{};
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui::menu
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "ui/menus/menu_base.hpp"
|
||||
#include "ui/scrollable_text.hpp"
|
||||
#include "ui/list.hpp"
|
||||
#include "option.hpp"
|
||||
#include <span>
|
||||
|
||||
@@ -15,28 +16,14 @@ enum class ImageDownloadState {
|
||||
};
|
||||
|
||||
struct LazyImage {
|
||||
LazyImage() = default;
|
||||
~LazyImage();
|
||||
int image{};
|
||||
int w{}, h{};
|
||||
bool tried_cache{};
|
||||
bool cached{};
|
||||
ImageDownloadState state{ImageDownloadState::None};
|
||||
u8 first_pixel[4]{};
|
||||
};
|
||||
|
||||
// "mutation setLike($type: String!, $id: String!, $value: Boolean!) {\n setLike(type: $type, id: $id, value: $value)\n}\n"
|
||||
|
||||
// https://api.themezer.net/?query=query($nsfw:Boolean,$target:String,$page:Int,$limit:Int,$sort:String,$order:String,$query:String){themeList(nsfw:$nsfw,target:$target,page:$page,limit:$limit,sort:$sort,order:$order,query:$query){id,creator{id,display_name},details{name,description},last_updated,dl_count,like_count,target,preview{original,thumb}}}&variables={"nsfw":false,"target":null,"page":1,"limit":10,"sort":"updated","order":"desc","query":null}
|
||||
// https://api.themezer.net/?query=query($nsfw:Boolean,$page:Int,$limit:Int,$sort:String,$order:String,$query:String){packList(nsfw:$nsfw,page:$page,limit:$limit,sort:$sort,order:$order,query:$query){id,creator{id,display_name},details{name,description},last_updated,dl_count,like_count,themes{id,creator{display_name},details{name,description},last_updated,dl_count,like_count,target,preview{original,thumb}}}}&variables={"nsfw":false,"page":1,"limit":10,"sort":"updated","order":"desc","query":null}
|
||||
// https://api.themezer.net/?query=query($id:String!){pack(id:$id){id,creator{display_name},details{name,description},last_updated,categories,dl_count,like_count,themes{id,details{name},layout{id,details{name}},categories,target,preview{original,thumb},last_updated,dl_count,like_count}}}&variables={"id":"16d"}
|
||||
|
||||
// https://api.themezer.net/?query=query{nxinstaller(id:"t9a6"){themes{filename,url,mimetype}}}
|
||||
// https://api.themezer.net/?query=query{downloadTheme(id:"t9a6"){filename,url,mimetype}}
|
||||
// https://api.themezer.net/?query=query{downloadPack(id:"t9a6"){filename,url,mimetype}}
|
||||
|
||||
// {"data":{"setLike":true}}
|
||||
// https://api.themezer.net/?query=mutation{setLike(type:"packs",id:"5",value:true){data{setLike}}}
|
||||
// https://api.themezer.net/?query=mutation($type:String!,$id:String!,$value:Boolean!){setLike(type:$type,id:$id,value:$value){data{setLike}}}&variables={"type":"packs","id":"5","value":true}
|
||||
|
||||
enum MenuState {
|
||||
MenuState_Normal,
|
||||
MenuState_Search,
|
||||
@@ -56,73 +43,49 @@ enum class PageLoadState {
|
||||
};
|
||||
|
||||
struct Creator {
|
||||
std::string id;
|
||||
std::string display_name;
|
||||
std::string id{};
|
||||
std::string display_name{};
|
||||
};
|
||||
|
||||
struct Details {
|
||||
std::string name;
|
||||
std::string description;
|
||||
std::string name{};
|
||||
};
|
||||
|
||||
struct Preview {
|
||||
std::string original;
|
||||
std::string thumb;
|
||||
LazyImage lazy_image;
|
||||
std::string thumb{};
|
||||
LazyImage lazy_image{};
|
||||
};
|
||||
|
||||
struct DownloadPack {
|
||||
std::string filename;
|
||||
std::string url;
|
||||
std::string mimetype;
|
||||
std::string filename{};
|
||||
std::string url{};
|
||||
std::string mimetype{};
|
||||
};
|
||||
|
||||
using DownloadTheme = DownloadPack;
|
||||
|
||||
struct ThemeEntry {
|
||||
std::string id;
|
||||
Creator creator;
|
||||
Details details;
|
||||
std::string last_updated;
|
||||
u64 dl_count;
|
||||
u64 like_count;
|
||||
std::vector<std::string> categories;
|
||||
std::string target;
|
||||
Preview preview;
|
||||
std::string id{};
|
||||
Preview preview{};
|
||||
};
|
||||
|
||||
// struct Pack {
|
||||
// std::string id;
|
||||
// Creator creator;
|
||||
// Details details;
|
||||
// std::string last_updated;
|
||||
// std::vector<std::string> categories;
|
||||
// u64 dl_count;
|
||||
// u64 like_count;
|
||||
// std::vector<ThemeEntry> themes;
|
||||
// };
|
||||
|
||||
struct PackListEntry {
|
||||
std::string id;
|
||||
Creator creator;
|
||||
Details details;
|
||||
std::string last_updated;
|
||||
std::vector<std::string> categories;
|
||||
u64 dl_count;
|
||||
u64 like_count;
|
||||
std::vector<ThemeEntry> themes;
|
||||
std::string id{};
|
||||
Creator creator{};
|
||||
Details details{};
|
||||
std::vector<ThemeEntry> themes{};
|
||||
};
|
||||
|
||||
struct Pagination {
|
||||
u64 page;
|
||||
u64 limit;
|
||||
u64 page_count;
|
||||
u64 item_count;
|
||||
u64 page{};
|
||||
u64 limit{};
|
||||
u64 page_count{};
|
||||
u64 item_count{};
|
||||
};
|
||||
|
||||
struct PackList {
|
||||
std::vector<PackListEntry> packList;
|
||||
Pagination pagination;
|
||||
std::vector<PackListEntry> packList{};
|
||||
Pagination pagination{};
|
||||
};
|
||||
|
||||
struct Config {
|
||||
@@ -131,10 +94,10 @@ struct Config {
|
||||
u32 sort_index{};
|
||||
u32 order_index{};
|
||||
// search query, if empty, its not used
|
||||
std::string query;
|
||||
std::string query{};
|
||||
// this is actually an array of creator ids, but we don't support that feature
|
||||
// if empty, its not used
|
||||
std::string creator;
|
||||
std::string creator{};
|
||||
// defaults
|
||||
u32 page{1};
|
||||
u32 limit{18};
|
||||
@@ -160,7 +123,7 @@ struct Config {
|
||||
struct Menu; // fwd
|
||||
|
||||
struct PageEntry {
|
||||
std::vector<PackListEntry> m_packList;
|
||||
std::vector<PackListEntry> m_packList{};
|
||||
Pagination m_pagination{};
|
||||
PageLoadState m_ready{PageLoadState::None};
|
||||
};
|
||||
@@ -173,13 +136,13 @@ struct Menu final : MenuBase {
|
||||
void Draw(NVGcontext* vg, Theme* theme) override;
|
||||
void OnFocusGained() override;
|
||||
|
||||
void SetIndex(std::size_t index) {
|
||||
void SetIndex(s64 index) {
|
||||
m_index = index;
|
||||
if (!m_index) {
|
||||
m_list->SetYoff(0);
|
||||
}
|
||||
}
|
||||
|
||||
// void SetSearch(const std::string& term);
|
||||
// void SetAuthor();
|
||||
|
||||
void InvalidateAllPages();
|
||||
void PackListDownload();
|
||||
void OnPackListDownload();
|
||||
@@ -188,14 +151,14 @@ private:
|
||||
static constexpr inline const char* INI_SECTION = "themezer";
|
||||
static constexpr inline u32 MAX_ON_PAGE = 16; // same as website
|
||||
|
||||
std::vector<PageEntry> m_pages;
|
||||
std::size_t m_page_index{};
|
||||
std::size_t m_page_index_max{1};
|
||||
std::vector<PageEntry> m_pages{};
|
||||
s64 m_page_index{};
|
||||
s64 m_page_index_max{1};
|
||||
|
||||
std::string m_search{};
|
||||
|
||||
std::size_t m_start{};
|
||||
std::size_t m_index{}; // where i am in the array
|
||||
s64 m_index{}; // where i am in the array
|
||||
std::unique_ptr<List> m_list{};
|
||||
|
||||
// options
|
||||
option::OptionLong m_sort{INI_SECTION, "sort", 0};
|
||||
|
||||
@@ -19,13 +19,12 @@ public:
|
||||
auto IsDone() const noexcept { return m_count == 0; }
|
||||
|
||||
private:
|
||||
void OnLayoutChange() override;
|
||||
void Draw(NVGcontext* vg, Theme* theme) override;
|
||||
|
||||
private:
|
||||
std::string m_text;
|
||||
std::string m_text{};
|
||||
std::size_t m_count{180}; // count down to zero
|
||||
Side m_side;
|
||||
Side m_side{};
|
||||
bool m_bounds_measured{};
|
||||
};
|
||||
|
||||
@@ -34,7 +33,6 @@ public:
|
||||
NotifMananger() = default;
|
||||
~NotifMananger() = default;
|
||||
|
||||
void OnLayoutChange() override;
|
||||
void Draw(NVGcontext* vg, Theme* theme) override;
|
||||
|
||||
void Push(const NotifEntry& entry);
|
||||
@@ -49,8 +47,8 @@ private:
|
||||
void Draw(NVGcontext* vg, Theme* theme, Entries& entries);
|
||||
|
||||
private:
|
||||
Entries m_entries_left;
|
||||
Entries m_entries_right;
|
||||
Entries m_entries_left{};
|
||||
Entries m_entries_right{};
|
||||
Mutex m_mutex{};
|
||||
};
|
||||
|
||||
|
||||
@@ -1,90 +1,41 @@
|
||||
#pragma once
|
||||
|
||||
#include "nanovg.h"
|
||||
#include "ui/widget.hpp"
|
||||
#include "ui/types.hpp"
|
||||
|
||||
namespace sphaira::ui::gfx {
|
||||
|
||||
enum class Colour {
|
||||
BLACK,
|
||||
LIGHT_BLACK,
|
||||
SILVER,
|
||||
DARK_GREY,
|
||||
GREY,
|
||||
WHITE,
|
||||
CYAN,
|
||||
TEAL,
|
||||
BLUE,
|
||||
LIGHT_BLUE,
|
||||
YELLOW,
|
||||
RED,
|
||||
};
|
||||
|
||||
void drawImage(NVGcontext*, float x, float y, float w, float h, int texture);
|
||||
void drawImage(NVGcontext*, Vec4 v, int texture);
|
||||
void drawImage(NVGcontext*, const Vec4& v, int texture);
|
||||
void drawImageRounded(NVGcontext*, float x, float y, float w, float h, int texture);
|
||||
void drawImageRounded(NVGcontext*, Vec4 v, int texture);
|
||||
|
||||
auto getColour(Colour c) -> NVGcolor;
|
||||
void drawImageRounded(NVGcontext*, const Vec4& v, int texture);
|
||||
|
||||
void dimBackground(NVGcontext*);
|
||||
|
||||
void drawRect(NVGcontext*, float x, float y, float w, float h, Colour c, bool rounded = false);
|
||||
void drawRect(NVGcontext*, Vec4 vec, Colour c, bool rounded = false);
|
||||
void drawRect(NVGcontext*, float x, float y, float w, float h, const NVGcolor& c, bool rounded = false);
|
||||
void drawRect(NVGcontext*, float x, float y, float w, float h, const NVGcolor&& c, bool rounded = false);
|
||||
void drawRect(NVGcontext*, Vec4 vec, const NVGcolor& c, bool rounded = false);
|
||||
void drawRect(NVGcontext*, Vec4 vec, const NVGcolor&& c, bool rounded = false);
|
||||
void drawRect(NVGcontext*, const Vec4& v, const NVGcolor& c, bool rounded = false);
|
||||
void drawRect(NVGcontext*, float x, float y, float w, float h, const NVGpaint& p, bool rounded = false);
|
||||
void drawRect(NVGcontext*, float x, float y, float w, float h, const NVGpaint&& p, bool rounded = false);
|
||||
void drawRect(NVGcontext*, Vec4 vec, const NVGpaint& p, bool rounded = false);
|
||||
void drawRect(NVGcontext*, Vec4 vec, const NVGpaint&& p, bool rounded = false);
|
||||
void drawRect(NVGcontext*, const Vec4& v, const NVGpaint& p, bool rounded = false);
|
||||
|
||||
void drawRectOutline(NVGcontext*, float size, const NVGcolor& out_col, float x, float y, float w, float h, Colour c);
|
||||
void drawRectOutline(NVGcontext*, float size, const NVGcolor& out_col, Vec4 vec, Colour c);
|
||||
void drawRectOutline(NVGcontext*, float size, const NVGcolor& out_col, float x, float y, float w, float h, const NVGcolor& c);
|
||||
void drawRectOutline(NVGcontext*, float size, const NVGcolor& out_col, float x, float y, float w, float h, const NVGcolor&& c);
|
||||
void drawRectOutline(NVGcontext*, float size, const NVGcolor& out_col, Vec4 vec, const NVGcolor& c);
|
||||
void drawRectOutline(NVGcontext*, float size, const NVGcolor& out_col, Vec4 vec, const NVGcolor&& c);
|
||||
void drawRectOutline(NVGcontext*, float size, const NVGcolor& out_col, float x, float y, float w, float h, const NVGpaint& p);
|
||||
void drawRectOutline(NVGcontext*, float size, const NVGcolor& out_col, float x, float y, float w, float h, const NVGpaint&& p);
|
||||
void drawRectOutline(NVGcontext*, float size, const NVGcolor& out_col, Vec4 vec, const NVGpaint& p);
|
||||
void drawRectOutline(NVGcontext*, float size, const NVGcolor& out_col, Vec4 vec, const NVGpaint&& p);
|
||||
void drawRectOutline(NVGcontext*, const Theme*, float size, float x, float y, float w, float h);
|
||||
void drawRectOutline(NVGcontext*, const Theme*, float size, const Vec4& v);
|
||||
|
||||
void drawTriangle(NVGcontext*, float aX, float aY, float bX, float bY, float cX, float cY, Colour c);
|
||||
void drawTriangle(NVGcontext*, float aX, float aY, float bX, float bY, float cX, float cY, const NVGcolor& c);
|
||||
void drawTriangle(NVGcontext*, float aX, float aY, float bX, float bY, float cX, float cY, const NVGcolor&& c);
|
||||
void drawTriangle(NVGcontext*, float aX, float aY, float bX, float bY, float cX, float cY, const NVGpaint& p);
|
||||
void drawTriangle(NVGcontext*, float aX, float aY, float bX, float bY, float cX, float cY, const NVGpaint&& p);
|
||||
|
||||
void drawText(NVGcontext*, float x, float y, float size, const char* str, const char* end, int align, Colour c);
|
||||
void drawText(NVGcontext*, float x, float y, float size, Colour c, const char* str, int align = NVG_ALIGN_LEFT | NVG_ALIGN_TOP, const char* end = nullptr);
|
||||
void drawText(NVGcontext*, Vec2 vec, float size, const char* str, const char* end, int align, Colour c);
|
||||
void drawText(NVGcontext*, Vec2 vec, float size, Colour c, const char* str, int align = NVG_ALIGN_LEFT | NVG_ALIGN_TOP, const char* end = nullptr);
|
||||
void drawText(NVGcontext*, float x, float y, float size, const char* str, const char* end, int align, const NVGcolor& c);
|
||||
void drawText(NVGcontext*, float x, float y, float size, const char* str, const char* end, int align, const NVGcolor&& c);
|
||||
void drawText(NVGcontext*, float x, float y, float size, const NVGcolor& c, const char* str, int align = NVG_ALIGN_LEFT | NVG_ALIGN_TOP, const char* end = nullptr);
|
||||
void drawText(NVGcontext*, float x, float y, float size, const NVGcolor&& c, const char* str, int align = NVG_ALIGN_LEFT | NVG_ALIGN_TOP, const char* end = nullptr);
|
||||
void drawText(NVGcontext*, Vec2 vec, float size, const char* str, const char* end, int align, const NVGcolor& c);
|
||||
void drawText(NVGcontext*, Vec2 vec, float size, const char* str, const char* end, int align, const NVGcolor&& c);
|
||||
void drawText(NVGcontext*, Vec2 vec, float size, const NVGcolor& c, const char* str, int align = NVG_ALIGN_LEFT | NVG_ALIGN_TOP, const char* end = nullptr);
|
||||
void drawText(NVGcontext*, Vec2 vec, float size, const NVGcolor&& c, const char* str, int align = NVG_ALIGN_LEFT | NVG_ALIGN_TOP, const char* end = nullptr);
|
||||
void drawTextArgs(NVGcontext*, float x, float y, float size, int align, Colour c, const char* str, ...) __attribute__ ((format (printf, 7, 8)));
|
||||
void drawText(NVGcontext*, const Vec2& v, float size, const char* str, const char* end, int align, const NVGcolor& c);
|
||||
void drawText(NVGcontext*, const Vec2& v, float size, const NVGcolor& c, const char* str, int align = NVG_ALIGN_LEFT | NVG_ALIGN_TOP, const char* end = nullptr);
|
||||
void drawTextArgs(NVGcontext*, float x, float y, float size, int align, const NVGcolor& c, const char* str, ...) __attribute__ ((format (printf, 7, 8)));
|
||||
|
||||
void drawTextBox(NVGcontext*, float x, float y, float size, float bound, NVGcolor& c, const char* str, int align = NVG_ALIGN_LEFT | NVG_ALIGN_TOP, const char* end = nullptr);
|
||||
void drawTextBox(NVGcontext*, float x, float y, float size, float bound, NVGcolor&& c, const char* str, int align = NVG_ALIGN_LEFT | NVG_ALIGN_TOP, const char* end = nullptr);
|
||||
void drawTextBox(NVGcontext*, float x, float y, float size, float bound, Colour c, const char* str, int align = NVG_ALIGN_LEFT | NVG_ALIGN_TOP, const char* end = nullptr);
|
||||
void drawTextBox(NVGcontext*, float x, float y, float size, float bound, const NVGcolor& c, const char* str, int align = NVG_ALIGN_LEFT | NVG_ALIGN_TOP, const char* end = nullptr);
|
||||
|
||||
void textBounds(NVGcontext*, float x, float y, float *bounds, const char* str, ...) __attribute__ ((format (printf, 5, 6)));
|
||||
// void textBounds(NVGcontext*, float *bounds, const char* str, ...) __attribute__ ((format (printf, 5, 6)));
|
||||
// void textBounds(NVGcontext*, float *bounds, const char* str);
|
||||
|
||||
auto getButton(Button button) -> const char*;
|
||||
void drawButton(NVGcontext* vg, float x, float y, float size, Button button);
|
||||
void drawButtons(NVGcontext* vg, const Widget::Actions& actions, const NVGcolor& c, float start_x = 1220.f);
|
||||
void drawScrollbar(NVGcontext*, const Theme*, u32 index_off, u32 count, u32 max_per_page);
|
||||
void drawScrollbar(NVGcontext*, const Theme*, float x, float y, float h, u32 index_off, u32 count, u32 max_per_page);
|
||||
|
||||
void drawDimBackground(NVGcontext* vg);
|
||||
void drawScrollbar2(NVGcontext*, const Theme*, float x, float y, float h, s64 index_off, s64 count, s64 row, s64 page);
|
||||
void drawScrollbar2(NVGcontext*, const Theme*, s64 index_off, s64 count, s64 row, s64 page);
|
||||
|
||||
void updateHighlightAnimation();
|
||||
void getHighlightAnimation(float* gradientX, float* gradientY, float* color);
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
#include "types.hpp"
|
||||
#include <stop_token>
|
||||
|
||||
namespace sphaira::ui {
|
||||
|
||||
class Object {
|
||||
public:
|
||||
Object() = default;
|
||||
virtual ~Object() = default;
|
||||
virtual ~Object() {
|
||||
m_stop_source.request_stop();
|
||||
}
|
||||
|
||||
// virtual auto OnLayoutChange() -> void = 0;
|
||||
virtual auto OnLayoutChange() -> void {};
|
||||
virtual auto Draw(NVGcontext* vg, Theme* theme) -> void = 0;
|
||||
|
||||
auto GetPos() const noexcept {
|
||||
@@ -73,8 +74,14 @@ public:
|
||||
m_hidden = value;
|
||||
}
|
||||
|
||||
auto GetToken() const {
|
||||
return m_stop_source.get_token();
|
||||
}
|
||||
|
||||
protected:
|
||||
Vec4 m_pos{};
|
||||
// used for lifetime management across threads.
|
||||
std::stop_source m_stop_source{};
|
||||
bool m_hidden{false};
|
||||
};
|
||||
|
||||
|
||||
@@ -12,14 +12,13 @@ public:
|
||||
OptionBoxEntry(const std::string& text, Vec4 pos);
|
||||
|
||||
auto Update(Controller* controller, TouchInfo* touch) -> void override {}
|
||||
auto OnLayoutChange() -> void override {}
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
|
||||
auto Selected(bool enable) -> void;
|
||||
private:
|
||||
|
||||
private:
|
||||
std::string m_text;
|
||||
std::string m_text{};
|
||||
Vec2 m_text_pos{};
|
||||
bool m_selected{false};
|
||||
};
|
||||
@@ -28,32 +27,34 @@ private:
|
||||
// todo: support upto 4 options.
|
||||
class OptionBox final : public Widget {
|
||||
public:
|
||||
using Callback = std::function<void(std::optional<std::size_t> index)>;
|
||||
using Callback = std::function<void(std::optional<s64> index)>;
|
||||
using Option = std::string;
|
||||
using Options = std::vector<Option>;
|
||||
|
||||
public:
|
||||
OptionBox(const std::string& message, const Option& a, Callback cb); // confirm
|
||||
OptionBox(const std::string& message, const Option& a, Callback cb = [](auto){}); // confirm
|
||||
OptionBox(const std::string& message, const Option& a, const Option& b, Callback cb); // yesno
|
||||
OptionBox(const std::string& message, const Option& a, const Option& b, std::size_t index, Callback cb); // yesno
|
||||
OptionBox(const std::string& message, const Option& a, const Option& b, s64 index, Callback cb); // yesno
|
||||
OptionBox(const std::string& message, const Option& a, const Option& b, const Option& c, Callback cb); // tri
|
||||
OptionBox(const std::string& message, const Option& a, const Option& b, const Option& c, std::size_t index, Callback cb); // tri
|
||||
OptionBox(const std::string& message, const Option& a, const Option& b, const Option& c, s64 index, Callback cb); // tri
|
||||
|
||||
auto Update(Controller* controller, TouchInfo* touch) -> void override;
|
||||
auto OnLayoutChange() -> void override;
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
auto OnFocusGained() noexcept -> void override;
|
||||
auto OnFocusLost() noexcept -> void override;
|
||||
|
||||
private:
|
||||
auto Setup(std::size_t index) -> void; // common setup values
|
||||
auto Setup(s64 index) -> void; // common setup values
|
||||
void SetIndex(s64 index);
|
||||
|
||||
private:
|
||||
std::string m_message;
|
||||
Callback m_callback;
|
||||
std::string m_message{};
|
||||
Callback m_callback{};
|
||||
|
||||
Vec4 m_spacer_line{};
|
||||
|
||||
std::size_t m_index{};
|
||||
std::vector<OptionBoxEntry> m_entries;
|
||||
s64 m_index{};
|
||||
std::vector<OptionBoxEntry> m_entries{};
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "ui/widget.hpp"
|
||||
#include <optional>
|
||||
|
||||
namespace sphaira::ui {
|
||||
|
||||
class OptionList final : public Widget {
|
||||
public:
|
||||
using Options = std::vector<std::pair<std::string, std::function<void()>>>;
|
||||
|
||||
public:
|
||||
OptionList(Options _options);
|
||||
|
||||
auto Update(Controller* controller, TouchInfo* touch) -> void override;
|
||||
auto OnLayoutChange() -> void override;
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
|
||||
protected:
|
||||
Options m_options;
|
||||
std::size_t m_index{};
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "ui/widget.hpp"
|
||||
#include "ui/scrollbar.hpp"
|
||||
#include "ui/list.hpp"
|
||||
#include <optional>
|
||||
|
||||
namespace sphaira::ui {
|
||||
@@ -9,18 +9,22 @@ namespace sphaira::ui {
|
||||
class PopupList final : public Widget {
|
||||
public:
|
||||
using Items = std::vector<std::string>;
|
||||
using Callback = std::function<void(std::optional<std::size_t>)>;
|
||||
using Callback = std::function<void(std::optional<s64>)>;
|
||||
|
||||
public:
|
||||
explicit PopupList(std::string title, Items items, Callback cb, std::size_t index = 0);
|
||||
explicit PopupList(std::string title, Items items, Callback cb, s64 index = 0);
|
||||
PopupList(std::string title, Items items, Callback cb, std::string index);
|
||||
PopupList(std::string title, Items items, std::string& index_str_ref, std::size_t& index);
|
||||
PopupList(std::string title, Items items, std::string& index_str_ref, s64& index);
|
||||
PopupList(std::string title, Items items, std::string& index_ref);
|
||||
PopupList(std::string title, Items items, std::size_t& index_ref);
|
||||
PopupList(std::string title, Items items, s64& index_ref);
|
||||
|
||||
auto Update(Controller* controller, TouchInfo* touch) -> void override;
|
||||
auto OnLayoutChange() -> void override;
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
auto OnFocusGained() noexcept -> void override;
|
||||
auto OnFocusLost() noexcept -> void override;
|
||||
|
||||
private:
|
||||
void SetIndex(s64 index);
|
||||
|
||||
private:
|
||||
static constexpr Vec2 m_title_pos{70.f, 28.f};
|
||||
@@ -28,20 +32,16 @@ private:
|
||||
static constexpr float m_text_xoffset{15.f};
|
||||
static constexpr float m_line_width{1220.f};
|
||||
|
||||
std::string m_title;
|
||||
Items m_items;
|
||||
Callback m_callback;
|
||||
std::size_t m_index; // index in list array
|
||||
std::size_t m_index_offset{}; // drawing from array start
|
||||
std::string m_title{};
|
||||
Items m_items{};
|
||||
Callback m_callback{};
|
||||
s64 m_index{}; // index in list array
|
||||
|
||||
// std::size_t& index_ref;
|
||||
// std::string& index_str_ref;
|
||||
std::unique_ptr<List> m_list{};
|
||||
|
||||
float m_selected_y{};
|
||||
float m_yoff{};
|
||||
float m_line_top{};
|
||||
float m_line_bottom{};
|
||||
ScrollBar m_scrollbar;
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui
|
||||
|
||||
@@ -22,7 +22,7 @@ struct ProgressBox final : Widget {
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
|
||||
auto NewTransfer(const std::string& transfer) -> ProgressBox&;
|
||||
auto UpdateTransfer(u64 offset, u64 size) -> ProgressBox&;
|
||||
auto UpdateTransfer(s64 offset, s64 size) -> ProgressBox&;
|
||||
void RequestExit();
|
||||
auto ShouldExit() -> bool;
|
||||
|
||||
@@ -30,11 +30,21 @@ struct ProgressBox final : Widget {
|
||||
auto CopyFile(const fs::FsPath& src, const fs::FsPath& dst) -> Result;
|
||||
void Yield();
|
||||
|
||||
auto OnDownloadProgressCallback() {
|
||||
return [this](u32 dltotal, u32 dlnow, u32 ultotal, u32 ulnow){
|
||||
if (this->ShouldExit()) {
|
||||
return false;
|
||||
}
|
||||
this->UpdateTransfer(dlnow, dltotal);
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
public:
|
||||
struct ThreadData {
|
||||
ProgressBox* pbox;
|
||||
ProgressBoxCallback callback;
|
||||
bool result;
|
||||
ProgressBox* pbox{};
|
||||
ProgressBoxCallback callback{};
|
||||
bool result{};
|
||||
};
|
||||
|
||||
private:
|
||||
@@ -45,9 +55,8 @@ private:
|
||||
ProgressBoxDoneCallback m_done{};
|
||||
std::string m_title{};
|
||||
std::string m_transfer{};
|
||||
u64 m_size{};
|
||||
u64 m_offset{};
|
||||
bool m_exit_requested{};
|
||||
s64 m_size{};
|
||||
s64 m_offset{};
|
||||
};
|
||||
|
||||
// this is a helper function that does many things.
|
||||
|
||||
@@ -14,15 +14,15 @@ struct ScrollableText final : Widget {
|
||||
// float m_y_off = m_y_off_base;
|
||||
// static constexpr float m_clip_y = 250.0F;
|
||||
|
||||
static constexpr inline float m_step = 30;
|
||||
const float m_font_size;
|
||||
const float m_y_off_base;
|
||||
float m_y_off;
|
||||
const float m_clip_y;
|
||||
const float m_end_w;
|
||||
static constexpr float m_step = 30;
|
||||
|
||||
int m_index = 0;
|
||||
const float m_font_size;
|
||||
float m_bounds[4];
|
||||
float m_y_off{};
|
||||
int m_index{};
|
||||
float m_bounds[4]{};
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "ui/widget.hpp"
|
||||
|
||||
namespace sphaira::ui {
|
||||
|
||||
class ScrollBar final : public Widget {
|
||||
public:
|
||||
enum class Direction { DOWN, UP };
|
||||
|
||||
public:
|
||||
ScrollBar() = default;
|
||||
ScrollBar(Vec4 bounds, float entry_height, std::size_t entries);
|
||||
|
||||
auto Update(Controller* controller, TouchInfo* touch) -> void override {}
|
||||
auto OnLayoutChange() -> void override;
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
|
||||
auto Setup(Vec4 bounds, float entry_height, std::size_t entries) -> void;
|
||||
auto Move(Direction direction) -> void;
|
||||
|
||||
private:
|
||||
auto Setup() -> void;
|
||||
|
||||
private:
|
||||
Vec4 m_bounds{};
|
||||
std::size_t m_entries{};
|
||||
std::size_t m_index{};
|
||||
float m_entry_height{};
|
||||
float m_step_size{};
|
||||
bool m_should_draw{false};
|
||||
};
|
||||
|
||||
} // namespace sphaira::ui
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "ui/widget.hpp"
|
||||
#include "ui/list.hpp"
|
||||
#include <memory>
|
||||
|
||||
namespace sphaira::ui {
|
||||
@@ -9,11 +10,9 @@ class SidebarEntryBase : public Widget {
|
||||
public:
|
||||
SidebarEntryBase(std::string&& title);
|
||||
virtual auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
virtual auto OnLayoutChange() -> void override {}
|
||||
|
||||
protected:
|
||||
std::string m_title;
|
||||
Vec2 m_offset{};
|
||||
};
|
||||
|
||||
class SidebarEntryBool final : public SidebarEntryBase {
|
||||
@@ -24,9 +23,9 @@ public:
|
||||
SidebarEntryBool(std::string title, bool option, Callback cb, std::string true_str = "On", std::string false_str = "Off");
|
||||
SidebarEntryBool(std::string title, bool& option, std::string true_str = "On", std::string false_str = "Off");
|
||||
|
||||
private:
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
|
||||
private:
|
||||
bool m_option;
|
||||
Callback m_callback;
|
||||
std::string m_true_str;
|
||||
@@ -50,20 +49,24 @@ class SidebarEntryArray final : public SidebarEntryBase {
|
||||
public:
|
||||
using Items = std::vector<std::string>;
|
||||
using ListCallback = std::function<void()>;
|
||||
using Callback = std::function<void(std::size_t& index)>;
|
||||
using Callback = std::function<void(s64& index)>;
|
||||
|
||||
public:
|
||||
explicit SidebarEntryArray(std::string title, Items items, Callback cb, std::size_t index = 0);
|
||||
explicit SidebarEntryArray(std::string title, Items items, Callback cb, s64 index = 0);
|
||||
SidebarEntryArray(std::string title, Items items, Callback cb, std::string index);
|
||||
SidebarEntryArray(std::string title, Items items, std::string& index);
|
||||
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
auto OnFocusGained() noexcept -> void override;
|
||||
auto OnFocusLost() noexcept -> void override;
|
||||
|
||||
private:
|
||||
Items m_items;
|
||||
ListCallback m_list_callback;
|
||||
Callback m_callback;
|
||||
std::size_t m_index;
|
||||
s64 m_index;
|
||||
s64 m_tick{};
|
||||
float m_text_yoff{};
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
@@ -101,33 +104,30 @@ public:
|
||||
Sidebar(std::string title, std::string sub, Side side);
|
||||
|
||||
auto Update(Controller* controller, TouchInfo* touch) -> void override;
|
||||
auto OnLayoutChange() -> void override {}
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
auto OnFocusGained() noexcept -> void override;
|
||||
auto OnFocusLost() noexcept -> void override;
|
||||
|
||||
void Add(std::shared_ptr<SidebarEntryBase> entry);
|
||||
void AddSpacer();
|
||||
void AddHeader(std::string name);
|
||||
|
||||
private:
|
||||
void SetIndex(std::size_t index);
|
||||
void SetIndex(s64 index);
|
||||
void SetupButtons();
|
||||
|
||||
private:
|
||||
std::string m_title;
|
||||
std::string m_sub;
|
||||
Side m_side;
|
||||
Items m_items;
|
||||
std::size_t m_index{};
|
||||
std::size_t m_index_offset{};
|
||||
s64 m_index{};
|
||||
|
||||
std::unique_ptr<List> m_list;
|
||||
|
||||
Vec4 m_top_bar{};
|
||||
Vec4 m_bottom_bar{};
|
||||
Vec2 m_title_pos{};
|
||||
Vec4 m_base_pos{};
|
||||
|
||||
float m_selected_y{};
|
||||
|
||||
static constexpr float m_title_size{28.f};
|
||||
// static constexpr Vec2 box_size{380.f, 70.f};
|
||||
static constexpr Vec2 m_box_size{400.f, 70.f};
|
||||
|
||||
@@ -114,15 +114,34 @@ struct [[nodiscard]] Vec4 {
|
||||
|
||||
struct TimeStamp {
|
||||
TimeStamp() {
|
||||
Update();
|
||||
}
|
||||
|
||||
void Update() {
|
||||
start = armGetSystemTick();
|
||||
}
|
||||
|
||||
auto GetNs() -> u64 {
|
||||
auto GetNs() const -> u64 {
|
||||
const auto end_ticks = armGetSystemTick();
|
||||
return armTicksToNs(end_ticks) - armTicksToNs(start);
|
||||
}
|
||||
|
||||
auto GetSeconds() -> double {
|
||||
auto GetMs() const -> u64 {
|
||||
const auto ns = GetNs();
|
||||
return ns/1000/1000;
|
||||
}
|
||||
|
||||
auto GetSeconds() const -> u64 {
|
||||
const auto ns = GetNs();
|
||||
return ns/1000/1000/1000;
|
||||
}
|
||||
|
||||
auto GetMsD() const -> double {
|
||||
const double ns = GetNs();
|
||||
return ns/1000.0/1000.0;
|
||||
}
|
||||
|
||||
auto GetSecondsD() const -> double {
|
||||
const double ns = GetNs();
|
||||
return ns/1000.0/1000.0/1000.0;
|
||||
}
|
||||
@@ -143,23 +162,55 @@ struct ElementEntry {
|
||||
};
|
||||
|
||||
enum ThemeEntryID {
|
||||
// colour of the background, can be an image.
|
||||
ThemeEntryID_BACKGROUND,
|
||||
ThemeEntryID_LOGO,
|
||||
|
||||
// colour of the grid background (homebrew, appstore), can be an image.
|
||||
ThemeEntryID_GRID,
|
||||
ThemeEntryID_GRID_HOVER,
|
||||
ThemeEntryID_SELECTED,
|
||||
ThemeEntryID_SELECTED_OVERLAY,
|
||||
ThemeEntryID_TEXT,
|
||||
ThemeEntryID_TEXT_SELECTED,
|
||||
// background colour of a popup.
|
||||
ThemeEntryID_POPUP,
|
||||
// colour of the error text / button.
|
||||
ThemeEntryID_ERROR,
|
||||
|
||||
// colour of all text.
|
||||
ThemeEntryID_TEXT,
|
||||
// colour of text info and subheaders.
|
||||
ThemeEntryID_TEXT_INFO,
|
||||
// colour of selected item text.
|
||||
ThemeEntryID_TEXT_SELECTED,
|
||||
// background colour of a selected item, can be an image (not recommended).
|
||||
ThemeEntryID_SELECTED_BACKGROUND,
|
||||
|
||||
// colour of line separators in a list.
|
||||
ThemeEntryID_LINE,
|
||||
ThemeEntryID_LINE_SEPARATOR,
|
||||
|
||||
// colour of the sidebar backrgound.
|
||||
ThemeEntryID_SIDEBAR,
|
||||
|
||||
// colour of the scrollbar (full portion).
|
||||
ThemeEntryID_SCROLLBAR,
|
||||
// colour of the scrollbar background (empty portion).
|
||||
ThemeEntryID_SCROLLBAR_BACKGROUND,
|
||||
|
||||
// colour of the progressbar (full portion).
|
||||
ThemeEntryID_PROGRESSBAR,
|
||||
// colour of the progressbar background (empty portion).
|
||||
ThemeEntryID_PROGRESSBAR_BACKGROUND,
|
||||
|
||||
// the colours of the pulsing effect, from 1 -> 2.
|
||||
ThemeEntryID_HIGHLIGHT_1,
|
||||
ThemeEntryID_HIGHLIGHT_2,
|
||||
|
||||
// changes the colours of the internal icons used below.
|
||||
ThemeEntryID_ICON_COLOUR,
|
||||
|
||||
// images used in the filebrowser.
|
||||
ThemeEntryID_ICON_AUDIO,
|
||||
ThemeEntryID_ICON_VIDEO,
|
||||
ThemeEntryID_ICON_IMAGE,
|
||||
ThemeEntryID_ICON_FILE,
|
||||
ThemeEntryID_ICON_FOLDER,
|
||||
ThemeEntryID_ICON_ZIP,
|
||||
ThemeEntryID_ICON_GAME,
|
||||
ThemeEntryID_ICON_NRO,
|
||||
|
||||
ThemeEntryID_MAX,
|
||||
@@ -169,49 +220,43 @@ struct ThemeMeta {
|
||||
std::string name;
|
||||
std::string author;
|
||||
std::string version;
|
||||
std::string ini_path;
|
||||
fs::FsPath inherit;
|
||||
fs::FsPath ini_path;
|
||||
};
|
||||
|
||||
struct Theme {
|
||||
std::string name;
|
||||
std::string author;
|
||||
std::string version;
|
||||
fs::FsPath path;
|
||||
ThemeMeta meta;
|
||||
PLSR_BFSTM music;
|
||||
ElementEntry elements[ThemeEntryID_MAX];
|
||||
|
||||
// NVGcolor background; // bg
|
||||
// NVGcolor lines; // grid lines
|
||||
// NVGcolor spacer; // lines in popup box
|
||||
// NVGcolor text; // text colour
|
||||
// NVGcolor text_info; // description text
|
||||
NVGcolor selected; // selected colours
|
||||
// NVGcolor overlay; // popup overlay colour
|
||||
|
||||
// void DrawElement(float x, float y, float w, float h, ThemeEntryID id);
|
||||
auto GetColour(ThemeEntryID id) const {
|
||||
return elements[id].colour;
|
||||
}
|
||||
};
|
||||
|
||||
enum class TouchState {
|
||||
Start, // set when touch has started
|
||||
Touching, // set when touch is held longer than 1 frame
|
||||
Stop, // set after touch is released
|
||||
None, // set when there is no touch
|
||||
};
|
||||
// enum class TouchGesture {
|
||||
// None,
|
||||
// Tap,
|
||||
// Scroll,
|
||||
// };
|
||||
|
||||
struct TouchInfo {
|
||||
s32 initial_x;
|
||||
s32 initial_y;
|
||||
HidTouchState initial;
|
||||
HidTouchState cur;
|
||||
|
||||
s32 cur_x;
|
||||
s32 cur_y;
|
||||
auto in_range(const Vec4& v) const -> bool {
|
||||
return cur.x >= v.x && cur.x <= v.x + v.w && cur.y >= v.y && cur.y <= v.y + v.h;
|
||||
}
|
||||
|
||||
s32 prev_x;
|
||||
s32 prev_y;
|
||||
|
||||
u32 finger_id;
|
||||
auto in_range(s32 x, s32 y, s32 w, s32 h) const -> bool {
|
||||
return in_range(Vec4(x, y, w, h));
|
||||
}
|
||||
|
||||
bool is_touching;
|
||||
bool is_tap;
|
||||
bool is_scroll;
|
||||
bool is_clicked;
|
||||
bool is_end;
|
||||
};
|
||||
|
||||
enum class Button : u64 {
|
||||
@@ -278,37 +323,36 @@ inline ActionType operator|(ActionType a, ActionType b) {
|
||||
}
|
||||
|
||||
struct Action final {
|
||||
using CallbackEmpty = std::function<void()>;
|
||||
using CallbackWithBool = std::function<void(bool)>;
|
||||
using Callback = std::variant<
|
||||
std::function<void()>,
|
||||
std::function<void(bool)>
|
||||
CallbackEmpty,
|
||||
CallbackWithBool
|
||||
>;
|
||||
|
||||
Action(Callback cb) : m_type{ActionType::DOWN}, m_hint{""}, m_callback{cb}, m_hidden{true} {}
|
||||
Action(std::string hint, Callback cb) : m_type{ActionType::DOWN}, m_hint{hint}, m_callback{cb} {}
|
||||
Action(u8 type, Callback cb) : m_type{type}, m_hint{""}, m_callback{cb}, m_hidden{true} {}
|
||||
Action(u8 type, std::string hint, Callback cb) : m_type{type}, m_hint{hint}, m_callback{cb} {}
|
||||
Action(Callback cb) : Action{ActionType::DOWN, "", cb} {}
|
||||
Action(std::string hint, Callback cb) : Action{ActionType::DOWN, hint, cb} {}
|
||||
Action(u8 type, Callback cb) : Action{type, "", cb} {}
|
||||
Action(u8 type, std::string hint, Callback cb) : m_type{type}, m_callback{cb}, m_hint{hint} {}
|
||||
|
||||
auto IsHidden() const noexcept { return m_hidden; }
|
||||
auto IsHidden() const noexcept { return m_hint.empty(); }
|
||||
|
||||
auto Invoke(bool down) const {
|
||||
// todo: make this a visit
|
||||
switch (m_callback.index()) {
|
||||
case 0:
|
||||
std::get<0>(m_callback)();
|
||||
break;
|
||||
case 1:
|
||||
std::get<1>(m_callback)(down);
|
||||
break;
|
||||
}
|
||||
// std::visit([down, this](auto& cb){
|
||||
// cb(down);
|
||||
// }), m_callback;
|
||||
std::visit([down](auto&& arg){
|
||||
using T = std::decay_t<decltype(arg)>;
|
||||
if constexpr(std::is_same_v<T, CallbackEmpty>) {
|
||||
arg();
|
||||
} else if constexpr(std::is_same_v<T, CallbackWithBool>) {
|
||||
arg(down);
|
||||
} else {
|
||||
static_assert(false, "non-exhaustive visitor!");
|
||||
}
|
||||
}, m_callback);
|
||||
}
|
||||
|
||||
u8 m_type;
|
||||
std::string m_hint; // todo: make optional
|
||||
Callback m_callback;
|
||||
bool m_hidden{false}; // replace this optional text
|
||||
u8 m_type{};
|
||||
Callback m_callback{};
|
||||
std::string m_hint{};
|
||||
};
|
||||
|
||||
struct Controller {
|
||||
@@ -342,7 +386,7 @@ struct Controller {
|
||||
m_kup = 0;
|
||||
}
|
||||
|
||||
void UpdateButtonHeld(HidNpadButton buttons) {
|
||||
void UpdateButtonHeld(u64 buttons) {
|
||||
if (m_kdown & buttons) {
|
||||
m_step = 50;
|
||||
m_counter = 0;
|
||||
@@ -350,7 +394,7 @@ struct Controller {
|
||||
m_counter += m_step;
|
||||
|
||||
if (m_counter >= m_MAX) {
|
||||
m_kdown |= buttons;
|
||||
m_kdown |= m_kheld & buttons;
|
||||
m_counter = 0;
|
||||
m_step = std::min(m_step + 50, m_MAX_STEP);
|
||||
}
|
||||
|
||||
@@ -8,7 +8,20 @@
|
||||
|
||||
namespace sphaira::ui {
|
||||
|
||||
struct uiButton final : Object {
|
||||
uiButton(Button button, Action action) : m_button{button}, m_action{action} {}
|
||||
auto Draw(NVGcontext* vg, Theme* theme) -> void override;
|
||||
|
||||
Button m_button;
|
||||
Action m_action;
|
||||
Vec4 m_button_pos{};
|
||||
Vec4 m_hint_pos{};
|
||||
};
|
||||
|
||||
struct Widget : public Object {
|
||||
using Actions = std::map<Button, Action>;
|
||||
using uiButtons = std::vector<uiButton>;
|
||||
|
||||
virtual ~Widget() = default;
|
||||
|
||||
virtual void Update(Controller* controller, TouchInfo* touch);
|
||||
@@ -26,14 +39,8 @@ struct Widget : public Object {
|
||||
return m_focus;
|
||||
}
|
||||
|
||||
// void PushWidget(std::shared_ptr<Widget> widget);
|
||||
// void PopWidget();
|
||||
|
||||
void SetParent(Widget* parent) {
|
||||
m_parent = parent;
|
||||
}
|
||||
auto GetParent() -> Widget* {
|
||||
return m_parent;
|
||||
virtual auto IsMenu() const -> bool {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto HasAction(Button button) const -> bool;
|
||||
@@ -55,6 +62,8 @@ struct Widget : public Object {
|
||||
m_actions.clear();
|
||||
}
|
||||
|
||||
auto FireAction(Button button, u8 type = ActionType::DOWN) -> bool;
|
||||
|
||||
void SetPop(bool pop = true) {
|
||||
m_pop = pop;
|
||||
}
|
||||
@@ -63,11 +72,14 @@ struct Widget : public Object {
|
||||
return m_pop;
|
||||
}
|
||||
|
||||
using Actions = std::map<Button, Action>;
|
||||
// using Actions = std::unordered_map<Button, Action>;
|
||||
Actions m_actions;
|
||||
Widget* m_parent{};
|
||||
// std::vector<std::shared_ptr<Widget>> widgets;
|
||||
auto SetUiButtonPos(Vec2 pos) {
|
||||
m_button_pos = pos;
|
||||
}
|
||||
|
||||
auto GetUiButtons() const -> uiButtons;
|
||||
|
||||
Actions m_actions{};
|
||||
Vec2 m_button_pos{1220, 675};
|
||||
bool m_focus{false};
|
||||
bool m_pop{false};
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user