diff --git a/gui/AboutScreen.cpp b/gui/AboutScreen.cpp index 5e0cf65..62d2c08 100644 --- a/gui/AboutScreen.cpp +++ b/gui/AboutScreen.cpp @@ -15,14 +15,13 @@ AboutScreen::AboutScreen(Get* get) : get(get) - , cancel("Go Back", B_BUTTON, false, 29) - , feedback("Leave Feedback", A_BUTTON, false, 17) - , title("Homebrew App Store", 35, &HBAS::ThemeManager::textPrimary) - , subtitle("by fortheusers.org", 25, &HBAS::ThemeManager::textPrimary) + , cancel(i18n("credits.goback"), B_BUTTON, false, 29) + , feedback(i18n("credits.feedback"), A_BUTTON, false, 17) + , title(i18n("credits.title"), 35, &HBAS::ThemeManager::textPrimary) + , subtitle(i18n("credits.subtitle"), 25, &HBAS::ThemeManager::textPrimary) , ftuLogo(AVATAR_URL "40721862", [] { return new ImageElement(RAMFS "res/4TU.png"); }) - , creds("Licensed under the GPLv3 license. This app is free and open source because the users (like you!) deserve it.\n\nLet's support homebrew and the right to control what software we run on our own devices!", - 20, &HBAS::ThemeManager::textPrimary, false, 1240) + , creds((i18n("credits.license") + "\n\n" + i18n("credits.cta")), 20, &HBAS::ThemeManager::textPrimary, false, 1240) { // TODO: show current app status somewhere @@ -56,7 +55,7 @@ AboutScreen::AboutScreen(Get* get) // username, githubId, twitter, github, gitlab, patreon, url, discord, directAvatarURL // only first two social points will be used - credHead("Repo Maintenance and Development", "These are the primary people responsible for actively maintaining and developing the Homebrew App Store. If there's a problem, these are the ones to get in touch with!"); + credHead(i18n("credits.repo"), i18n("credits.repo.desc")); credit("pwsincd", "20027105", NULL, "pwsincd", NULL, NULL, NULL, "pwsincd#9044"); credit("VGMoose", "2467473", "vgmoose", "vgmoose"); credit("Nightkingale", "63483138", "Nightkingale", "nightkingale"); @@ -65,7 +64,7 @@ AboutScreen::AboutScreen(Get* get) credit("CompuCat", "12215288", NULL, NULL, "compucat", NULL, "compucat.me"); credit("Quarky", "8533313", NULL, NULL, "quarktheawesome", NULL, "heyquark.com"); - credHead("Library Development and Support", "Without the contributions to open-source libraries and projects by these people, much of the functionality within this program wouldn't be possible."); + credHead(i18n("credits.library"), i18n("credits.library.desc")); credit("Maschell", "8582508", "maschelldev", "maschell"); credit("brienj", "17801294", "xhp_creations", "xhp-creations"); credit("Dimok", "15055714", NULL, "dimok789"); @@ -75,11 +74,11 @@ AboutScreen::AboutScreen(Get* get) credit("CreeperMario", "15356475", "CreeperMario258", "CreeperMario"); credit("Ep8Script", "27195853", "ep8script", "ep8script"); - credHead("Music and Sound", "In the Wii U and Switch releases, these guys provide the chiptune melodies that play in the background. They make the app feel more alive, and are all-around awesome!"); + credHead(i18n("credits.music"), i18n("credits.music.desc")); credit("(T-T)b", "40721862", "ttbchiptunes", NULL, NULL, NULL, "t-tb.bandcamp.com", NULL, "https://f4.bcbits.com/img/a2723574369_16.jpg"); credit("drewinator4", "40721862", NULL, NULL, NULL, NULL, NULL, NULL, "https://i.ytimg.com/vi/Tb02CNlhkPA/hqdefault.jpg", "drewinator4"); - credHead("Interface Development and Design", "In one way or another, everyone in this category provided information regarding core functionality, quality-of-life changes, or the design of the user interface."); + credHead(i18n("credits.design"), i18n("credits.design.desc")); credit("exelix", "13405476", "exelix11", "exelix11"); credit("Xortroll", "33005497", NULL, "xortroll", NULL, "xortroll"); credit("Ave", "584369", NULL, NULL, "a", NULL, "ave.zone", NULL, "https://gitlab.com/uploads/-/system/user/avatar/584369/avatar.png"); @@ -89,7 +88,7 @@ AboutScreen::AboutScreen(Get* get) credit("Jacob", "12831497", NULL, "jacquesCedric"); credit("iTotalJustice", "47043333", NULL, "iTotalJustice"); - credHead("Toolchain and Environment", "The organizations and people in this category enable Homebrew in general by creating and maintaining a cohesive environment for the community."); + credHead(i18n("credits.toolchain"), i18n("credits.toolchain.desc")); credit("devkitPro", "7538897", NULL, "devkitPro", NULL, "devkitPro"); credit("Wintermute", "101194", NULL, "wintermute", NULL, NULL, "devkitPro.org"); credit("Fincs", "581494", "fincsdev", "fincs"); @@ -98,7 +97,7 @@ AboutScreen::AboutScreen(Get* get) credit("exjam", "1302758", NULL, "exjam"); credit("brett19", "1621627", NULL, "brett19"); - credHead("Homebrew Community Special Thanks", "Awesome people within the community whose work, words, or actions in some way inspired this program to exist in the manner it does."); + credHead(i18n("credits.extra"), i18n("credits.extra.desc")); credit("Whovian9369", "5240754", NULL, NULL, "whovian9369"); credit("FIX94", "12349638", NULL, "FIX94"); @@ -138,7 +137,7 @@ AboutScreen::~AboutScreen() } } -void AboutScreen::credHead(const char* header, const char* blurb) +void AboutScreen::credHead(std::string& header, std::string& blurb) { auto head = creditHeads.emplace(creditHeads.end()); diff --git a/gui/AboutScreen.hpp b/gui/AboutScreen.hpp index f2b3d86..5563b56 100644 --- a/gui/AboutScreen.hpp +++ b/gui/AboutScreen.hpp @@ -39,7 +39,7 @@ class AboutScreen : public ListElement void removeEmptyFolders(); void wipeCache(); void launchFeedback(); - void credHead(const char* header, const char* blurb); + void credHead(std::string& header, std::string& blurb); void credit(const char* username, const char* githubId, const char* twitter = NULL, diff --git a/gui/AppDetails.cpp b/gui/AppDetails.cpp index 25b7b1e..97fb431 100644 --- a/gui/AppDetails.cpp +++ b/gui/AppDetails.cpp @@ -29,10 +29,10 @@ AppDetails::AppDetails(Package& package, AppList* appList, AppCard* appCard) , appCard(appCard) , downloadProgress() , download(getAction(&package), package.getStatus() == INSTALLED ? X_BUTTON : A_BUTTON, true, 30 / SCALER) - , cancel("Cancel", B_BUTTON, true, 30 / SCALER, download.width) + , cancel(i18n("details.cancel"), B_BUTTON, true, 30 / SCALER, download.width) , details(getPackageDetails(&package).c_str(), 20, &white, false, 300) , content(&package, appList->useBannerIcons) - , downloadStatus("Download Status", 30 / SCALER, &white) + , downloadStatus(i18n("details.status"), 30 / SCALER, &white) { // TODO: show current app status somewhere @@ -121,31 +121,31 @@ std::string AppDetails::getPackageDetails(Package* package) { // lots of details that we know about the package std::stringstream more_details; - more_details << "Title: " << package->getTitle() << "\n" + more_details << i18n("details.title") << " " << package->getTitle() << "\n" << package->getShortDescription() << "\n\n" - << "Author: " << package->getAuthor() << "\n" - << "Version: " << package->getVersion() << "\n" - << "License: " << package->getLicense() << "\n\n" - << "Package: " << package->getPackageName() << "\n" - << "Downloads: " << package->getDownloadCount() << "\n" - << "Updated: " << package->getUpdatedAt()<< "\n\n" - << "Download size: " << package->getDownloadSize() << " KB\n" - << "Install size: " << package->getExtractedSize() << " KB\n"; + << i18n("details.author") << " " << package->getAuthor() << "\n" + << i18n("details.version") << " " << package->getVersion() << "\n" + << i18n("details.license") << " " << package->getLicense() << "\n\n" + << i18n("details.package") << " " << package->getPackageName() << "\n" + << i18n("details.downloads") << " " << package->getDownloadCount() << "\n" + << i18n("details.updated") << " " << package->getUpdatedAt()<< "\n\n" + << i18n("details.size") << " " << package->getDownloadSize() << " KB\n" + << i18n("details.installsize") << " " << package->getExtractedSize() << " KB\n"; return more_details.str(); } -const char* AppDetails::getAction(Package* package) +std::string AppDetails::getAction(Package* package) { switch (package->getStatus()) { case GET: - return "Download"; + return i18n("details.download"); case UPDATE: - return "Update"; + return i18n("details.update"); case INSTALLED: - return "Remove"; + return i18n("details.remove"); case LOCAL: - return "Reinstall"; + return i18n("details.reinstall"); default: break; } @@ -419,7 +419,14 @@ int AppDetails::updatePopupStatus(int status, int num, int num_total) Package* package = popup->package; if (status < 0 || status >= 5) return 0; - const char* statuses[6] = { "Downloading ", "Installing ", "Removing ", "Reloading Metadata", "Syncing Packages", "Analyzing Files" }; + std::string statuses[6] = { + i18n("details.download.verb") + " ", + i18n("details.install.verb") + " ", + i18n("details.remove.verb") + " ", + i18n("details.reloading"), + i18n("details.syncing") + " ", + i18n("details.analyzing") + " " + }; statusText << statuses[status]; diff --git a/gui/AppDetails.hpp b/gui/AppDetails.hpp index 23e2b17..a46e769 100644 --- a/gui/AppDetails.hpp +++ b/gui/AppDetails.hpp @@ -13,7 +13,7 @@ class AppDetails : public Element ~AppDetails(); std::string getPackageDetails(Package* package); - const char* getAction(Package* package); + std::string getAction(Package* package); bool process(InputEvents* event); void render(Element* parent); bool launchFile(char* path, char* context); diff --git a/gui/AppList.cpp b/gui/AppList.cpp index fd6cadf..cfcf489 100644 --- a/gui/AppList.cpp +++ b/gui/AppList.cpp @@ -18,7 +18,13 @@ #include #endif -const char* AppList::sortingDescriptions[TOTAL_SORTS] = { "by most recent", "by download count", "alphabetically", "by size (descending)", "randomly" }; +std::string AppList::sortingDescriptions[TOTAL_SORTS] = { + "listing.sort.recent", + "listing.sort.downloads", + "listing.sort.alpha", + "listing.sort.size", + "listing.sort.random" + }; CST_Color AppList::red = { 0xff, 0, 0, 0xff }; CST_Color AppList::lighterRed = { 0xef, 0x48, 0x48, 0xff }; @@ -26,11 +32,11 @@ CST_Color AppList::lighterRed = { 0xef, 0x48, 0x48, 0xff }; AppList::AppList(Get* get, Sidebar* sidebar) : get(get) // the main get instance that contains repo info and stuff , sidebar(sidebar) // the sidebar, which will store the currently selected category info - , quitBtn("Quit", SELECT_BUTTON, false, 15) - , creditsBtn("Credits", START_BUTTON, false, 15) - , sortBtn("Adjust Sort", Y_BUTTON, false, 15) - , keyboardBtn("Toggle Keyboard", Y_BUTTON, false, 15) - , backspaceBtn("Del", B_BUTTON, false, 15) + , quitBtn(i18n("listing.quit"), SELECT_BUTTON, false, 15) + , creditsBtn(i18n("listing.credits"), START_BUTTON, false, 15) + , sortBtn(i18n("listing.adjustsort"), Y_BUTTON, false, 15) + , keyboardBtn(i18n("listing.togglekeyboard"), Y_BUTTON, false, 15) + , backspaceBtn(i18n("listing.delete"), B_BUTTON, false, 15) , nowPlayingText(" ", 20, &HBAS::ThemeManager::textPrimary) #if defined(MUSIC) , nowPlayingIcon(RAMFS "res/nowplaying.png") @@ -69,6 +75,7 @@ AppList::AppList(Get* get, Sidebar* sidebar) }; // keyboard input callback + // keyboard.hasRoundedKeys = true; keyboard.typeAction = std::bind(&AppList::keyboardInputCallback, this); keyboard.preventEnterAndTab = true; keyboard.width = SCREEN_HEIGHT - 20; @@ -94,14 +101,14 @@ AppList::AppList(Get* get, Sidebar* sidebar) if (!useBannerIcons) { // applet mode, display a warning - nowPlayingText.setText("NOTICE: You are in Applet mode! Google \"Switch Applet Mode\" for more info."); + nowPlayingText.setText(i18n("listing.appletwarning").c_str()); nowPlayingText.setColor(myRed); nowPlayingText.update(); } #endif #ifdef DEBUG_BUILD - nowPlayingText.setText("NOTICE: You are using a dev build! Update to a stable release if this is unintended."); + nowPlayingText.setText(i18n("listing.debugwarning").c_str()); nowPlayingText.setColor(myRed); nowPlayingText.update(); #endif @@ -461,7 +468,7 @@ void AppList::update() // add the search type next to the category in a gray font sortBlurb.position(category.x + category.width + 15, category.y + 12); - sortBlurb.setText(sortingDescriptions[sortMode]); + sortBlurb.setText(i18n(sortingDescriptions[sortMode]).c_str()); sortBlurb.update(); super::append(&sortBlurb); @@ -484,7 +491,7 @@ void AppList::update() // now playing icon, and position nowPlayingText.setText( std::string("") + title + - ((artist != std::string("")) ? (std::string(" by ") + artist) : "") + + ((artist != std::string("")) ? (std::string(" " + i18n("listing.by") + " ") + artist) : "") + ((album != std::string("")) ? (std::string(" - ") + album) : "") ); super::append(&nowPlayingIcon); diff --git a/gui/AppList.hpp b/gui/AppList.hpp index 78df0b1..4e6e11c 100644 --- a/gui/AppList.hpp +++ b/gui/AppList.hpp @@ -65,7 +65,7 @@ class AppList : public ListElement // the title of this category (from the sidebar) static CST_Color black, gray, red, lighterRed; - static const char* sortingDescriptions[TOTAL_SORTS]; + static std::string sortingDescriptions[TOTAL_SORTS]; TextElement sortBlurb; TextElement category; diff --git a/gui/Feedback.cpp b/gui/Feedback.cpp index 98cc31d..6b7a158 100644 --- a/gui/Feedback.cpp +++ b/gui/Feedback.cpp @@ -11,13 +11,13 @@ Feedback::Feedback(Package& package) : package(&package) - , title((std::string("Leaving feedback for: \"") + package.getTitle() + "\"").c_str(), 25) + , title((std::string(i18n("feedback.leaving") + " \"") + package.getTitle() + "\""), 25) , icon(package.getIconUrl().c_str(), []{ return new ImageElement(RAMFS "res/default.png"); }) - , quit("Discard", Y_BUTTON, false, 20) - , send("Submit", X_BUTTON, false, 20) - , backspaceBtn("Del", B_BUTTON, false, 15) - , capsBtn("Caps", L_BUTTON, false, 15) - , response("If you need to send more detailed feedback, please email us at fight@fortheusers.org", 20, NULL, false, 460) + , quit(i18n("feedback.discard"), Y_BUTTON, false, 20) + , send(i18n("feedback.submit"), X_BUTTON, false, 20) + , backspaceBtn(i18n("feedback.delete"), B_BUTTON, false, 15) + , capsBtn(i18n("feedback.caps"), L_BUTTON, false, 15) + , response(i18n("feedback.help"), 20, NULL, false, 460) { title.position(50, 30); super::append(&title); @@ -31,6 +31,8 @@ Feedback::Feedback(Package& package) #endif super::append(&icon); + // keyboard.hasRoundedKeys = true; + keyboard.typeAction = std::bind(&Feedback::keyboardInputCallback, this); keyboard.preventEnterAndTab = true; keyboard.updateSize(); diff --git a/gui/Sidebar.cpp b/gui/Sidebar.cpp index 42ee35a..a91e6aa 100644 --- a/gui/Sidebar.cpp +++ b/gui/Sidebar.cpp @@ -32,7 +32,7 @@ Sidebar::Sidebar() category[x].icon->position(30, 150 + x * 70 - 5); super::append(category[x].icon); - category[x].name = new TextElement(cat_names[x], 25); + category[x].name = new TextElement(i18n(cat_names[x]), 25); category[x].name->position(105, 150 + x * 70); super::append(category[x].name); } @@ -265,7 +265,7 @@ void Sidebar::render(Element* parent) std::string Sidebar::currentCatName() { if (this->curCategory >= 0 && this->curCategory < TOTAL_CATS) - return std::string(this->cat_names[this->curCategory]); + return i18n(this->cat_names[this->curCategory]); return std::string("?"); } diff --git a/gui/Sidebar.hpp b/gui/Sidebar.hpp index 042a28c..3ad46f0 100644 --- a/gui/Sidebar.hpp +++ b/gui/Sidebar.hpp @@ -36,10 +36,10 @@ class Sidebar : public ListElement // list of human-readable category titles and short names from the json #if defined(__WIIU__) - const char* cat_names[TOTAL_CATS] = { "Search", "All Apps", "Aroma-Ready", "Games", "Emulators", "Tools", "Advanced", "Misc" }; + const char* cat_names[TOTAL_CATS] = { "sidebar.search", "sidebar.all", "Aroma", "sidebar.games", "sidebar.emulators", "sidebar.tools", "sidebar.advanced", "sidebar.misc" }; const char* cat_value[TOTAL_CATS] = { "_search", "_all", "aroma", "game", "emu", "tool", "advanced", "_misc" }; #else - const char* cat_names[TOTAL_CATS] = { "Search", "All Apps", "Games", "Emulators", "Tools", "Advanced", "Themes", "Misc" }; + const char* cat_names[TOTAL_CATS] = { "sidebar.search", "sidebar.all", "sidebar.games", "sidebar.emulators", "sidebar.tools", "sidebar.advanced", "sidebar.themes", "sidebar.misc" }; const char* cat_value[TOTAL_CATS] = { "_search", "_all", "game", "emu", "tool", "advanced", "theme", "_misc" }; #endif diff --git a/libs/chesto b/libs/chesto index 900291d..227965e 160000 --- a/libs/chesto +++ b/libs/chesto @@ -1 +1 @@ -Subproject commit 900291d0b129a62b1da39152469219cd4c0cdcb7 +Subproject commit 227965e646fce668b22ce23ec9adf858513e65e4 diff --git a/resin/res/fonts/NotoSansSC-Regular.ttf b/resin/res/fonts/NotoSansSC-Regular.ttf new file mode 100644 index 0000000..4d4cadb Binary files /dev/null and b/resin/res/fonts/NotoSansSC-Regular.ttf differ diff --git a/resin/res/fonts/OpenSans-Regular.ttf b/resin/res/fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000..29e9e60 Binary files /dev/null and b/resin/res/fonts/OpenSans-Regular.ttf differ diff --git a/resin/res/fonts/PTSerif-Regular.ttf b/resin/res/fonts/PTSerif-Regular.ttf new file mode 100644 index 0000000..f87c0f1 Binary files /dev/null and b/resin/res/fonts/PTSerif-Regular.ttf differ diff --git a/resin/res/fonts/UbuntuMono-Regular.ttf b/resin/res/fonts/UbuntuMono-Regular.ttf new file mode 100644 index 0000000..4977028 Binary files /dev/null and b/resin/res/fonts/UbuntuMono-Regular.ttf differ diff --git a/resin/res/fonts/oldmono.ttf b/resin/res/fonts/oldmono.ttf new file mode 100644 index 0000000..67bdb9a Binary files /dev/null and b/resin/res/fonts/oldmono.ttf differ diff --git a/resin/res/gray_sq.png b/resin/res/gray_sq.png new file mode 100644 index 0000000..d6ce513 Binary files /dev/null and b/resin/res/gray_sq.png differ diff --git a/resin/res/i18n/en-us.ini b/resin/res/i18n/en-us.ini new file mode 100644 index 0000000..08c128e --- /dev/null +++ b/resin/res/i18n/en-us.ini @@ -0,0 +1,139 @@ +; Homebrew App Store - english language file + +; Credits Section +credits.goback = Go Back +credits.feedback = Leave Feedback +credits.title = Homebrew App Store +credits.subtitle = by fortheusers.org +credits.license = Licensed under the GPLv3 license. This app is free and open source because the users (like you!) deserve it. +credits.cta = Let's support homebrew and the right to control what software we run on our own devices! +credits.repo = Repo Maintenance and Development +credits.repo.desc = These are the primary people responsible for actively maintaining and developing the Homebrew App Store. If there's a problem, these are the ones to get in touch with! +credits.library = Library Development and Support +credits.library.desc = Without the contributions to open-source libraries and projects by these people, much of the functionality within this program wouldn't be possible. +credits.music = Music and Sound +credits.music.desc = In the Wii U and Switch releases, these guys provide the chiptune melodies that play in the background. They make the app feel more alive, and are all-around awesome! +credits.design = Interface Development and Design +credits.design.desc = In one way or another, everyone in this category provided information regarding core functionality, quality-of-life changes, or the design of the user interface. +credits.toolchain = Toolchain and Environment +credits.toolchain.desc = The organizations and people in this category enable Homebrew in general by creating and maintaining a cohesive environment for the community. +credits.extra = Homebrew Community Special Thanks +credits.extra.desc = Awesome people within the community whose work, words, or actions in some way inspired this program to exist in the manner it does. + +; App Details Sidebar +details.status = Download Status +details.cancel = Cancel +details.title = Title: +details.author = Author: +details.version = Version: +details.license = License: +details.package = Package: +details.downloads = Downloads: +details.updated = Updated: +details.size = Download Size: +details.installsize = Install Size: + +; App Details Main +details.download = Download +details.update = Update +details.remove = Remove +details.reinstall = Reinstall +details.download.verb = Downloading +details.install.verb = Installing +details.remove.verb = Removing +details.reloading = Reloading Metadata +details.syncing = Syncing Packages +details.analyzing = Analyzing Files + +; App Details Contents +contents.report = Report Issue +contents.more = More by Author +contents.placeholder1 = Package long description +contents.placeholder2 = If you're reading this text, something is wrong +contents.showinstalled = Show Installed Files List +contents.showchangelog = Show Changelog +contents.readmore = Read More... +contents.view = View +contents.hide = Hide +contents.show = Show +contents.files.installed = Installed Files List +contents.changelog = Changelog +contents.changelog.header = Changelog: +contents.files.current = Currently Installed Files: +contents.files.remote = Manifest of Remote Files: + +details.back = Back + +; Main App Listing +listing.sort.recent = by most recent +listing.sort.downloads = by download count +listing.sort.alpha = alphabetically +listing.sort.size = by size (descending) +listing.sort.random = randomly +listing.quit = Quit +listing.credits = Credits +listing.delete = Del +listing.adjustsort = Adjust Sort +listing.togglekeyboard = Toggle Keyboard +listing.search = Search: +listing.by = by +listing.appletwarning = NOTICE: You are in Applet mode! Google "Switch Applet Mode" for more info. +listing.debugwarning = NOTICE: You are using a dev build! Update to a stable release if this is unintended. + +; Feedback page +feedback.leaving = Leaving feedback for: +feedback.discard = Discard +feedback.submit = Submit +feedback.delete = Del +feedback.caps = Caps +feedback.help = If you need to send more detailed feedback, please email us at fight@fortheusers.org + +; Error Messages +errors.conntest = Perform a connection test in the Generic System Settings +errors.dnsmsg = Ensure DNS isn't blocking: +errors.norepos = No enabled repos found, check ./get/repos.json +errors.onepkg = Make sure repo has at least one package +errors.nowifi = Couldn't connect to the Internet! +errors.troubleshooting = Troubleshooting: + +; Sidebar Categories +sidebar.search = Search +sidebar.all = All Apps +sidebar.games = Games +sidebar.emulators = Emulators +sidebar.tools = Tools +sidebar.advanced = Advanced +sidebar.themes = Themes +sidebar.misc = Misc + +; Recovery Stuff +recovery.version = v2.3 for PLATFORM +recovery.title = Homebrew App Store (Recovery Mode) +recovery.thanks = Thanks to: +recovery.continue = Press [A] to manage packages +recovery.reset = Press [Y] to reset config data +recovery.reset.title = Reset Configuration Data +recovery.proverb1 = If every FRENCH FRY were perfect +recovery.proverb2 = we wouldn't have POTATO CHIPS! +recovery.instructions = Hold [L]+[R]+[A] to reset configuration data +recovery.report = Report an issue at: gitlab.com/4tu/hb-appstore +recovery.back = [B] Back +recovery.syncing = Syncing package metadata... +recovery.plswait = Just a moment! +recovery.title2 = Homebrew App Store Recovery +recovery.options = [A] Install [B] Back +recovery.footer1 = Page +recovery.footer2 = of +recovery.pages = Use left/right and up/down to switch pages and apps +recovery.actions.install = Press [A] to install this package +recovery.actions.remove = Press [X] to remove this package +recovery.actions.back = Press [B] to go back +recovery.downloading = Downloading package... +recovery.removing = Removing package... +recovery.warning1 = No progress bar available in this mode +recovery.plswait2 = Please wait! +recovery.success = Operation successful! +recovery.failure = Operation failed +recovery.cta = You can file an issue at gitlab.com/4tu/hb-appstore +recovery.pressa = Press [A] to continue +recovery.nopkgs = No packages found on any repos! diff --git a/resin/res/i18n/zh-cn.ini b/resin/res/i18n/zh-cn.ini new file mode 100644 index 0000000..a873100 --- /dev/null +++ b/resin/res/i18n/zh-cn.ini @@ -0,0 +1,137 @@ +; Homebrew App Store - Simplified Chinese language file +; Contributed by Faker_dev + +; Credits Section +credits.goback = 返回 +credits.feedback = 留下反馈 +credits.title = 自制插件商店 - 中文版 +credits.subtitle = 由 fortheusers.org 提供,中文版由 Faker_dev 提供翻译支持 +credits.license = 根据 GPLv3 许可证授权,这个应用是自由和开源的,因为对于每一个用户来说(比如你)都是应得的。 +credits.cta = 让我们支持自制软件和控制我们自己设备上运行什么软件的权利! +credits.repo = 库开发和支持 +credits.repo.desc = 这些是主要负责积极维护和开发自制应用商店的人,如果某些插件存在疑问,可以咨询插件的开发者! +credits.library = 库开发和支持 +credits.library.desc = 如果没有这些人对开源库和项目的贡献,这个程序内的许多功能都不可能实现。 +credits.music = 背景音乐和声音 +credits.music.desc = 在 Wii U 和 Switch 版本中,这些人提供了在背景中播放音乐的功能。他们让应用感觉更加生动,而且非常棒! +credits.design = 界面开发和设计 +credits.design.desc = 以某种方式,这个类别中的每个人都提供了关于核心功能、服务质量改进或用户界面设计等信息。 +credits.toolchain = 工具链和环境 +credits.toolchain.desc = 这一类别中的组织和人员通过创建和维护一个有凝聚力的环境,总体上使Switch自制软件成为可能。 +credits.extra = 自制软件社区特别感谢 +credits.extra.desc = 社区内部一些了不起的人,他们的工作、言语或行动在某种方式上激发了这个程序以其应该有的方式而存在。 + +; App Details Sidebar +details.status = 下载状态 +details.cancel = 取消 +details.title = 标题: +details.author = 作者: +details.version = 版本: +details.license = 许可证: +details.package = 包: +details.downloads = 下载量: +details.updated = 更新: +details.size = 下载大小: +details.installsize = 安装大小: + +; App Details Main +details.download = 下载 +details.update = 更新 +details.remove = 移除 +details.reinstall = 重新安装 +details.download.verb = 正在下载 +details.install.verb = 正在安装 +details.remove.verb = 正在移除 +details.reloading = 重新加载原始数据 +details.syncing = 同步包 +details.analyzing = 分析文件 + +; App Details Contents +contents.report = 报告问题 +contents.more = 作者的更多作品 +contents.placeholder1 = 文件描述 +contents.placeholder2 = 如果你正在读这段文字,那么程序出了点问题 +contents.showinstalled = 显示已安装文件列表 +contents.showchangelog = 显示更新日志 +contents.readmore = 阅读更多... +contents.view = 查看 +contents.hide = 隐藏 +contents.show = 显示 +contents.files.installed = 已安装文件列表 +contents.changelog = 更新日志 +contents.changelog.header = 更新日志: +contents.files.current = 当前已安装的文件: +contents.files.remote = 远程文件的清单: + +details.back = 返回 + +; Main App Listing +listing.sort.recent = 按最近更新 +listing.sort.downloads = 按下载量 +listing.sort.alpha = 按字母排序 +listing.sort.size = 按大小(降序) +listing.sort.random = 随机 +listing.quit = 退出 +listing.credits = 致谢 +listing.adjustsort = 调整排序 +listing.togglekeyboard = 切换键盘 +listing.search = 搜索: +listing.by = 由 + +; Feedback page +feedback.leaving = 留言反馈给: +feedback.discard = 放弃 +feedback.submit = 提交 +feedback.caps = 大写 +feedback.help = 如果你需要发送更详细的反馈,请通过 fight@fortheusers.org 给我们发送电子邮件 + +; Error Messages +errors.conntest = 在通用系统设置中执行连接测试 +errors.dnsmsg = 确保 DNS 没有被阻止: +errors.norepos = 未发现启用的仓库,请检查 ./get/repos.json +errors.onepkg = 确保仓库至少有一个包 +errors.nowifi = 无法连接到互联网! +errors.troubleshooting = 疑难解答: + +; Sidebar Categories +sidebar.search = 搜索 +sidebar.all = 所有应用 +sidebar.games = 游戏 +sidebar.emulators = 模拟器 +sidebar.tools = 工具 +sidebar.advanced = 高级 +sidebar.themes = 主题 +sidebar.misc = 杂项 + +; Recovery Stuff +recovery.version = 平台v2.3 +recovery.title = 自制插件商店(恢复模式) +recovery.thanks = 感谢: +recovery.continue = 按 [A] 管理包 +recovery.reset = 按 [Y] 重置配置数据 +recovery.reset.title = 重置配置数据 +recovery.proverb1 = 如果每个薯条都完美 +recovery.proverb2 = 我们就不会有薯片了! +recovery.instructions = 按住 [L]+[R]+[A] 重置配置数据 +recovery.report = 在 gitlab.com/4tu/hb-appstore 报告问题 + +recovery.back = [B] 返回 +recovery.syncing = 同步包元数据... +recovery.plswait = 请稍候! +recovery.title2 = 自制应用商店恢复 +recovery.options = [A] 安装 [B] 返回 +recovery.footer1 = 页面 +recovery.footer2 = 页数 +recovery.pages = 使用左/右和上/下切换页面和应用 +recovery.actions.install = 按 [A] 安装此包 +recovery.actions.remove = 按 [X] 移除此包 +recovery.actions.back = 按 [B] 返回 +recovery.downloading = 正在下载包... +recovery.removing = 正在移除包... +recovery.warning1 = 此模式下无进度条可用 +recovery.plswait2 = 请稍候! +recovery.success = 操作成功! +recovery.failure = 操作失败 +recovery.cta = 可在 gitlab.com/4tu/hb-appstore 提交问题 +recovery.pressa = 按 [A] 继续 +recovery.nopkgs = 未在任何仓库找到包! diff --git a/resin/res/lightmono.ttf b/resin/res/lightmono.ttf new file mode 100755 index 0000000..56ecda6 Binary files /dev/null and b/resin/res/lightmono.ttf differ diff --git a/resin/res/lightsans.ttf b/resin/res/lightsans.ttf new file mode 100644 index 0000000..cf8e0c7 Binary files /dev/null and b/resin/res/lightsans.ttf differ diff --git a/resin/res/nxicons.ttf b/resin/res/nxicons.ttf deleted file mode 100644 index 509308b..0000000 Binary files a/resin/res/nxicons.ttf and /dev/null differ