Compare commits
117 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b4e81c935 | ||
|
|
e243d5b64e | ||
|
|
252cd0cee6 | ||
|
|
14abcc50b5 | ||
|
|
134aadad5a | ||
|
|
a56bc9e4fa | ||
|
|
5bd466a9b6 | ||
|
|
16c58512ec | ||
|
|
b1b0b13f2a | ||
|
|
03e77faf06 | ||
|
|
7e381924ab | ||
|
|
5763610e54 | ||
|
|
49956a3f84 | ||
|
|
b2915a8142 | ||
|
|
e002aa9ec2 | ||
|
|
0aaf460dbf | ||
|
|
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 |
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']
|
||||
10
.github/workflows/build_presets.yml
vendored
@@ -1,10 +1,6 @@
|
||||
name: build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
branches: [ "master" ]
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -12,7 +8,7 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
preset: [Release, RelWithDebInfo, MinSizeRel, Debug]
|
||||
preset: [MinSizeRel]
|
||||
runs-on: ${{ matrix.os }}
|
||||
container: devkitpro/devkita64:latest
|
||||
|
||||
@@ -24,7 +20,7 @@ jobs:
|
||||
|
||||
- name: Configure CMake
|
||||
run: |
|
||||
cmake --preset ${{ matrix.preset }}
|
||||
cmake --preset ${{ matrix.preset }} -DUSE_VFS_GC=0
|
||||
|
||||
- name: Build
|
||||
run: cmake --build --preset ${{ matrix.preset }} --parallel 4
|
||||
|
||||
@@ -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)
|
||||
|
||||
46
README.md
@@ -1,12 +1,12 @@
|
||||
# sphaira
|
||||
# Sphaira
|
||||
|
||||
A homebrew menu for the switch.
|
||||
A homebrew menu for the Nintendo 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/).
|
||||
|
||||
[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
|
||||
## Showcase
|
||||
|
||||
| | |
|
||||
:-------------------------:|:-------------------------:
|
||||
@@ -15,20 +15,29 @@ It was built for my usage, as such, features that may seem out of place are incl
|
||||
 | 
|
||||
 | 
|
||||
|
||||
## bug reports
|
||||
## Bug reports
|
||||
|
||||
for any bug reports, please use the issues tab and explain in as much detail as possible!
|
||||
For any bug reports, please use the issues tab and explain in as much detail as possible!
|
||||
|
||||
please include:
|
||||
Please include:
|
||||
|
||||
- CFW type (i assume Atmosphere, but someone out there is still using Rajnx)
|
||||
- CFW version
|
||||
- FW version
|
||||
- The bug itself and how to reproduce it
|
||||
- CFW type (i assume Atmosphere, but someone out there is still using Rajnx);
|
||||
- CFW version;
|
||||
- FW version;
|
||||
- The bug itself and how to reproduce it.
|
||||
|
||||
## file assoc
|
||||
## FTP
|
||||
|
||||
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.
|
||||
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 association
|
||||
|
||||
Sphaira has file association support. Let's say your app supports loading .png files, then you could write an association 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.
|
||||
|
||||
```ini
|
||||
[config]
|
||||
@@ -36,9 +45,9 @@ path=/switch/your_app.nro
|
||||
supported_extensions=jpg|png|mp4|mp3
|
||||
```
|
||||
|
||||
the `path` field is optional. if left out, it will use the name of the ini to find the nro. For example, if the ini is called mgba.ini, it will try to find the nro in /switch/mgba.nro and /switch/folder/mgba.nro.
|
||||
The `path` field is optional. If left out, it will use the name of the ini to find the nro. For example, if the ini is called mgba.ini, it will try to find the nro in /switch/mgba.nro and /switch/folder/mgba.nro.
|
||||
|
||||
see `assets/romfs/assoc/` for more examples of file assoc entries
|
||||
See `assets/romfs/assoc/` for more examples of file assoc entries.
|
||||
|
||||
## Credits
|
||||
|
||||
@@ -50,6 +59,7 @@ see `assets/romfs/assoc/` for more examples of file assoc entries
|
||||
- deko3d-nanovg
|
||||
- libpulsar
|
||||
- minIni
|
||||
- gbatemp
|
||||
- GBATemp
|
||||
- hb-appstore
|
||||
- everyone who has contributed to this project!
|
||||
- haze
|
||||
- Everyone who has contributed to this project!
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"url": "https://github.com/ITotalJustice/ftpsrv",
|
||||
"assets": [
|
||||
{
|
||||
"name": "switch"
|
||||
}
|
||||
]
|
||||
}
|
||||
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
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"url": "https://github.com/ITotalJustice/untitled"
|
||||
}
|
||||
@@ -1,114 +1,257 @@
|
||||
{
|
||||
"Launch": "Start",
|
||||
"[Applet Mode]": "[Applet-Modus]",
|
||||
"No Internet": "Keine Internetverbindung",
|
||||
"Files": "Dateien",
|
||||
"Apps": "Apps",
|
||||
"Store": "Store",
|
||||
"Menu": "Menü",
|
||||
"Options": "Optionen",
|
||||
"Homebrew Options": "Homebrew-Optionen",
|
||||
"Sort By": "Sortieren nach",
|
||||
"Sort Options": "Sortieroptionen",
|
||||
"Updated": "Aktualisiert",
|
||||
"Size": "Größe",
|
||||
"Alphabetical": "Alphabetisch",
|
||||
"Decending": "Absteigend",
|
||||
"Ascending": "Aufsteigend",
|
||||
"Sort": "Sortieren",
|
||||
"Order": "Befehl",
|
||||
"Info": "Info",
|
||||
"Delete": "Löschen",
|
||||
"Hide Sphaira": "Sphaira verstecken",
|
||||
"Are you sure you want to delete ": "Mit dem Löschvorgang fortfahren?",
|
||||
"Install Forwarder": "Forwarder installieren",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ACHTUNG: Die Installation von Forwardern führt zu einem Ban!",
|
||||
"OK": "OK",
|
||||
"Back": "Zurück",
|
||||
"Install": "Installieren",
|
||||
"Fs": "Fs",
|
||||
"App": "App",
|
||||
"Menu": "Menu",
|
||||
"Homebrew": "Homebrew",
|
||||
"FileBrowser": "DateiBrowser",
|
||||
"Select": "Auswählen",
|
||||
"Open": "Öffnen",
|
||||
"Theme Options": "Themenoptionen",
|
||||
"Select Theme": "Wählen Sie Theme aus",
|
||||
"Shuffle": "Shuffle",
|
||||
"Music": "Musik",
|
||||
"Show Hidden": "Versteckte anzeigen",
|
||||
"Folders First": "Ordner zuerst",
|
||||
"Hidden Last": "Zuletzt versteckt",
|
||||
"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",
|
||||
"Network Options": "Netzwerkoptionen",
|
||||
"Enabled": "Aktiviert",
|
||||
"Disabled": "Deaktiviert",
|
||||
|
||||
"Sort By": "Sortieren nach",
|
||||
"Sort Options": "Sortieroptionen",
|
||||
"Filter": "Filter",
|
||||
"Sort": "Sortieren",
|
||||
"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",
|
||||
"12 Hour Time": "",
|
||||
"Network": "Netzwerk",
|
||||
"Network Options": "Netzwerk-Optionen",
|
||||
"Ftp": "FTP",
|
||||
"Mtp": "MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Check for update": "Nach Updates suchen",
|
||||
"File Options": "Dateioptionen",
|
||||
"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",
|
||||
"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 (unfertig)",
|
||||
"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": "Erweitert",
|
||||
"Tools": "Tools",
|
||||
"Themes": "Themes",
|
||||
"Legacy": "Legacy",
|
||||
"Misc": "Sonstiges",
|
||||
"Downloads": "Downloads",
|
||||
"Filter": "Filter",
|
||||
"Search": "Suchen",
|
||||
"Menu Options": "Menüoptionen",
|
||||
"Header": "Header",
|
||||
"Theme": "Theme",
|
||||
"Network": "Netzwerk",
|
||||
"Logging": "Logging",
|
||||
"Enabled": "Aktiviert",
|
||||
"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 ",
|
||||
"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": "Controller",
|
||||
"Rotation": "Drehung",
|
||||
"Colour": "Farbe",
|
||||
"Light Target": "Leichtes Ziel",
|
||||
"Gain": "Gain",
|
||||
"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",
|
||||
"Load Default": "Standardoptionen laden",
|
||||
"No Internet": "Kein Internet",
|
||||
"[Applet Mode]": "[Applet-Modus]",
|
||||
"Language": "Sprache"
|
||||
}
|
||||
"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",
|
||||
|
||||
"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?",
|
||||
"Audio disabled due to suspended game": "",
|
||||
"If this message appears repeatedly, please open an issue.": "Bei wiederholtem Auftreten bitte Issue erstellen."
|
||||
}
|
||||
@@ -1,114 +1,257 @@
|
||||
{
|
||||
"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",
|
||||
"12 Hour Time": "12 Hour Time",
|
||||
"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?",
|
||||
"Audio disabled due to suspended game": "Audio disabled due to suspended game",
|
||||
"If this message appears repeatedly, please open an issue.": "If this message appears repeatedly, please open an issue."
|
||||
}
|
||||
@@ -1,114 +1,257 @@
|
||||
{
|
||||
"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",
|
||||
"12 Hour Time": "",
|
||||
"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?",
|
||||
"Audio disabled due to suspended game": "",
|
||||
"If this message appears repeatedly, please open an issue.": "Si este mensaje aparece repetidamente, por favor abrir un 'issue'."
|
||||
}
|
||||
@@ -1,114 +1,257 @@
|
||||
{
|
||||
"Launch": "Exécuter",
|
||||
"[Applet Mode]": "[Mode Applet]",
|
||||
"No Internet": "Pas d'Internet",
|
||||
"Files": "Fichiers",
|
||||
"Apps": "Applications",
|
||||
"Store": "Magasin",
|
||||
"Menu": "Menu",
|
||||
"Options": "Options",
|
||||
"Homebrew Options": "Options Homebrew",
|
||||
"OK": "OK",
|
||||
"Back": "Retour",
|
||||
"Select": "Sélectionner",
|
||||
"Open": "Ouvrir",
|
||||
"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",
|
||||
"Enabled": "Activé(e)",
|
||||
"Disabled": "Désactivé(e)",
|
||||
|
||||
"Sort By": "Tri Par",
|
||||
"Sort Options": "Options de Tri",
|
||||
"Updated": "Mis à jour",
|
||||
"Size": "Taille",
|
||||
"Alphabetical": "Alphabétique",
|
||||
"Decending": "Décroissant",
|
||||
"Ascending": "Croissant",
|
||||
"Filter": "Filtre",
|
||||
"Sort": "Tri",
|
||||
"Order": "Ordre",
|
||||
"Info": "Info.",
|
||||
"Delete": "Supprimer",
|
||||
"Hide Sphaira": "Masquer Sphaira",
|
||||
"Are you sure you want to delete ": "Êtes-vous sûr de vouloir supprimer ",
|
||||
"Install Forwarder": "Installer le Forwarder",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ATTENTION: L'installation de forwarders entraînera un ban!",
|
||||
"Back": "Retour",
|
||||
"Install": "Installer",
|
||||
"Fs": "Fs",
|
||||
"App": "App.",
|
||||
"Menu": "Menu",
|
||||
"Homebrew": "Homebrew",
|
||||
"FileBrowser": "Navigateur de Fichiers",
|
||||
"Open": "Ouvrir",
|
||||
"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",
|
||||
"12 Hour Time": "Temps sur 12 heures",
|
||||
"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",
|
||||
"Yes": "Oui",
|
||||
"No": "Non",
|
||||
"Network Options": "Options Réseau",
|
||||
"Nxlink": "Nxlink",
|
||||
"Check for update": "Vérification d'une mise à jour",
|
||||
"File Options": "Options de Fichier",
|
||||
"Cut": "Couper",
|
||||
"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",
|
||||
"View as text": "Afficher sous forme de texte",
|
||||
"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": "Legacy",
|
||||
"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": "Journalisation",
|
||||
"Enabled": "Activé(e)",
|
||||
"Disabled": "Désactivé(e)",
|
||||
"Replace hbmenu on exit": "Remplacer hbmenu en sortie",
|
||||
"Misc Options": "Options Diverses",
|
||||
"Themezer": "Themezer",
|
||||
"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 Suiv.",
|
||||
"Prev Page": "Page Préc.",
|
||||
"Ambient Noise Level: ": "Niveau De Bruit Ambiant: ",
|
||||
"Controller": "Contrôleur",
|
||||
"Pad ": "Manette ",
|
||||
" (Available)": " (Disponible)",
|
||||
" (Unsupported)": "Non supporté",
|
||||
" (Unconnected)": " (Non connectée)",
|
||||
"HandHeld": "Portable",
|
||||
" (Available)": " (Disponible)",
|
||||
"Rotation": "Rotation",
|
||||
"0 (Sideways)": "0 (Paysage)",
|
||||
"90 (Flat)": "90 (Portrait)",
|
||||
"180 (-Sideways)": "180 (-Paysage)",
|
||||
"270 (Upside down)": "270 (Inversé)",
|
||||
"Colour": "Couleur",
|
||||
"Grey": "Gris",
|
||||
"Ironbow": "Ironbow",
|
||||
"Green": "Vert",
|
||||
"Red": "Rouge",
|
||||
"Blue": "Bleu",
|
||||
"Light Target": "Luminosité",
|
||||
"All leds": "Toutes les LED",
|
||||
"Bright group": "Groupe lumineux",
|
||||
"Dim group": "Groupe sombre",
|
||||
"None": "Aucun",
|
||||
"Normal image": "Image normale",
|
||||
"Negative image": "Négatif",
|
||||
"320x240": "320x240",
|
||||
"160x120": "160x120",
|
||||
"80x60": "80x60",
|
||||
"40x30": "40x30",
|
||||
"20x15": "20x15",
|
||||
"Controller": "Contrôleur",
|
||||
"Rotation": "Rotation",
|
||||
"Colour": "Couleur",
|
||||
"Light Target": "Luminosité",
|
||||
"Gain": "Gain",
|
||||
"Negative Image": "Négatif",
|
||||
"Normal image": "Image normale",
|
||||
"Negative image": "Négatif",
|
||||
"Format": "Format",
|
||||
"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",
|
||||
"No Internet": "Pas d'Internet",
|
||||
"[Applet Mode]": "[Mode Applet]",
|
||||
"Language": "Langue"
|
||||
}
|
||||
|
||||
"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?",
|
||||
"Audio disabled due to suspended game": "Audio désactivé à cause d'un jeu suspendu",
|
||||
"If this message appears repeatedly, please open an issue.": "Si ce message apparait en boucle veuillez ouvrir une issue."
|
||||
}
|
||||
@@ -1,114 +1,257 @@
|
||||
{
|
||||
"Launch": "Lancia",
|
||||
"[Applet Mode]": "[Modalità applet]",
|
||||
"No Internet": "Niente Internet",
|
||||
"Files": "File",
|
||||
"Apps": "App",
|
||||
"Store": "Store",
|
||||
"Menu": "Menu",
|
||||
"Options": "Opzioni",
|
||||
"Homebrew Options": "Opzioni Homebrew",
|
||||
"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",
|
||||
"Updated": "Aggiornato",
|
||||
"Size": "Misurare",
|
||||
"Alphabetical": "Alfabetico",
|
||||
"Decending": "Decrescente",
|
||||
"Ascending": "Crescente",
|
||||
"Filter": "Filtro",
|
||||
"Sort": "Riordina",
|
||||
"Order": "Ordina",
|
||||
"Info": "Informazioni",
|
||||
"Delete": "Elimina",
|
||||
"Hide Sphaira": "Nascondi Sphaira",
|
||||
"Are you sure you want to delete ": "Sei sicuro di voler eliminare? ",
|
||||
"Install Forwarder": "Installa forwarder",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ATTENZIONE: l'installazione di forwarder porterà al ban!",
|
||||
"Back": "Indietro",
|
||||
"Install": "Installa",
|
||||
"Fs": "Fs",
|
||||
"App": "App",
|
||||
"Menu": "Menu",
|
||||
"Homebrew": "Homebrew",
|
||||
"FileBrowser": "FileBrowser",
|
||||
"Open": "Apri",
|
||||
"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",
|
||||
"12 Hour Time": "",
|
||||
"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 aggiornamenti",
|
||||
"File Options": "Opzioni file",
|
||||
"Cut": "Taglia",
|
||||
"Copy": "Copia",
|
||||
"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 Archive Bit",
|
||||
"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": "Strumenti",
|
||||
"Advanced": "Avanzato",
|
||||
"Themes": "Temi",
|
||||
"Legacy": "Legacy",
|
||||
"Misc": "Varie",
|
||||
"Downloads": "Download",
|
||||
"Filter": "Filtro",
|
||||
"Search": "Ricerca",
|
||||
"Menu Options": "Opzioni menu",
|
||||
"Header": "Intestazione",
|
||||
"Theme": "Tema",
|
||||
"Network": "Rete",
|
||||
"Logging": "Logging",
|
||||
"Enabled": "Abilitato",
|
||||
"Disabled": "Disabilitato",
|
||||
"Replace hbmenu on exit": "Sostituisci hbmenu all'uscita",
|
||||
"Misc Options": "Opzioni varie",
|
||||
"Themezer": "Themezer",
|
||||
"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": "Download",
|
||||
"Next Page": "Pagina successiva",
|
||||
"Prev Page": "Pagina precedente",
|
||||
"Ambient Noise Level: ": "",
|
||||
"Controller": "Controller",
|
||||
"Pad ": "Pad ",
|
||||
" (Available)": " (Disponibile)",
|
||||
" (Unsupported)": "",
|
||||
" (Unconnected)": " (Non connesso)",
|
||||
"HandHeld": "HandHeld",
|
||||
" (Available)": " (Disponibile)",
|
||||
"Rotation": "Rotazione",
|
||||
"0 (Sideways)": "0 (Di lato)",
|
||||
"90 (Flat)": "90 (Piatto)",
|
||||
"180 (-Sideways)": "180 (-Di lato)",
|
||||
"270 (Upside down)": "270 (Capovolto)",
|
||||
"Colour": "Colore",
|
||||
"Grey": "Grigio",
|
||||
"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": "Controller",
|
||||
"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": "Impostazioni Themezer",
|
||||
"Nsfw": "NSFW",
|
||||
"Page": "Pagina",
|
||||
"Page %zu / %zu": "Pagina %zu / %zu",
|
||||
"Enter Page Number": "Inserisci il numero della pagina",
|
||||
"Bad Page": "Pagina invalida",
|
||||
"Download theme?": "Vuoi scaricare il tema?",
|
||||
|
||||
"GitHub": "GitHub",
|
||||
"Downloading json": "Scaricamento json",
|
||||
"Select asset to download for": "Scegli l'asset da scaricare per",
|
||||
|
||||
"Installing ": "Installazione",
|
||||
"Uninstalling ": "Disinstallazione",
|
||||
"Deleting ": "Eliminazione",
|
||||
"Deleting": "Eliminazione",
|
||||
"Pasting ": "Incollo",
|
||||
"Pasting": "Incollo",
|
||||
"Removing ": "Rimozione",
|
||||
"Scanning ": "Scan",
|
||||
"Creating ": "Creazione",
|
||||
"Copying ": "Copio",
|
||||
"Trying to load ": "Cercando di caricare",
|
||||
"Downloading ": "Scaricando",
|
||||
"Downloaded ": "Scaricato",
|
||||
"Removed ": ""Rimosso,
|
||||
"Checking MD5": "Controllo MD5",
|
||||
"Loading...": "Caricamento...",
|
||||
"Loading": "Caricamento",
|
||||
"Empty!": "Vuoto!",
|
||||
"Not Ready...": "Non pronto...",
|
||||
"Error loading page!": "Errore nel caricare la pagina!",
|
||||
"Update avaliable: ": "Aggiornamento disponibile",
|
||||
"Download update: ": "Scarica aggiornamento",
|
||||
"Updated to ": "Aggiornato a",
|
||||
"Press OK to restart Sphaira": "Premi OK per riavviare Sphaira",
|
||||
"Restart Sphaira?": "Vuoi riavviare Sphaira?",
|
||||
"Failed to download update": "Download aggiornamento fallito",
|
||||
"Restore hbmenu?": "Vuoi ripristinare hbmenu?",
|
||||
"Failed to find /switch/hbmenu.nro\nUse the Appstore to re-install hbmenu": "Impossibile trovare /switch/hbmenu.nro\nUsa l'Appstore per reinstallare hbmenu",
|
||||
"Failed to restore hbmenu, please re-download hbmenu": "Impossibile ripristinare hbmenu, per favore riscaricalo",
|
||||
"Failed to restore hbmenu, using sphaira instead": "Impossibile ripristinare hbmenu, uso Sphaira invece",
|
||||
"Restored hbmenu, closing sphaira": "hbmenu ripristinato, chiudo Sphaira",
|
||||
"Restored hbmenu": "hbmenu ripristinato",
|
||||
"Delete Selected files?": "Vuoi rimuovere i file selezionati?",
|
||||
"Completely remove ": "Elimina definitivamente",
|
||||
"Are you sure you want to delete ": "Sei sicuro di voler eliminare? ",
|
||||
"Are you sure you wish to cancel?": "Sei sicuro di voler annullare?",
|
||||
"Audio disabled due to suspended game": "Audio disabilitato poichè un app è in pausa",
|
||||
"If this message appears repeatedly, please open an issue.": "Se questo messaggio appare frequentemente, segnala il bug."
|
||||
}
|
||||
|
||||
@@ -1,114 +1,257 @@
|
||||
{
|
||||
"Launch": "起動",
|
||||
"[Applet Mode]": "[Appletモード]",
|
||||
"No Internet": "インターネットなし",
|
||||
"Files": "ファイル",
|
||||
"Apps": "アプリ",
|
||||
"Store": "AppStore",
|
||||
"Menu": "メニュー",
|
||||
"Options": "設定",
|
||||
"Homebrew Options": "Homebrew設定",
|
||||
"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": "ファイルサイズ",
|
||||
"Alphabetical": "アルファベット順",
|
||||
"Decending": "降順",
|
||||
"Ascending": "上昇",
|
||||
"Filter": "フィルター",
|
||||
"Sort": "並べ替え",
|
||||
"Order": "順番",
|
||||
"Info": "情報",
|
||||
"Delete": "消去",
|
||||
"Hide Sphaira": "Sphairaを非表示",
|
||||
"Are you sure you want to delete ": "消去してもよろしいですか ",
|
||||
"Install Forwarder": "Forwarderのインストール",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "警告: ForwarderをインストールするとBANされます。",
|
||||
"Back": "戻る",
|
||||
"Install": "インストール",
|
||||
"Fs": "ファイル",
|
||||
"App": "アプリ",
|
||||
"Menu": "メニュー",
|
||||
"Homebrew": "Homebrew",
|
||||
"FileBrowser": "ファイルブラウザ",
|
||||
"Open": "開く",
|
||||
"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",
|
||||
"12 Hour Time": "",
|
||||
"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": "Forwarderのインストール機能",
|
||||
"Install location": "インストール経路",
|
||||
"Show install warning": "警告文を示す",
|
||||
"Text scroll speed": "流れる文字の速さ",
|
||||
|
||||
"FileBrowser": "ファイルブラウザ",
|
||||
"%zd files": "%zd個のファイル",
|
||||
"%zd dirs": "%zd個のフォルダー",
|
||||
"File Options": "ファイル設定",
|
||||
"Show Hidden": "非表示ファイルを表示",
|
||||
"Folders First": "フォルダーを優先",
|
||||
"Hidden Last": "非表示ファイルを劣後",
|
||||
"Yes": "はい",
|
||||
"No": "いいえ",
|
||||
"Network Options": "ネットワーク設定",
|
||||
"Nxlink": "Nxlink",
|
||||
"Check for update": "アップデートの確認",
|
||||
"File Options": "ファイル設定",
|
||||
"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?": "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": "Themezer",
|
||||
"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カメラ",
|
||||
"Web": "ウェブブラウザ",
|
||||
"Download": "ダウンロード",
|
||||
"Next Page": "次のページ",
|
||||
"Prev Page": "前のページ",
|
||||
"Pad ": "パッド ",
|
||||
"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]": "[Appletモード]",
|
||||
"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?": "本当に取り消しますか?",
|
||||
"Audio disabled due to suspended game": "ゲームが一時停止状態の場合、オーディオは無効になります",
|
||||
"If this message appears repeatedly, please open an issue.": "このメッセージが繰り返し表示される場合は、問題を開いてください。"
|
||||
}
|
||||
@@ -1,114 +1,257 @@
|
||||
{
|
||||
"Launch": "실행",
|
||||
"Options": "설정",
|
||||
"Homebrew Options": "홈브류 설정",
|
||||
"Sort By": "정렬",
|
||||
"Sort Options": "정렬 설정",
|
||||
"Updated": "업데이트순",
|
||||
"Size": "크기순",
|
||||
"Alphabetical": "알파벳순",
|
||||
"Decending": "내림차순",
|
||||
"Ascending": "오름차순",
|
||||
"Sort": "분류",
|
||||
"Order": "정렬",
|
||||
"Info": "정보",
|
||||
"Delete": "삭제",
|
||||
"Hide Sphaira": "Sphaira 숨기기",
|
||||
"Are you sure you want to delete ": "정말 삭제하시겠습니까? ",
|
||||
"Install Forwarder": "바로가기 설치",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "주의: 바로가기 설치시 BAN 위험이 있습니다!",
|
||||
"Back": "뒤로",
|
||||
"Install": "설치",
|
||||
"Fs": "파일 탐색기",
|
||||
"App": "앱",
|
||||
"Menu": "메뉴",
|
||||
"Homebrew": "홈브류",
|
||||
"FileBrowser": "파일 탐색기",
|
||||
"Open": "열기",
|
||||
"Theme Options": "테마 설정",
|
||||
"Select Theme": "테마 선택",
|
||||
"Shuffle": "셔플",
|
||||
"Music": "BGM",
|
||||
"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": "Themezer",
|
||||
"Irs": "Joy-Con IR 카메라",
|
||||
"Web": "웹 브라우저",
|
||||
"Download": "다운로드",
|
||||
"Next Page": "다음 페이지",
|
||||
"Prev Page": "이전 페이지",
|
||||
"Pad ": "Joy-Con ",
|
||||
" (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": "Bright LED 켜기",
|
||||
"Dim group": "Dim LED 켜기",
|
||||
"None": "LED 끄기",
|
||||
"Normal image": "일반",
|
||||
"Negative image": "반전",
|
||||
"320x240": "320×240",
|
||||
"160x120": "160×120",
|
||||
"80x60": "80×60",
|
||||
"40x30": "40×30",
|
||||
"20x15": "20×15",
|
||||
"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",
|
||||
"12 Hour Time": "",
|
||||
"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?": "정말 취소할까요?",
|
||||
"Audio disabled due to suspended game": "게임 실행 중에는 BGM이 비활성화 됩니다",
|
||||
"If this message appears repeatedly, please open an issue.": "해당 메시지가 반복해서 나타나는 경우, 이슈를 등록하세요."
|
||||
}
|
||||
@@ -1,114 +1,257 @@
|
||||
{
|
||||
"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",
|
||||
"12 Hour Time": "",
|
||||
"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?": "",
|
||||
"Audio disabled due to suspended game": "",
|
||||
"If this message appears repeatedly, please open an issue.": ""
|
||||
}
|
||||
@@ -1,114 +1,257 @@
|
||||
{
|
||||
"Launch": "Iniciar",
|
||||
"Options": "Opções",
|
||||
"Homebrew Options": "Opções do Homebrew",
|
||||
"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 ": "Excluir ",
|
||||
"Install Forwarder": "Instalar forwarder",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "AVISO: Isso pode resultar em um 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": "Homebrew",
|
||||
"FileBrowser": "Navegador de arquivos",
|
||||
"Options": "Opções",
|
||||
"OK": "OK",
|
||||
"Back": "Voltar",
|
||||
"Select": "Selecionar",
|
||||
"Open": "Abrir",
|
||||
"Theme Options": "Opções de tema",
|
||||
"Select Theme": "Selecionar 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",
|
||||
"12 Hour Time": "",
|
||||
"Network": "Rede",
|
||||
"Network Options": "Opções de rede",
|
||||
"Ftp": "Servidor FTP",
|
||||
"Mtp": "Escuta MTP",
|
||||
"Nxlink": "Nxlink",
|
||||
"Check for update": "Verificar 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 atalhos (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": "Cortar",
|
||||
"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 atalho (forwarder)",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "AVISO: Instalar atalhos 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": "Downloads",
|
||||
"Filter": "Filtro",
|
||||
"Search": "Procurar",
|
||||
"Menu Options": "Opções do menu",
|
||||
"Header": "Cabeçalho",
|
||||
"Theme": "Tema",
|
||||
"Network": "Rede",
|
||||
"Logging": "Logging",
|
||||
"Enabled": "Habilitado",
|
||||
"Disabled": "Desabilitado",
|
||||
"Replace hbmenu on exit": "Substitua hbmenu ao sair",
|
||||
"Misc Options": "Opções diversas",
|
||||
"Themezer": "Themezer",
|
||||
"Irs": "Irs",
|
||||
"Web": "Rede",
|
||||
"Download": "Download",
|
||||
"Next Page": "Próxima página",
|
||||
"Prev Page": "Página anterior",
|
||||
"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": "Sensor infravermelho",
|
||||
"Ambient Noise Level: ": "Nível de ruído ambiente: ",
|
||||
"Controller": "Controle",
|
||||
"Pad ": "Pad ",
|
||||
" (Unconnected)": " (Desconectado)",
|
||||
" (Available)": " (disponível)",
|
||||
" (Unsupported)": "(não suportado)",
|
||||
" (Unconnected)": " (desconectado)",
|
||||
"HandHeld": "Portátil",
|
||||
" (Available)": " (Disponível)",
|
||||
"0 (Sideways)": "0 (Lateralmente)",
|
||||
"Rotation": "Rotação",
|
||||
"0 (Sideways)": "0 (lateralmente)",
|
||||
"90 (Flat)": "90 (plano)",
|
||||
"180 (-Sideways)": "180 (-Lateralmente)",
|
||||
"270 (Upside down)": "270 (De cabeça para baixo)",
|
||||
"180 (-Sideways)": "180 (-lateralmente)",
|
||||
"270 (Upside down)": "270 (de cabeça para baixo)",
|
||||
"Colour": "Cor",
|
||||
"Grey": "Cinza",
|
||||
"Ironbow": "Arco de ferro",
|
||||
"Ironbow": "Ferro",
|
||||
"Green": "Verde",
|
||||
"Red": "Vermelho",
|
||||
"Blue": "Azul",
|
||||
"Light Target": "Alvo de luz",
|
||||
"All leds": "Todos os LEDs",
|
||||
"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": "Controle",
|
||||
"Rotation": "Rotação",
|
||||
"Colour": "Cor",
|
||||
"Light Target": "Alvo leve",
|
||||
"Gain": "Ganho",
|
||||
"Negative Image": "Imagem negativa",
|
||||
"Format": "Formatar",
|
||||
"Trimming Format": "Formato de corte",
|
||||
"External Light Filter": "Filtro de luz externo",
|
||||
"Load Default": "Carregar padrão",
|
||||
"No Internet": "Sem Internet",
|
||||
"[Applet Mode]": "[Modo Applet]",
|
||||
"Language": "Idioma"
|
||||
"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 do recorte",
|
||||
"External Light Filter": "Filtro de luz externa",
|
||||
"Load Default": "Restaurar padrão",
|
||||
|
||||
"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 de ",
|
||||
|
||||
"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?",
|
||||
"Audio disabled due to suspended game": "Áudio desativado devido ao software suspenso",
|
||||
"If this message appears repeatedly, please open an issue.": "Se esta mensagem aparecer repetidamente, abra um issue."
|
||||
}
|
||||
|
||||
@@ -1,114 +1,257 @@
|
||||
{
|
||||
"[Applet Mode]": "[Режим апплета]",
|
||||
"No Internet": "Нет Интернета",
|
||||
"Files": "",
|
||||
"Apps": "",
|
||||
"Store": "",
|
||||
"Menu": "Меню",
|
||||
"Options": "Параметры темы",
|
||||
"OK": "",
|
||||
"Back": "Назад",
|
||||
"Select": "",
|
||||
"Open": "Открыть",
|
||||
"Launch": "Запуск",
|
||||
"Options": "Параметры",
|
||||
"Homebrew Options": "Параметры Homebrew",
|
||||
"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": "Скрыть Sphaira",
|
||||
"Are you sure you want to delete ": "Вы уверены, что хотите удалить ",
|
||||
"Install Forwarder": "Установить форвардер",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "ВНИМАНИЕ: Установка форвардеров приведет к бану!",
|
||||
"Back": "Назад",
|
||||
"Install": "Установить",
|
||||
"Fs": "Фс",
|
||||
"App": "Приложение",
|
||||
"Menu": "Меню",
|
||||
"Homebrew": "Homebrew",
|
||||
"FileBrowser": "Файловый менеджер",
|
||||
"Open": "Открыть",
|
||||
"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": "Музыка",
|
||||
"12 Hour Time": "",
|
||||
"Network": "Сеть",
|
||||
"Network Options": "Параметры сети",
|
||||
"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": "Параметры файла",
|
||||
"Show Hidden": "Показать скрытые",
|
||||
"Folders First": "Папки в первую очередь",
|
||||
"Hidden Last": "Скрытые в последнюю очередь",
|
||||
"Yes": "Да",
|
||||
"No": "Нет",
|
||||
"Network Options": "Параметры сети",
|
||||
"Nxlink": "Nxlink",
|
||||
"Check for update": "Проверить наличие обновлений",
|
||||
"File Options": "Параметры файла",
|
||||
"Cut": "Вырезать",
|
||||
"Copy": "Копировать",
|
||||
"Paste": "",
|
||||
"Paste ": "",
|
||||
" file(s)?": "",
|
||||
"Rename": "Переименовать",
|
||||
"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": "Установить 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": "Themezer",
|
||||
"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": "Интернет",
|
||||
"Download": "Скачать",
|
||||
"Next Page": "Следующая страница",
|
||||
"Prev Page": "Предыдущая страница",
|
||||
"Ambient Noise Level: ": "",
|
||||
"Controller": "Контроллер",
|
||||
"Pad ": "Pad ",
|
||||
" (Available)": " (Доступно)",
|
||||
" (Unsupported)": "",
|
||||
" (Unconnected)": " (Не подключено)",
|
||||
"HandHeld": "Портативный",
|
||||
" (Available)": " (Доступно)",
|
||||
"Rotation": "Вращение",
|
||||
"0 (Sideways)": "0 (набок)",
|
||||
"90 (Flat)": "90 (ровно)",
|
||||
"180 (-Sideways)": "180 (-вбок)",
|
||||
"270 (Upside down)": "270 (перевернуто)",
|
||||
"Colour": "Цвет",
|
||||
"Grey": "Серый",
|
||||
"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": "Язык"
|
||||
}
|
||||
|
||||
"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?": "",
|
||||
"Audio disabled due to suspended game": "",
|
||||
"If this message appears repeatedly, please open an issue.": ""
|
||||
}
|
||||
257
assets/romfs/i18n/se.json
Normal file
@@ -0,0 +1,257 @@
|
||||
{
|
||||
"[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",
|
||||
"12 Hour Time": "",
|
||||
"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?",
|
||||
"Audio disabled due to suspended game": "Ljud är avstängt på grund av bakgrundsprogram",
|
||||
"If this message appears repeatedly, please open an issue.": "Om detta meddelande visas upprepade gånger, vänligen öppna en felanmälan.",
|
||||
}
|
||||
257
assets/romfs/i18n/vi.json
Normal file
@@ -0,0 +1,257 @@
|
||||
{
|
||||
"[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",
|
||||
"12 Hour Time": "",
|
||||
"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?",
|
||||
"Audio disabled due to suspended game": "",
|
||||
"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,115 +1,257 @@
|
||||
{
|
||||
"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": "大小",
|
||||
"Alphabetical": "按字母顺序",
|
||||
"Decending": "降序",
|
||||
"Ascending": "升序",
|
||||
"Filter": "筛选",
|
||||
"Sort": "排序",
|
||||
"Order": "顺序",
|
||||
"Info": "信息",
|
||||
"Delete": "删除",
|
||||
"Hide Sphaira": "在插件列表中隐藏Sphaira",
|
||||
"Are you sure you want to delete ": "您确定要删除吗 ",
|
||||
"Install Forwarder": "安装前端应用",
|
||||
"WARNING: Installing forwarders will lead to a ban!": "警告:安装前端应用可能导致ban机!",
|
||||
"Back": "返回",
|
||||
"Install": "安装",
|
||||
"Fs": "文件系统",
|
||||
"App": "插件",
|
||||
"Menu": "菜单",
|
||||
"Homebrew": "插件列表",
|
||||
"AppStore": "插件商店",
|
||||
"FileBrowser": "文件浏览",
|
||||
"Open": "打开",
|
||||
"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": "音乐",
|
||||
"12 Hour Time": "",
|
||||
"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": "退出后用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": "文件选项",
|
||||
"Show Hidden": "显示隐藏项目",
|
||||
"Folders First": "文件夹靠前",
|
||||
"Hidden Last": "隐藏项目置后",
|
||||
"Yes": "是",
|
||||
"No": "否",
|
||||
"Network Options": "网络选项",
|
||||
"Nxlink": "Nxlink开发工具",
|
||||
"Check for update": "检查更新",
|
||||
"File Options": "文件选项",
|
||||
"Cut": "剪切",
|
||||
"Copy": "复制",
|
||||
"Paste": "粘贴",
|
||||
"Paste ": "粘贴 ",
|
||||
" file(s)?": "个文件(夹)?",
|
||||
"Rename": "重命名",
|
||||
"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": "插件商店选项",
|
||||
"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": "退出后用Sphaira替换hbmenu",
|
||||
"Misc Options": "杂项设置",
|
||||
"Themezer": "在线主题",
|
||||
"version: %s": "版本: %s",
|
||||
"updated: %s": "更新时间: %s",
|
||||
"category: %s": "分类: %s",
|
||||
"extracted: %.2f MiB": "应用大小: %.2f MiB",
|
||||
"app_dls: %s": "下载量: %s",
|
||||
"More by Author": "作者更多作品",
|
||||
"Leave Feedback": "留言反馈",
|
||||
|
||||
"Irs": "红外成像",
|
||||
"Web": "网页浏览器",
|
||||
"Download": "下载",
|
||||
"Next Page": "下一页",
|
||||
"Prev Page": "上一页",
|
||||
"Ambient Noise Level: ": "环境噪声等级:",
|
||||
"Controller": "控制器",
|
||||
"Pad ": "手柄 ",
|
||||
" (Unconnected)": " (未连接)",
|
||||
"HandHeld": "手持式",
|
||||
" (Available)": " (可用的)",
|
||||
" (Unsupported)": "",
|
||||
" (Unconnected)": " (未连接)",
|
||||
"HandHeld": "掌机模式",
|
||||
"Rotation": "旋转",
|
||||
"0 (Sideways)": "0度",
|
||||
"90 (Flat)": "90度",
|
||||
"180 (-Sideways)": "180度",
|
||||
"270 (Upside down)": "270度",
|
||||
"Colour": "颜色",
|
||||
"Grey": "灰色",
|
||||
"Ironbow": "紫黄",
|
||||
"Green": "绿色",
|
||||
"Red": "红色",
|
||||
"Blue": "蓝色",
|
||||
"Light Target": "光源目标",
|
||||
"All leds": "全部",
|
||||
"Bright group": "亮色组",
|
||||
"Dim group": "暗色组",
|
||||
"None": "无",
|
||||
"Gain": "曝光",
|
||||
"Negative Image": "负片图像",
|
||||
"Normal image": "正常图像",
|
||||
"Negative image": "负片图像",
|
||||
"320x240": "320x240",
|
||||
"160x120": "160x120",
|
||||
"80x60": "80x60",
|
||||
"40x30": "40x30",
|
||||
"20x15": "20x15",
|
||||
"Controller": "控制器",
|
||||
"Rotation": "旋转",
|
||||
"Colour": "颜色",
|
||||
"Light Target": "光源目标",
|
||||
"Gain": "增益",
|
||||
"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": "语言"
|
||||
|
||||
"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?": "您确定要取消吗?",
|
||||
"Audio disabled due to suspended game": "由于游戏暂停,音频已禁用",
|
||||
"If this message appears repeatedly, please open an issue.": "若此消息反复出现,请提交问题报告。"
|
||||
}
|
||||
|
||||
BIN
assets/romfs/theme/bubble1.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
assets/romfs/theme/bubble2.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
assets/romfs/theme/bubble3.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
assets/romfs/theme/icons-sp/icon_SP_audio.png
Normal file
|
After Width: | Height: | Size: 7.0 KiB |
BIN
assets/romfs/theme/icons-sp/icon_SP_file.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
assets/romfs/theme/icons-sp/icon_SP_folder.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
assets/romfs/theme/icons-sp/icon_SP_image.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
assets/romfs/theme/icons-sp/icon_SP_nro.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
assets/romfs/theme/icons-sp/icon_SP_video.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
assets/romfs/theme/icons-sp/icon_SP_zip.png
Normal file
|
After Width: | Height: | Size: 5.4 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
@@ -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
@@ -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
|
||||
|
||||
15
assets/romfs/themes/black_theme_sp_icons.ini
Normal file
@@ -0,0 +1,15 @@
|
||||
[meta]
|
||||
name=Black alt-icons-SP
|
||||
author=spkatsi
|
||||
version=1.0.0
|
||||
inherit=romfs:/themes/base_black_theme.ini
|
||||
|
||||
[theme]
|
||||
icon_audio = romfs:/theme/icons-sp/icon_SP_audio.png
|
||||
icon_video = romfs:/theme/icons-sp/icon_SP_video.png
|
||||
icon_image = romfs:/theme/icons-sp/icon_SP_image.png
|
||||
icon_file = romfs:/theme/icons-sp/icon_SP_file.png
|
||||
icon_folder = romfs:/theme/icons-sp/icon_SP_folder.png
|
||||
icon_zip = romfs:/theme/icons-sp/icon_SP_zip.png
|
||||
icon_nro = romfs:/theme/icons-sp/icon_SP_nro.png
|
||||
|
||||
@@ -1,23 +1,13 @@
|
||||
[meta]
|
||||
name=OLED Black
|
||||
author=iTotalJustice/Sanras
|
||||
version=1.0.0
|
||||
preview=romfs:/theme/preview.jpg
|
||||
author=TotalJustice/Sanras
|
||||
version=1.1.0
|
||||
inherit=romfs:/themes/base_black_theme.ini
|
||||
|
||||
[theme]
|
||||
background=0x000000ff
|
||||
cursor=romfs:/theme/cursor.png
|
||||
cursor_drag=romfs:/theme/cursor_drag.png
|
||||
grid=0x46464640
|
||||
selected=0x323232ff
|
||||
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
|
||||
background = 0x000000
|
||||
grid = 0x46464640
|
||||
popup = 0x323232
|
||||
text = 0xfbfbfb
|
||||
text_selected = 0x00ffc8
|
||||
selected_background = 0x323232
|
||||
|
||||
5
assets/romfs/themes/white_theme.ini
Normal file
@@ -0,0 +1,5 @@
|
||||
[meta]
|
||||
name=White
|
||||
author=TotalJustice/Yorunokyujitsu
|
||||
version=1.0.0
|
||||
inherit=romfs:/themes/base_white_theme.ini
|
||||
@@ -1,6 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
set(sphaira_VERSION 0.4.1)
|
||||
set(sphaira_VERSION 0.6.3)
|
||||
|
||||
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
|
||||
@@ -241,7 +330,7 @@ nx_generate_nacp(
|
||||
OUTPUT sphaira.nacp
|
||||
NAME ${CMAKE_PROJECT_NAME}
|
||||
AUTHOR TotalJustice
|
||||
VERSION ${CMAKE_PROJECT_VERSION}
|
||||
VERSION ${sphaira_VERSION}
|
||||
)
|
||||
|
||||
# create nro
|
||||
|
||||
@@ -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,57 @@ 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 Get12HourTimeEnable() -> 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 Set12HourTimeEnable(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 +106,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();
|
||||
@@ -103,6 +121,21 @@ public:
|
||||
return type == AppletType_Application || type == AppletType_SystemApplication;
|
||||
}
|
||||
|
||||
static auto IsApplet() -> bool {
|
||||
return !IsApplication();
|
||||
}
|
||||
|
||||
// returns true if launched in applet mode with a title suspended in the background.
|
||||
static auto IsAppletWithSuspendedApp() -> bool {
|
||||
R_UNLESS(IsApplet(), false);
|
||||
R_TRY_RESULT(pmdmntInitialize(), false);
|
||||
ON_SCOPE_EXIT(pmdmntExit());
|
||||
|
||||
u64 pid;
|
||||
return R_SUCCEEDED(pmdmntGetApplicationProcessId(&pid));
|
||||
}
|
||||
|
||||
|
||||
// private:
|
||||
static constexpr inline auto CONFIG_PATH = "/config/sphaira/config.ini";
|
||||
static constexpr inline auto PLAYLOG_PATH = "/config/sphaira/playlog.ini";
|
||||
@@ -112,6 +145,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 +165,26 @@ 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::OptionBool m_12hour_time{INI_SECTION, "12hour_time", false};
|
||||
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,238 @@
|
||||
#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;
|
||||
// uses curl to convert string to their %XX
|
||||
auto EscapeString(const std::string& str) -> std::string;
|
||||
|
||||
void DownloadClearCache(const std::string& url);
|
||||
struct Api {
|
||||
Api() = default;
|
||||
|
||||
} // namespace sphaira
|
||||
template <typename... Ts>
|
||||
Api(Ts&&... ts) {
|
||||
Api::set_option(std::forward<Ts>(ts)...);
|
||||
}
|
||||
|
||||
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
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
namespace sphaira::ftpsrv {
|
||||
|
||||
bool Init();
|
||||
void Exit();
|
||||
|
||||
} // namespace sphaira::ftpsrv
|
||||
@@ -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 {
|
||||
@@ -18,7 +19,6 @@ struct NroEntry {
|
||||
s64 size{};
|
||||
NacpStruct nacp{};
|
||||
|
||||
std::vector<u8> icon{};
|
||||
u64 icon_size{};
|
||||
u64 icon_offset{};
|
||||
|
||||
@@ -28,6 +28,7 @@ struct NroEntry {
|
||||
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
|
||||
|
||||
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
@@ -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
@@ -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,19 +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
|
||||
|
||||
@@ -14,6 +14,8 @@ enum class UpdateState {
|
||||
None,
|
||||
// update available!
|
||||
Update,
|
||||
// there was an error whilst checking for updates.
|
||||
Error,
|
||||
};
|
||||
|
||||
// this holds 2 menus and allows for switching between them
|
||||
@@ -26,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{};
|
||||
|
||||
@@ -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.
|
||||
|
||||