From 36b5d9c528760dc11c81f5b400acc3de3efc1e5b Mon Sep 17 00:00:00 2001 From: Pk11 Date: Fri, 19 Mar 2021 05:49:53 -0500 Subject: [PATCH] Add Chinese and fix some bugs (see desc) - Fix 3dsx in folder setting not being saved on exit - Fix font download on language selection not having a progress bar - Also update translations as to have something to test Chinese with --- include/utils/config.hpp | 6 +- romfs/lang/pl/app.json | 60 ++++++++-------- romfs/lang/uk/app.json | 6 +- romfs/lang/zh-CN/app.json | 143 ++++++++++++++++++++++++++++++++++++++ romfs/lang/zh-TW/app.json | 143 ++++++++++++++++++++++++++++++++++++++ source/menu/settings.cpp | 37 ++++++---- source/utils/config.cpp | 67 ++++++++++-------- 7 files changed, 385 insertions(+), 77 deletions(-) create mode 100644 romfs/lang/zh-CN/app.json create mode 100644 romfs/lang/zh-TW/app.json diff --git a/include/utils/config.hpp b/include/utils/config.hpp index 08cae17..344f898 100644 --- a/include/utils/config.hpp +++ b/include/utils/config.hpp @@ -86,6 +86,10 @@ public: bool customfont() const { return this->v_customFont; }; void customfont(bool v) { this->v_customFont = v; if (!this->changesMade) this->changesMade = true; }; + /* The most recently downloaded language font */ + std::string downloadedFont() const { return this->v_downloadedFont; }; + void downloadedFont(const std::string &v) { this->v_downloadedFont = v; if (!this->changesMade) this->changesMade = true; }; + /* The shortcut path. */ std::string shortcut() const { return this->v_shortcutPath; }; void shortcut(const std::string &v) { this->v_shortcutPath = v; if (!this->changesMade) this->changesMade = true; }; @@ -115,7 +119,7 @@ private: int v_theme = 0; - std::string v_language = "en", v_lastStore = "universal-db.unistore", + std::string v_language = "en", v_lastStore = "universal-db.unistore", v_downloadedFont = "", v_3dsxPath = "sdmc:/3ds", v_ndsPath = "sdmc:", v_archivePath = "sdmc:", v_shortcutPath = "sdmc:/3ds/Universal-Updater/shortcuts", v_firmPath = "sdmc:/luma/payloads"; diff --git a/romfs/lang/pl/app.json b/romfs/lang/pl/app.json index 03e0553..63b4237 100644 --- a/romfs/lang/pl/app.json +++ b/romfs/lang/pl/app.json @@ -1,11 +1,11 @@ { - "3DSX_IN_FOLDER": "Put 3DSX files in folder", - "3DSX_IN_FOLDER_DESC": "If enabled, 3DSX files will be put in a folder with the same name instead of directly in the set folder.", - "ACTION_CANCELED": "%s canceled!", - "ACTION_FAILED": "%s failed!", - "ACTION_REQUIRED": "Action required!", - "ACTION_SUCCEEDED": "%s succeeded!", - "ACTIVE_THEME": "Active Theme", + "3DSX_IN_FOLDER": "Umieść pliki 3DSX w folderze", + "3DSX_IN_FOLDER_DESC": "Jeśli włączone, pliki 3DSX zostaną umieszczone w folderze o tej samej nazwie zamiast bezpośrednio w wybranym folderze.", + "ACTION_CANCELED": "%s anulowane!", + "ACTION_FAILED": "%s nie powiodło się!", + "ACTION_REQUIRED": "Wymagane działanie!", + "ACTION_SUCCEEDED": "%s udane!", + "ACTIVE_THEME": "Aktywny motyw", "ASCENDING": "Rosnąco", "ARGUMENT_INVALID": "Argument jest nieprawidłowy.\nProszę sprawdzić plik xml dla właściwych argumentów.", "AUTHOR": "Autor", @@ -20,7 +20,7 @@ "CATEGORY": "Kategoria", "CHANGE_3DSX_PATH": "Zmień lokalizację 3DSX", "CHANGE_ARCHIVE_PATH": "Zmień lokalizację archiwum", - "CHANGE_FIRM_PATH": "Change firm path", + "CHANGE_FIRM_PATH": "Zmień ścieżkę firm", "CHANGE_NDS_PATH": "Zmień lokalizację NDS", "CHANGE_SHORTCUT_PATH": "Zmień ścieżkę skrótu", "CHECK_UNISTORE_UPDATES": "Sprawdzanie aktualizacji UniStore...", @@ -29,7 +29,7 @@ "CONNECT_WIFI": "Proszę połączyć się z WiFi.", "CONSOLE": "Konsola", "CONTRIBUTOR_TRANSLATORS": "- Wszyscy Tłumacze i Współpracownicy", - "COPYING": "Copying... %s / %s (%.2f%%)", + "COPYING": "Kopiowanie... %s / %s (%.2f%%)", "COPY_ERROR": "Błąd kopiowania!", "CREATE_SHORTCUT": "Czy chcesz teraz stworzyć skrót?", "CREDITS": "Współautorzy", @@ -40,7 +40,7 @@ "DELETE_ERROR": "Błąd usuwania!", "DELETE_PROMPT": "Czy na pewno chcesz usunąć ten Katalog?", "DELETE_UNNEEDED_FILE": "Usuwanie niepotrzebnego pliku...", - "DELETING": "Deleting...", + "DELETING": "Usuwanie...", "DESCENDING": "Malejąco", "DIRECTION": "Kierunek", "DIRECTORY_SETTINGS": "Ustawienia Katalogu", @@ -48,8 +48,8 @@ "DONE": "Gotowe!", "DOWNLOAD_ERROR": "Błąd pobierania!", "DOWNLOAD_FAILED": "Pobieranie nieudane!", - "DOWNLOAD_SPEED": "Speed: %lld KiB/s", - "DOWNLOADING": "Downloading... %s / %s (%.2f%%)", + "DOWNLOAD_SPEED": "Prędkość: %lld KiB/s", + "DOWNLOADING": "Pobieranie... %s / %s (%.2f%%)", "DOWNLOADING_COMPATIBLE_FONT": "Pobieranie kompatybilnej czcionki...", "DOWNLOADING_SPRITE_SHEET": "Pobieranie tekstur...", "DOWNLOADING_SPRITE_SHEET2": "Pobieranie tekstury %i z %i...", @@ -64,12 +64,12 @@ "ENTRIES": "Wpisy", "EXECUTE_ENTRY": "Czy chcesz wykonać ten wpis?", "EXIT_APP": "Wyjdź z Universal-Updater", - "EXTRACTING": "Extracting... %s / %s (%.2f%%)", - "EXTRACT_ERROR": "Extract error!", - "FEATURE_SIDE_EFFECTS": "This Feature may have side effects while the Queue is running.\nAre you sure you want to continue?", + "EXTRACTING": "Wypakowywanie... %s / %s (%.2f%%)", + "EXTRACT_ERROR": "Błąd wypakowywania!", + "FEATURE_SIDE_EFFECTS": "Ta funkcja może powodować działania niepożądane podczas działającej kolejki zadań.\nCzy na pewno chcesz kontynuować?", "FETCHING_METADATA": "Pobieranie starych metadanych...", "FETCHING_RECOMMENDED_UNISTORES": "Pobieranie rekomendowanych UniStores...", - "FILES": "File: %d / %d", + "FILES": "Plik: %d / %d", "FILE_EXTRACTED": "plik rozpakowany.", "FILE_SLASH": "Wygląda na to, że '/' jest dołączony, co nie jest obsługiwane.\nProszę zmienić 'plik' tylko na nazwę pliku.", "FILES_EXTRACTED": "pliki rozpakowane.", @@ -79,7 +79,7 @@ "GUI_SETTINGS": "Ustawienia Interfejsu", "GUI_SETTINGS_BTN": "Ustawienia Interfejsu...", "INCLUDE_IN_RESULTS": "Dołącz do wyników:", - "INSTALLING": "Installing... %s / %s (%.2f%%)", + "INSTALLING": "Instalowanie... %s / %s (%.2f%%)", "INSTALL_UNIVERSAL_UPDATER": "Instalowanie Universal-Updater...", "INVALID_UNISTORE": "Nieprawidłowy UniStore", "KEY_CONTINUE": "Naciśnij dowolny klawisz, aby kontynuować.", @@ -87,7 +87,7 @@ "LAST_UPDATED": "Ostatnia aktualizacja", "LICENSE": "Licencja", "LIST": "Lista", - "LOADING_SCREENSHOT": "Loading Screenshot...", + "LOADING_SCREENSHOT": "Ładowanie zrzutu ekranu...", "LOADING_SPRITESHEET": "Ładowanie tekstury %i z %i...", "MEDIATYPE_NAND": "Typ pliku NAND", "MEDIATYPE_SD": "Typ pliku SD", @@ -96,16 +96,16 @@ "NO_LICENSE": "Brak licencji", "NO_SCREENSHOTS_AVAILABLE": "Brak dostępnych zrzutów ekranu", "NOT_IMPLEMENTED": "Jeszcze nie zaimplementowane", - "OP_COPYING": "Copying", - "OP_DELETING": "Deleting", - "OP_DOWNLOADING": "Downloading", - "OP_EXTRACTING": "Extracting", - "OP_INSTALLING": "Installing", - "OP_MOVING": "Moving", - "OP_WAITING": "Waiting", - "QUEUE": "Queue", - "QUEUE_POSITION": "Queue position", - "QUEUE_PROGRESS": "Step: %d / %d", + "OP_COPYING": "Kopiowanie", + "OP_DELETING": "Usuwanie", + "OP_DOWNLOADING": "Pobieranie", + "OP_EXTRACTING": "Wypakowywanie", + "OP_INSTALLING": "Instalowanie", + "OP_MOVING": "Przenoszenie", + "OP_WAITING": "Oczekuje", + "QUEUE": "Kolejka", + "QUEUE_POSITION": "Pozycja w kolejce", + "QUEUE_PROGRESS": "Krok %d / %d", "RECOMMENDED_UNISTORES": "Rekomendowane UniStores", "REVISION": "Wersja", "SCREENSHOT": "Zrzut ekranu %d / %d", @@ -116,7 +116,7 @@ "SELECT_LANG": "Wybierz język", "SELECT_UNISTORE": "Wybierz UniStore", "SELECT_UNISTORE_2": "Wybierz UniStore", - "SELECTION_QUEUE": "Add Selection to Queue", + "SELECTION_QUEUE": "Dodaj zaznaczenie do kolejki", "SETTINGS": "Ustawienia", "SHEET_SLASH": "Wygląda na to, że '/' jest dołączony, co nie jest obsługiwane.\nProszę zmienić 'sheet' tylko na nazwę pliku.", "SHORTCUT_CREATED": "Skrót utworzony!", @@ -126,7 +126,7 @@ "START_SELECT": "Naciśnij przycisk START, aby wybrać bieżący folder", "STORE_INFO": "Informacje o sklepie", "SYNTAX_ERROR": "Błąd składni!", - "THEME_DEFAULT": "Default", + "THEME_DEFAULT": "Domyślne", "TITLE": "Tytuł", "TOP_STYLE": "Styl Góry", "UNISTORE_BG": "Użyj tła UniStore", diff --git a/romfs/lang/uk/app.json b/romfs/lang/uk/app.json index 3c3adc2..9c7548d 100644 --- a/romfs/lang/uk/app.json +++ b/romfs/lang/uk/app.json @@ -3,9 +3,9 @@ "3DSX_IN_FOLDER_DESC": "При активації файли 3DSX зберігатимуться в теці з тим самим іменем, а не у вибраній теці.", "ACTION_CANCELED": "%s скасовано!", "ACTION_FAILED": "%s помилка!", - "ACTION_REQUIRED": "Підтвердьте дію!", + "ACTION_REQUIRED": "Потрібна дія!", "ACTION_SUCCEEDED": "%s завершено!", - "ACTIVE_THEME": "Активна тема", + "ACTIVE_THEME": "Тема", "ASCENDING": "За зростанням", "ARGUMENT_INVALID": "Аргумент не дійсний.\nБудь ласка, перевірте XML-файл на наявність правильних аргументів.", "AUTHOR": "Автор", @@ -66,7 +66,7 @@ "EXIT_APP": "Вийти з Universal-Updater", "EXTRACTING": "Розпаковування... %s / %s (%.2f%%)", "EXTRACT_ERROR": "Помилка розпаковування!", - "FEATURE_SIDE_EFFECTS": "This Feature may have side effects while the Queue is running.\nAre you sure you want to continue?", + "FEATURE_SIDE_EFFECTS": "Ця функція може мати побічні ефекти під час роботи черги.\nВи впевнені, що хочете продовжити?", "FETCHING_METADATA": "Отримання старих метаданих...", "FETCHING_RECOMMENDED_UNISTORES": "Отримання рекомендованих UniStores...", "FILES": "Файл: %d / %d", diff --git a/romfs/lang/zh-CN/app.json b/romfs/lang/zh-CN/app.json new file mode 100644 index 0000000..969c988 --- /dev/null +++ b/romfs/lang/zh-CN/app.json @@ -0,0 +1,143 @@ +{ + "3DSX_IN_FOLDER": "将 3DSX 文件放置到文件夹内", + "3DSX_IN_FOLDER_DESC": "启用后,3DSX文件将会被放入同名文件夹内,而不是直接放在预设文件夹中", + "ACTION_CANCELED": "%s 已取消!", + "ACTION_FAILED": "%s 失败!", + "ACTION_REQUIRED": "需要进行操作!", + "ACTION_SUCCEEDED": "%s 成功!", + "ACTIVE_THEME": "当前主题", + "ASCENDING": "升序", + "ARGUMENT_INVALID": "参数无效。\n请检查 xml 文件以获取正确的参数。", + "AUTHOR": "作者", + "AUTO_UPDATE_SETTINGS": "自动更新设置", + "AUTO_UPDATE_SETTINGS_BTN": "自动更新设置……", + "AUTO_UPDATE_UNISTORE": "自动更新 UniStores", + "AUTO_UPDATE_UNISTORE_DESC": "启用后,UniStore 将会在下一次启动 Universal-Updater 时自动更新。", + "AUTO_UPDATE_UU": "自动更新 Universal-Updater", + "AUTO_UPDATE_UU_DESC": "启用后,Universal-Updater 将在每次启动时检查更新。", + "AVAILABLE_DOWNLOADS": "可选下载", + "BOOT_TITLE": "您想启动这个应用程序吗?", + "CATEGORY": "类别", + "CHANGE_3DSX_PATH": "更改 3DSX 路径", + "CHANGE_ARCHIVE_PATH": "更改归档路径", + "CHANGE_FIRM_PATH": "更改固件(firm)路径", + "CHANGE_NDS_PATH": "更改 NDS 路径", + "CHANGE_SHORTCUT_PATH": "更改快捷方式路径", + "CHECK_UNISTORE_UPDATES": "正在检查 UniStore 更新...", + "CHECK_UU_UPDATES": "正在检查 Universal-Updater 更新...", + "CONFIRM_OR_CANCEL": "请按  键确认,或按  键取消。", + "CONNECT_WIFI": "请连接到 WiFi 热点。", + "CONSOLE": "主机平台", + "CONTRIBUTOR_TRANSLATORS": "- 所有翻译者及贡献者", + "COPYING": "正在复制... %s / %s (%.2f%%)", + "COPY_ERROR": "复制错误!", + "CREATE_SHORTCUT": "您想要创建一个快捷方式吗?", + "CREDITS": "致谢名单", + "CURRENT_VERSION": "当前版本: ", + "CURRENTLY_EXTRACTING": "正在提取:", + "CUSTOM_FONT": "使用自定义字体", + "CUSTOM_FONT_DESC": "启用后,如果找到 'sdmc:/3ds/Universal-Updater/font.bcfnt',将使用该字体替代系统字体。", + "DELETE_ERROR": "删除错误!", + "DELETE_PROMPT": "您确定要删除此目录吗?", + "DELETE_UNNEEDED_FILE": "正在删除不需要的文件……", + "DELETING": "正在删除……", + "DESCENDING": "降序", + "DIRECTION": "方向", + "DIRECTORY_SETTINGS": "目录设置", + "DIRECTORY_SETTINGS_BTN": "目录设置...", + "DONE": "完成!", + "DOWNLOAD_ERROR": "下载错误!", + "DOWNLOAD_FAILED": "下载失败!", + "DOWNLOAD_SPEED": "速度: %lld KiB/秒", + "DOWNLOADING": "正在下载... %s / %s (%.2f%%)", + "DOWNLOADING_COMPATIBLE_FONT": "正在下载兼容字体……", + "DOWNLOADING_SPRITE_SHEET": "正在下载贴图集……", + "DOWNLOADING_SPRITE_SHEET2": "正在下载贴图集 %i / %i……", + "DOWNLOADING_UNIVERSAL_DB": "正在下载 Universal-DB……", + "DONLOADING_UNIVERSAL_UPDATER": "正在下载 Universal-Updater……", + "DOWNLOADING_UNISTORE": "正在下载 UniStore……", + "ENTER_DESC_SHORTCUT": "输入快捷方式描述。", + "ENTER_SEARCH": "输入您想搜索的内容。", + "ENTER_SHORTCUT_FILENAME": "输入快捷方式文件名 (不包含扩展名)。", + "ENTER_TITLE_SHORTCUT": "输入快捷方式标题", + "ENTER_URL": "输入 UniStore 的 URL。", + "ENTRIES": "条目", + "EXECUTE_ENTRY": "您想要执行此条目吗?", + "EXIT_APP": "退出 Universal-Updater", + "EXTRACTING": "正在提取…… %s / %s (%.2f%%)", + "EXTRACT_ERROR": "提取错误!", + "FEATURE_SIDE_EFFECTS": "此功能可能会在队列运行时产生副作用。\n您确定要继续吗?", + "FETCHING_METADATA": "正在获取旧的元数据.……", + "FETCHING_RECOMMENDED_UNISTORES": "正在获取推荐的 UniStores……", + "FILES": "文件: %d / %d", + "FILE_EXTRACTED": "文件已提取。", + "FILE_SLASH": "看起来包含了一个不支持的字符 '/'。\n请将“文件”更改为只包含文件名的形式。", + "FILES_EXTRACTED": "文件已提取。", + "FILTER_TO": "过滤到:", + "GITHUB": "完整的人员名单可以在 GitHub 上找到", + "GRID": "网格", + "GUI_SETTINGS": "用户界面设置", + "GUI_SETTINGS_BTN": "用户界面设置...", + "INCLUDE_IN_RESULTS": "包含结果:", + "INSTALLING": "正在安装... %s / %s (%.2f%%)", + "INSTALL_UNIVERSAL_UPDATER": "正在安装 Universal-Updater...", + "INVALID_UNISTORE": "无效的 UniStore", + "KEY_CONTINUE": "按任意键继续。", + "LANGUAGE": "语言", + "LAST_UPDATED": "最后更新", + "LICENSE": "许可协议", + "LIST": "清单", + "LOADING_SCREENSHOT": "正在加载屏幕截图...", + "LOADING_SPRITESHEET": "正在加载贴图集 %i / %i……", + "MEDIATYPE_NAND": "介质类型 NAND", + "MEDIATYPE_SD": "介质类型 SD", + "MOVE_ERROR": "移动错误!", + "NO_DOWNLOADS_AVAILABLE": "无可用下载", + "NO_LICENSE": "没有许可证", + "NO_SCREENSHOTS_AVAILABLE": "无可用屏幕截图", + "NOT_IMPLEMENTED": "尚未实现", + "OP_COPYING": "正在复制", + "OP_DELETING": "删除中", + "OP_DOWNLOADING": "正在下载", + "OP_EXTRACTING": "正在提取", + "OP_INSTALLING": "正在安装", + "OP_MOVING": "正在移动", + "OP_WAITING": "等待中", + "QUEUE": "队列", + "QUEUE_POSITION": "队列位置", + "QUEUE_PROGRESS": "步骤: %d / %d", + "RECOMMENDED_UNISTORES": "推荐的 UniStore 源", + "REVISION": "修订版本", + "SCREENSHOT": "截图 %d / %d", + "SCREENSHOT_COULD_NOT_LOAD": "无法加载屏幕截图。", + "SCREENSHOT_INSTRUCTIONS": "按  键变换,按  键缩放", + "SEARCH_FILTERS": "搜索和过滤", + "SELECT_DIR": "选择一个目录", + "SELECT_LANG": "选择语言", + "SELECT_UNISTORE": "选择 UniStore", + "SELECT_UNISTORE_2": "请选择一个 UniStore", + "SELECTION_QUEUE": "添加选中内容到队列", + "SETTINGS": "设置", + "SHEET_SLASH": "看起来包含了一个不支持的字符 '/'。\n请将“表”更改为只包含文件名的形式。", + "SHORTCUT_CREATED": "快捷方式已创建!", + "SIZE": "大小", + "SORT_BY": "排序方式", + "SORTING": "排序", + "START_SELECT": "点击START按钮选择当前文件夹", + "STORE_INFO": "商店信息", + "SYNTAX_ERROR": "语法错误!", + "THEME_DEFAULT": "默认", + "TITLE": "标题", + "TOP_STYLE": "上屏幕样式", + "UNISTORE_BG": "使用 UniStore 背景图", + "UNISTORE_BG_DESC": "启用后,将在上屏幕显示 UniStore 提供的背景图,而非预设的纯色背景。", + "UNISTORE_INVALID_ERROR": "该 UniStore 无效,\nUniversal-Updater 无法加载。\n请检查是否存在语法错误?", + "UNISTORE_TOO_NEW": "您的 Universal-Updater 版本过低,\n无法使用该 UniStore 。\n请更新到最新版本。", + "UNISTORE_TOO_OLD": "该 UniStore 已过期,\n无法与当前版本的 Universal-Updater 配合使用。\n请向商店创建者请求更新。", + "UPDATE_AVAILABLE": "更新版本现已可用!", + "UPDATE_DONE": "更新完成 !请重新打开 Universal-Updater。", + "UPDATING_SPRITE_SHEET": "正在更新贴图集……", + "UPDATING_SPRITE_SHEET2": "正在更新贴图集 %i / %i……", + "UPDATING_UNISTORE": "正在更新 UniStore...", + "VERSION": "版本" +} \ No newline at end of file diff --git a/romfs/lang/zh-TW/app.json b/romfs/lang/zh-TW/app.json new file mode 100644 index 0000000..a5303d9 --- /dev/null +++ b/romfs/lang/zh-TW/app.json @@ -0,0 +1,143 @@ +{ + "3DSX_IN_FOLDER": "Put 3DSX files in folder", + "3DSX_IN_FOLDER_DESC": "If enabled, 3DSX files will be put in a folder with the same name instead of directly in the set folder.", + "ACTION_CANCELED": "%s 取消!", + "ACTION_FAILED": "%s 失敗。", + "ACTION_REQUIRED": "Action required!", + "ACTION_SUCCEEDED": "%s 成功!", + "ACTIVE_THEME": "使用中主題", + "ASCENDING": "遞增序", + "ARGUMENT_INVALID": "Argument invalid.\nPlease check the xml file for proper arguments.", + "AUTHOR": "作者", + "AUTO_UPDATE_SETTINGS": "自動更新設定", + "AUTO_UPDATE_SETTINGS_BTN": "自動更新設定...", + "AUTO_UPDATE_UNISTORE": "自動更新 UniStore", + "AUTO_UPDATE_UNISTORE_DESC": "With this, the last used UniStore will be updated automatically when launching Universal-Updater.", + "AUTO_UPDATE_UU": "Auto-update Universal-Updater", + "AUTO_UPDATE_UU_DESC": "When enabled, Universal-Updater will check for updates every time it's opened.", + "AVAILABLE_DOWNLOADS": "可用下載", + "BOOT_TITLE": "您想要開啓這個程式嗎?", + "CATEGORY": "類別", + "CHANGE_3DSX_PATH": "Change 3DSX path", + "CHANGE_ARCHIVE_PATH": "Change archive path", + "CHANGE_FIRM_PATH": "Change firm path", + "CHANGE_NDS_PATH": "Change NDS path", + "CHANGE_SHORTCUT_PATH": "改變捷徑", + "CHECK_UNISTORE_UPDATES": "Checking for UniStore updates...", + "CHECK_UU_UPDATES": "Checking for Universal-Updater updates...", + "CONFIRM_OR_CANCEL": "Press  to confirm,  to cancel.", + "CONNECT_WIFI": "Please Connect to WiFi.", + "CONSOLE": "Console", + "CONTRIBUTOR_TRANSLATORS": "- All Translators & Contributors", + "COPYING": "Copying... %s / %s (%.2f%%)", + "COPY_ERROR": "複製錯誤!", + "CREATE_SHORTCUT": "您想要創建一個捷徑嗎?", + "CREDITS": "鳴謝", + "CURRENT_VERSION": "目前版本: ", + "CURRENTLY_EXTRACTING": "Currently extracting:", + "CUSTOM_FONT": "使用自訂字型", + "CUSTOM_FONT_DESC": "If enabled, 'sdmc:/3ds/Universal-Updater/font.bcfnt' will be used instead of the system font, if found.", + "DELETE_ERROR": "刪除出錯", + "DELETE_PROMPT": "您確定要刪除此資料夾嗎?", + "DELETE_UNNEEDED_FILE": "正在刪除不需要的檔案...", + "DELETING": "刪除中...", + "DESCENDING": "遞減序", + "DIRECTION": "方向", + "DIRECTORY_SETTINGS": "目錄設定", + "DIRECTORY_SETTINGS_BTN": "目錄設定...", + "DONE": "完成!", + "DOWNLOAD_ERROR": "下載發生錯誤", + "DOWNLOAD_FAILED": "下載失敗。", + "DOWNLOAD_SPEED": "Speed: %lld KiB/s", + "DOWNLOADING": "Downloading... %s / %s (%.2f%%)", + "DOWNLOADING_COMPATIBLE_FONT": "Downloading compatible font...", + "DOWNLOADING_SPRITE_SHEET": "Downloading Spritesheet...", + "DOWNLOADING_SPRITE_SHEET2": "Downloading Spritesheet %i of %i...", + "DOWNLOADING_UNIVERSAL_DB": "Downloading Universal-DB...", + "DONLOADING_UNIVERSAL_UPDATER": "Downloading Universal-Updater...", + "DOWNLOADING_UNISTORE": "Downloading UniStore...", + "ENTER_DESC_SHORTCUT": "Enter the shortcut description.", + "ENTER_SEARCH": "Enter what you like to search.", + "ENTER_SHORTCUT_FILENAME": "Enter the shortcut filename (without extension).", + "ENTER_TITLE_SHORTCUT": "Enter the shortcut title.", + "ENTER_URL": "Enter the URL of the UniStore.", + "ENTRIES": "Entries", + "EXECUTE_ENTRY": "Would you like to execute this entry?", + "EXIT_APP": "Exit Universal-Updater", + "EXTRACTING": "Extracting... %s / %s (%.2f%%)", + "EXTRACT_ERROR": "Extract error!", + "FEATURE_SIDE_EFFECTS": "This Feature may have side effects while the Queue is running.\nAre you sure you want to continue?", + "FETCHING_METADATA": "Fetching old metadata...", + "FETCHING_RECOMMENDED_UNISTORES": "Fetching recommended UniStores...", + "FILES": "File: %d / %d", + "FILE_EXTRACTED": "file extracted.", + "FILE_SLASH": "Seems like a '/' is included, which is not supported.\nPlease change 'file' to filename only.", + "FILES_EXTRACTED": "files extracted.", + "FILTER_TO": "Filter to:", + "GITHUB": "Full credits can be found on GitHub", + "GRID": "Grid", + "GUI_SETTINGS": "GUI Settings", + "GUI_SETTINGS_BTN": "GUI settings...", + "INCLUDE_IN_RESULTS": "Include in results:", + "INSTALLING": "Installing... %s / %s (%.2f%%)", + "INSTALL_UNIVERSAL_UPDATER": "Installing Universal-Updater...", + "INVALID_UNISTORE": "Invalid UniStore", + "KEY_CONTINUE": "按任意鍵繼續。", + "LANGUAGE": "語言", + "LAST_UPDATED": "最後更新", + "LICENSE": "授權協議", + "LIST": "列表視圖", + "LOADING_SCREENSHOT": "正在載入螢幕擷取畫面...", + "LOADING_SPRITESHEET": "Loading Spritesheet %i of %i...", + "MEDIATYPE_NAND": "MediaType NAND", + "MEDIATYPE_SD": "MediaType SD", + "MOVE_ERROR": "移動時發生錯誤!", + "NO_DOWNLOADS_AVAILABLE": "無下載可用", + "NO_LICENSE": "無授權", + "NO_SCREENSHOTS_AVAILABLE": "No Screenshots available", + "NOT_IMPLEMENTED": "尚未實現", + "OP_COPYING": "Copying", + "OP_DELETING": "刪除中", + "OP_DOWNLOADING": "下載中", + "OP_EXTRACTING": "抽取中", + "OP_INSTALLING": "安裝中", + "OP_MOVING": "正在移動", + "OP_WAITING": "等待中", + "QUEUE": "排程", + "QUEUE_POSITION": "排程位置", + "QUEUE_PROGRESS": "Step: %d / %d", + "RECOMMENDED_UNISTORES": "Recommended UniStores", + "REVISION": "修訂版本", + "SCREENSHOT": "Screenshot %d / %d", + "SCREENSHOT_COULD_NOT_LOAD": "無法載入螢幕擷取畫面", + "SCREENSHOT_INSTRUCTIONS": "Press  to change and  to zoom", + "SEARCH_FILTERS": "搜尋和過濾", + "SELECT_DIR": "請選擇一個目錄", + "SELECT_LANG": "選擇語言", + "SELECT_UNISTORE": "Select UniStore", + "SELECT_UNISTORE_2": "Select a UniStore", + "SELECTION_QUEUE": "Add Selection to Queue", + "SETTINGS": "設定", + "SHEET_SLASH": "Seems like a '/' is included, which is not supported.\nPlease change 'sheet' to filename only.", + "SHORTCUT_CREATED": "捷徑已建立", + "SIZE": "容量", + "SORT_BY": "排序依據", + "SORTING": "分類中", + "START_SELECT": "Press START to select the current folder", + "STORE_INFO": "Store Info", + "SYNTAX_ERROR": "語法錯誤!", + "THEME_DEFAULT": "預設值", + "TITLE": "標題", + "TOP_STYLE": "Top Style", + "UNISTORE_BG": "Use UniStore BG", + "UNISTORE_BG_DESC": "When enabled, the UniStore's provided BG will be shown instead of the solid BG color for the top screen.", + "UNISTORE_INVALID_ERROR": "This UniStore is invalid and cannot be\nloaded with Universal-Updater.\nMaybe check if there are any Syntax errors?", + "UNISTORE_TOO_NEW": "Your version of Universal-Updater is\ntoo old to use this UniStore.\nPlease update to the latest version.", + "UNISTORE_TOO_OLD": "This UniStore is outdated and cannot be used\nwith this version of Universal-Updater.\nPlease ask the creator to update it.", + "UPDATE_AVAILABLE": "Update Available!", + "UPDATE_DONE": "Update done! Please re-open Universal-Updater.", + "UPDATING_SPRITE_SHEET": "Updating Spritesheet...", + "UPDATING_SPRITE_SHEET2": "Updating Spritesheet %i of %i...", + "UPDATING_UNISTORE": "Updating UniStore...", + "VERSION": "Version" +} \ No newline at end of file diff --git a/source/menu/settings.cpp b/source/menu/settings.cpp index fc5a583..1ea2d5f 100644 --- a/source/menu/settings.cpp +++ b/source/menu/settings.cpp @@ -85,10 +85,8 @@ static const std::vector mainStrings = { "LANGUAGE", "SELECT_UNISTO static const std::vector dirStrings = { "CHANGE_3DSX_PATH", "3DSX_IN_FOLDER", "CHANGE_NDS_PATH", "CHANGE_ARCHIVE_PATH", "CHANGE_SHORTCUT_PATH", "CHANGE_FIRM_PATH" }; /* Note: Украïнська is spelled using a latin i with dieresis to work in the system font */ -//static const std::vector languages = { "Bruh", "Dansk", "Deutsch", "English", "Español", "Français", "Italiano", "Lietuvių", "Magyar", "Polski", "Português", "Português (Brasil)", "Русский", "Украïнська", "日本語" }; -//static const std::string langsTemp[] = { "br", "da", "de", "en", "es", "fr", "it", "lt", "hu", "pl", "pt", "pt-BR", "ru", "uk", "jp"}; -static const std::vector languages = { "Bruh", "Deutsch", "English", "Español", "Français", "Italiano", "Magyar", "Polski", "Português", "Português (Brasil)", "Русский", "Украïнська", "日本語" }; -static const std::string langsTemp[] = { "br", "de", "en", "es", "fr", "it", "hu", "pl", "pt", "pt-BR", "ru", "uk", "jp"}; +static const std::vector languages = { "Bruh", "Deutsch", "English", "Español", "Français", "Italiano", /* "Lietuvių", */ "Magyar", /* "Nederlands", */ "Polski", "Português", "Português (Brasil)", "Русский", "Украïнська", /* "עברית", */ "中文 (简体)", "中文 (繁體)", "日本語", /* "한국어" */ }; +static const std::string langsTemp[] = { "br", "de", "en", "es", "fr", "it", /* "lt", */ "hu", /* "nl", */ "pl", "pt", "pt-BR", "ru", "uk", /* "he", */ "zh-CN", "zh-TW", "jp", /* "ko" */ }; static const std::vector ThemeNames = { "THEME_DEFAULT", "Stack" }; @@ -578,10 +576,14 @@ static void LanguageLogic(int &page, int &selection, int &sPos) { if (hDown & KEY_A) { const std::string l = langsTemp[selection]; - /* Check if is "uk". */ - if (l == "uk") { - if (access("sdmc:/3ds/Universal-Updater/font.bcfnt", F_OK) != 0) { - ScriptUtils::downloadFile("https://github.com/Universal-Team/extras/raw/master/files/universal-updater.bcfnt", "sdmc:/3ds/Universal-Updater/font.bcfnt", Lang::get("DOWNLOADING_COMPATIBLE_FONT")); + /* Check if language needs a custom font. */ + u8 region; + CFGU_SecureInfoGetRegion(®ion); + if (l == "uk" || (l == "zh-CN" && region != CFG_REGION_CHN) || (l == "zh-TW" && region != CFG_REGION_TWN)) { + if (access("sdmc:/3ds/Universal-Updater/font.bcfnt", F_OK) != 0 || config->downloadedFont() != l) { + ScriptUtils::downloadFile("https://github.com/Universal-Team/extras/raw/master/files/" + l + ".bcfnt", "sdmc:/3ds/Universal-Updater/font.bcfnt", Lang::get("DOWNLOADING_COMPATIBLE_FONT"), true); + config->downloadedFont(l); + Init::UnloadFont(); } config->customfont(true); @@ -601,10 +603,14 @@ static void LanguageLogic(int &page, int &selection, int &sPos) { if (i + sPos < (int)languages.size()) { const std::string l = langsTemp[i + sPos]; - /* Check if is "uk". */ - if (l == "uk") { - if (access("sdmc:/3ds/Universal-Updater/font.bcfnt", F_OK) != 0) { - ScriptUtils::downloadFile("https://github.com/Universal-Team/extras/raw/master/files/universal-updater.bcfnt", "sdmc:/3ds/Universal-Updater/font.bcfnt", Lang::get("DOWNLOADING_COMPATIBLE_FONT")); + /* Check if language needs a custom font. */ + u8 region; + CFGU_SecureInfoGetRegion(®ion); + if (l == "uk" || (l == "zh-CN" && region != CFG_REGION_CHN) || (l == "zh-TW" && region != CFG_REGION_TWN)) { + if (access("sdmc:/3ds/Universal-Updater/font.bcfnt", F_OK) != 0 || config->downloadedFont() != l) { + ScriptUtils::downloadFile("https://github.com/Universal-Team/extras/raw/master/files/" + l + ".bcfnt", "sdmc:/3ds/Universal-Updater/font.bcfnt", Lang::get("DOWNLOADING_COMPATIBLE_FONT"), true); + config->downloadedFont(l); + Init::UnloadFont(); } config->customfont(true); @@ -624,8 +630,13 @@ static void LanguageLogic(int &page, int &selection, int &sPos) { if (hDown & KEY_TOUCH) { if (touching(touch, langButtons[6])) { /* Download Font. */ - ScriptUtils::downloadFile("https://github.com/Universal-Team/extras/raw/master/files/universal-updater.bcfnt", "sdmc:/3ds/Universal-Updater/font.bcfnt", Lang::get("DOWNLOADING_COMPATIBLE_FONT"), true); + std::string l = config->language(); + if(l != "uk" && l != "zh-CN" && l != "zh-TW") + l = "uk"; + ScriptUtils::downloadFile("https://github.com/Universal-Team/extras/raw/master/files/" + l + ".bcfnt", "sdmc:/3ds/Universal-Updater/font.bcfnt", Lang::get("DOWNLOADING_COMPATIBLE_FONT"), true); + config->downloadedFont(l); config->customfont(true); + Init::UnloadFont(); Init::LoadFont(); } } diff --git a/source/utils/config.cpp b/source/utils/config.cpp index e9f17cc..0166b58 100644 --- a/source/utils/config.cpp +++ b/source/utils/config.cpp @@ -27,6 +27,7 @@ #include "common.hpp" #include "config.hpp" #include "json.hpp" +#include "scriptUtils.hpp" #include #include @@ -39,59 +40,55 @@ void Config::sysLang() { switch(language) { case 0: - this->language("jp"); + this->language("jp"); // Japanese break; case 1: - this->language("en"); + this->language("en"); // English break; case 2: - this->language("fr"); + this->language("fr"); // French break; case 3: - this->language("de"); + this->language("de"); // German break; case 4: - this->language("it"); + this->language("it"); // Italian break; case 5: - this->language("es"); - break; - - /* - case 6: - this->language("sc"); //simplified chinese - break; - - case 7: - this->language("kr") //korean - break; - */ - - case 8: - this->language("nl"); + this->language("es"); // Spanish break; + case 6: + this->language("zh-CN"); // Chinese (Simplified) + break; + + // case 7: + // this->language("ko"); // Korean + // break; + + // case 8: + // this->language("nl"); // Dutch + // break; + case 9: - this->language("pt"); + this->language("pt"); // Portuguese break; case 10: - this->language("ru"); + this->language("ru"); // Russian break; - - /* + case 11: - this->language("tc") //traditional chinese + this->language("zh-TW"); // Chinese (Traditional) break; - */ default: - this->language("en"); //for Simplified chinese (6), korean (7) and traditional chinese (11), which are not translated. also in case something goes wrong + this->language("en"); // Fall back to English if missing break; } } @@ -121,13 +118,11 @@ Config::Config() { /* Let us create a new one. */ if (!this->json.contains("Version")) this->initialize(); - if (!this->json.contains("Language")) this->sysLang(); - else this->language(this->getString("Language")); - if (this->json.contains("LastStore")) this->lastStore(this->getString("LastStore")); if (this->json.contains("List")) this->list(this->getBool("List")); if (this->json.contains("AutoUpdate")) this->autoupdate(this->getBool("AutoUpdate")); if (this->json.contains("_3DSX_Path")) this->_3dsxPath(this->getString("_3DSX_Path")); + if (this->json.contains("_3DSX_InFolder")) this->_3dsxInFolder(this->getBool("_3DSX_InFolder")); if (this->json.contains("NDS_Path")) this->ndsPath(this->getString("NDS_Path")); if (this->json.contains("Archive_Path")) this->archPath(this->getString("Archive_Path")); if (this->json.contains("Firm_Path")) this->firmPath(this->getString("Firm_Path")); @@ -135,11 +130,21 @@ Config::Config() { if (this->json.contains("UpdateCheck")) this->updatecheck(this->getBool("UpdateCheck")); if (this->json.contains("UseBG")) this->usebg(this->getBool("UseBG")); if (this->json.contains("CustomFont")) this->customfont(this->getBool("CustomFont")); + if (this->json.contains("DownloadedFont")) this->downloadedFont(this->getString("DownloadedFont")); if (this->json.contains("Shortcut_Path")) this->shortcut(this->getString("Shortcut_Path")); if (this->json.contains("Display_Changelog")) this->changelog(this->getBool("Display_Changelog")); if (this->json.contains("Active_Theme")) this->theme(this->getInt("Active_Theme")); if (this->json.contains("Prompt")) this->prompt(this->getBool("Prompt")); + if (!this->json.contains("Language")) { + this->sysLang(); + if((this->language() == "zh-CN" || this->language() == "zh-TW") && (access("sdmc:/3ds/Universal-Updater/font.bcfnt", F_OK) != 0 || this->downloadedFont() != this->language())) { + ScriptUtils::downloadFile("https://github.com/Universal-Team/extras/raw/master/files/" + this->language() + ".bcfnt", "sdmc:/3ds/Universal-Updater/font.bcfnt", "Downloading compatible font...", true); + this->downloadedFont(this->language()); + this->customfont(true); + } + } else this->language(this->getString("Language")); + this->changesMade = false; // No changes made yet. } @@ -155,6 +160,7 @@ void Config::save() { this->setBool("List", this->list()); this->setBool("AutoUpdate", this->autoupdate()); this->setString("_3DSX_Path", this->_3dsxPath()); + this->setBool("_3DSX_InFolder", this->_3dsxInFolder()); this->setString("NDS_Path", this->ndsPath()); this->setString("Archive_Path", this->archPath()); this->setString("Firm_Path", this->firmPath()); @@ -162,6 +168,7 @@ void Config::save() { this->setBool("UpdateCheck", this->updatecheck()); this->setBool("UseBG", this->usebg()); this->setBool("CustomFont", this->customfont()); + this->setString("DownloadedFont", this->downloadedFont()); this->setString("Shortcut_Path", this->shortcut()); this->setBool("Display_Changelog", this->changelog()); this->setInt("Active_Theme", this->theme());