feat: switch config to C API and add missing strings

~40% bianry size reduction from RTTI/exceptions overhead
This commit is contained in:
Ash Logan 2026-07-27 22:27:13 +10:00
commit ccf5370f84
15 changed files with 171 additions and 135 deletions

View file

@ -37,6 +37,11 @@ struct config_strings {
std::string_view multiplayer_port_display; std::string_view multiplayer_port_display;
std::string_view module_not_found; std::string_view module_not_found;
std::string_view module_init_not_found; std::string_view module_init_not_found;
std::string_view setting_yes;
std::string_view setting_no;
std::string_view language_setting;
std::string_view language_name;
std::string_view system_language;
}; };
config_strings get_config_strings(inkay_language language); config_strings get_config_strings(inkay_language language);

View file

@ -56,67 +56,63 @@ static void report_storage_error(WUPSStorageError err) {
DEBUG_FUNCTION_LINE_VERBOSE("WUPS storage error: %s", WUPSStorageAPI_GetStatusStr(err)); DEBUG_FUNCTION_LINE_VERBOSE("WUPS storage error: %s", WUPSStorageAPI_GetStatusStr(err));
} }
static void connect_to_network_changed(ConfigItemBoolean* item, bool new_value) { static void connect_to_network_changed(ConfigItemBoolean *item, bool new_value) {
DEBUG_FUNCTION_LINE_VERBOSE("connect_to_network changed to: %d", new_value); DEBUG_FUNCTION_LINE_VERBOSE("connect_to_network changed to: %d", new_value);
if (new_value != Config::connect_to_network) { if (new_value != Config::connect_to_network) {
Config::need_relaunch = true; Config::need_relaunch = true;
} }
Config::connect_to_network = new_value; Config::connect_to_network = new_value;
WUPSStorageError res; WUPSStorageError res = WUPSStorageAPI_StoreBool(nullptr, "connect_to_network", Config::connect_to_network);
res = WUPSStorageAPI::Store<bool>("connect_to_network", Config::connect_to_network);
if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res); if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
} }
static void language_changed(ConfigItemMultipleValues* item, uint32_t new_value) { static void language_changed(ConfigItemMultipleValues *item, uint32_t new_value) {
DEBUG_FUNCTION_LINE_VERBOSE("language changed to: %d", new_value); DEBUG_FUNCTION_LINE_VERBOSE("language changed to: %d", new_value);
if (new_value != Config::language) { if (new_value != Config::language) {
if (new_value == inkay_language::System) if (new_value == inkay_language::System)
Config::current_language = (inkay_language)get_system_language(); Config::current_language = (inkay_language) get_system_language();
else else
Config::current_language = (inkay_language)new_value; Config::current_language = (inkay_language) new_value;
} }
Config::language = new_value; Config::language = new_value;
WUPSStorageError res; WUPSStorageError res = WUPSStorageAPI_StoreU32(nullptr, "language", Config::language);
res = WUPSStorageAPI::Store<int>("language", Config::language);
if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res); if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
} }
static void show_startup_toast_changed(ConfigItemBoolean* item, bool new_value) { static void show_startup_toast_changed(ConfigItemBoolean *item, bool new_value) {
DEBUG_FUNCTION_LINE_VERBOSE("show_startup_toast changed to: %d", new_value); DEBUG_FUNCTION_LINE_VERBOSE("show_startup_toast changed to: %d", new_value);
Config::show_startup_toast = new_value; Config::show_startup_toast = new_value;
WUPSStorageError res; WUPSStorageError res = WUPSStorageAPI_StoreBool(nullptr, "show_startup_toast", Config::show_startup_toast);
res = WUPSStorageAPI::Store<bool>("show_startup_toast", Config::show_startup_toast);
if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res); if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
} }
static void unregister_task_item_on_input_cb(void *context, WUPSConfigSimplePadData input) { static void unregister_task_item_on_input_cb(void *context, WUPSConfigSimplePadData input) {
if (!Config::unregister_task_item_pressed && Config::is_wiiu_menu && ((input.buttons_d & WUPS_CONFIG_BUTTON_A) == WUPS_CONFIG_BUTTON_A)) { if (!Config::unregister_task_item_pressed && Config::is_wiiu_menu && (
(input.buttons_d & WUPS_CONFIG_BUTTON_A) == WUPS_CONFIG_BUTTON_A)) {
nn::act::Initialize(); nn::act::Initialize();
Initialize__Q2_2nn4bossFv(); Initialize__Q2_2nn4bossFv();
for (uint8_t i = 1; i <= nn::act::GetNumOfAccounts(); i++) for (uint8_t i = 1; i <= nn::act::GetNumOfAccounts(); i++) {
{ if (nn::act::IsSlotOccupied(i) && nn::act::IsNetworkAccountEx(i)) {
if (nn::act::IsSlotOccupied(i) && nn::act::IsNetworkAccountEx(i)) nn::boss::Task task{};
{ nn::act::PersistentId persistentId = nn::act::GetPersistentIdEx(i);
nn::boss::Task task{};
nn::act::PersistentId persistentId = nn::act::GetPersistentIdEx(i);
__ct__Q3_2nn4boss4TaskFv(&task); __ct__Q3_2nn4boss4TaskFv(&task);
Initialize__Q3_2nn4boss4TaskFPCcUi(&task, "oltopic", persistentId); Initialize__Q3_2nn4boss4TaskFPCcUi(&task, "oltopic", persistentId);
// bypasses compiler warning about unused variable // bypasses compiler warning about unused variable
#ifdef DEBUG #ifdef DEBUG
uint32_t res = Unregister__Q3_2nn4boss4TaskFv(&task); uint32_t res = Unregister__Q3_2nn4boss4TaskFv(&task);
DEBUG_FUNCTION_LINE_VERBOSE("Unregistered oltopic for: SlotNo %d | Persistent ID %08x -> 0x%08x", i, persistentId, res); DEBUG_FUNCTION_LINE_VERBOSE("Unregistered oltopic for: SlotNo %d | Persistent ID %08x -> 0x%08x", i,
#else persistentId, res);
Unregister__Q3_2nn4boss4TaskFv(&task); #else
#endif Unregister__Q3_2nn4boss4TaskFv(&task);
} #endif
} }
}
Finalize__Q2_2nn4bossFv(); Finalize__Q2_2nn4bossFv();
nn::act::Finalize(); nn::act::Finalize();
@ -136,16 +132,15 @@ static int32_t unregister_task_item_get_display_value(void *context, char *out_b
} }
} }
if ((int)string.length() > out_size - 1) return -1; if ((int) string.length() > out_size - 1) return -1;
string.copy(out_buf, string.length()); string.copy(out_buf, string.length());
out_buf[string.length()] = '\0'; out_buf[string.length()] = '\0';
return 0; return 0;
} }
static WUPSConfigAPICallbackStatus ConfigMenuOpenedCallback(WUPSConfigCategoryHandle rootHandle) { static WUPSConfigAPICallbackStatus ConfigMenuOpenedCallback(WUPSConfigCategoryHandle root_cat) {
WUPSConfigAPIStatus err; WUPSConfigAPIStatus err;
bool res;
uint64_t current_title_id = OSGetTitleID(); uint64_t current_title_id = OSGetTitleID();
uint64_t wiiu_menu_tid = _SYSGetSystemApplicationTitleId(SYSTEM_APP_ID_WII_U_MENU); uint64_t wiiu_menu_tid = _SYSGetSystemApplicationTitleId(SYSTEM_APP_ID_WII_U_MENU);
@ -154,101 +149,124 @@ static WUPSConfigAPICallbackStatus ConfigMenuOpenedCallback(WUPSConfigCategoryHa
// get translation strings // get translation strings
strings = get_config_strings(Config::current_language); strings = get_config_strings(Config::current_language);
// create root config category // Network submenu
WUPSConfigCategory root = WUPSConfigCategory(rootHandle); // Connect to Pretendo Network Yes/No
// Using UDP port 5000 for multiplayer
auto network_cat = WUPSConfigCategory::Create(strings.network_category, err); WUPSConfigCategoryHandle network_cat;
if (!network_cat) return report_error(err); err = WUPSConfigAPI_Category_Create({strings.network_category.data()}, &network_cat);
if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
// config id display name default current value changed callback WUPSConfigItemHandle connect_item;
auto connect_item = WUPSConfigItemBoolean::Create("connect_to_network", strings.connect_to_network_setting, true, Config::connect_to_network, &connect_to_network_changed, err); err = WUPSConfigItemBoolean_CreateEx(
if (!connect_item) return report_error(err); "connect_to_network", strings.connect_to_network_setting.data(), true, Config::connect_to_network,
&connect_to_network_changed, strings.setting_yes.data(), strings.setting_no.data(), &connect_item);
if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
res = network_cat->add(std::move(*connect_item), err); err = WUPSConfigAPI_Category_AddItem(network_cat, connect_item);
if (!res) return report_error(err); if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
{ const uint16_t port = get_console_peertopeer_port();
uint16_t port = get_console_peertopeer_port(); char buffer[256];
char buffer[256]; snprintf(buffer, sizeof(buffer), strings.multiplayer_port_display.data(), port);
snprintf(buffer, sizeof(buffer), strings.multiplayer_port_display.data(), port);
auto multiplayer_port_display = WUPSConfigItemStub::Create(buffer, err);
if (!multiplayer_port_display) return report_error(err);
res = network_cat->add(std::move(*multiplayer_port_display), err); WUPSConfigItemHandle multiplayer_port_display;
if (!res) return report_error(err); err = WUPSConfigItemStub_Create(buffer, &multiplayer_port_display);
} if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
res = root.add(std::move(*network_cat), err); err = WUPSConfigAPI_Category_AddItem(network_cat, multiplayer_port_display);
if (!res) return report_error(err); if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
auto other_cat = WUPSConfigCategory::Create(strings.other_category, err); // Add to root and finish
if (!other_cat) return report_error(err); err = WUPSConfigAPI_Category_AddCategory(root_cat, network_cat);
if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
auto startup_toast_item = WUPSConfigItemBoolean::Create("show_startup_toast", strings.show_startup_toast_setting, true, Config::show_startup_toast, &show_startup_toast_changed, err); // Other category
if (!startup_toast_item) return report_error(err); // Reset Wara Wara Plaza Press A
// Language English/Spanish/etc..
// Show startup toast Yes/No
WUPSConfigAPIItemCallbacksV2 unregisterTasksItemCallbacks = { WUPSConfigCategoryHandle other_cat;
.getCurrentValueDisplay = unregister_task_item_get_display_value, err = WUPSConfigAPI_Category_Create({strings.other_category.data()}, &other_cat);
.getCurrentValueSelectedDisplay = unregister_task_item_get_display_value, if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
.onSelected = nullptr,
.restoreDefault = nullptr,
.isMovementAllowed = nullptr,
.onCloseCallback = nullptr,
.onInput = unregister_task_item_on_input_cb,
.onInputEx = nullptr,
.onDelete = nullptr
};
WUPSConfigAPIItemOptionsV2 unregisterTasksItemOptions = {
.displayName = strings.reset_wwp_setting.data(),
.context = nullptr,
.callbacks = unregisterTasksItemCallbacks,
};
WUPSConfigItemHandle unregisterTasksItem; WUPSConfigItemHandle unregisterTasksItem;
err = WUPSConfigAPI_Item_Create(unregisterTasksItemOptions, &unregisterTasksItem); err = WUPSConfigAPI_Item_Create({
.displayName = strings.reset_wwp_setting.data(),
.context = nullptr,
.callbacks = {
.getCurrentValueDisplay = unregister_task_item_get_display_value,
.getCurrentValueSelectedDisplay = unregister_task_item_get_display_value,
.onSelected = nullptr,
.restoreDefault = nullptr,
.isMovementAllowed = nullptr,
.onCloseCallback = nullptr,
.onInput = unregister_task_item_on_input_cb,
.onInputEx = nullptr,
.onDelete = nullptr
},
}, &unregisterTasksItem);
if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err); if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
err = WUPSConfigAPI_Category_AddItem(other_cat->getHandle(), unregisterTasksItem); err = WUPSConfigAPI_Category_AddItem(other_cat, unregisterTasksItem);
if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err); if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
constexpr WUPSConfigItemMultipleValues::ValuePair languages[] = { // TODO localise these!
{0, "Japanese"}, constexpr std::array<ConfigItemMultipleValuesPair, 14> languages = {
{1, "English"}, {
{2, "French"}, {0, "Japanese"},
{3, "German"}, {1, "English"},
{4, "Italian"}, {2, "French"},
{5, "Spanish"}, {3, "German"},
{6, "Simplified Chinese"}, {4, "Italian"},
{7, "Korean"}, {5, "Spanish"},
{8, "Dutch"}, {6, "Simplified Chinese"},
{9, "Portuguese"}, {7, "Korean"},
{10, "Russian"}, {8, "Dutch"},
{11, "Traditional Chinese"}, {9, "Portuguese"},
{13, "System"}, {10, "Russian"},
{14, "English (UwU)"}, {11, "Traditional Chinese"},
{13, "System"},
{14, "English (UwU)"},
}
}; };
auto language_item = WUPSConfigItemMultipleValues::CreateFromValue("language", "Language", 13, Config::language, languages, &language_changed, err); constexpr auto find_lang = [languages](const uint32_t lang) -> int {
if (!language_item) return report_error(err); return std::ranges::find_if(languages, [lang](auto const l) { return l.value == lang; }) -
std::begin(languages);
};
constexpr int system_language = find_lang(13 /* System */);
const int current_language = find_lang(Config::language);
res = other_cat->add(std::move(*language_item), err); WUPSConfigItemHandle language_item;
if (!res) return report_error(err); err = WUPSConfigItemMultipleValues_Create("language", strings.language_setting.data(), system_language,
current_language,
const_cast<ConfigItemMultipleValuesPair *>(languages.data()), // Yikes!
languages.size(), &language_changed, &language_item);
if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
res = other_cat->add(std::move(*startup_toast_item), err); err = WUPSConfigAPI_Category_AddItem(other_cat, language_item);
if (!res) return report_error(err); if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
WUPSConfigItemHandle startup_toast_item;
err = WUPSConfigItemBoolean_CreateEx("show_startup_toast", strings.show_startup_toast_setting.data(), true,
Config::show_startup_toast, &show_startup_toast_changed,
strings.setting_yes.data(), strings.setting_no.data(), &startup_toast_item);
if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
res = root.add(std::move(*other_cat), err); err = WUPSConfigAPI_Category_AddItem(other_cat, startup_toast_item);
if (!res) return report_error(err); if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
// finish up
err = WUPSConfigAPI_Category_AddCategory(root_cat, other_cat);
if (err != WUPSCONFIG_API_RESULT_SUCCESS) return report_error(err);
return WUPSCONFIG_API_CALLBACK_RESULT_SUCCESS; return WUPSCONFIG_API_CALLBACK_RESULT_SUCCESS;
} }
static void ConfigMenuClosedCallback() { static void ConfigMenuClosedCallback() {
// Save all changes // Save all changes
WUPSStorageError res; WUPSStorageError res = WUPSStorageAPI_SaveStorage(false);
res = WUPSStorageAPI::SaveStorage();
if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res); if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
if (Config::need_relaunch) { if (Config::need_relaunch) {
@ -260,59 +278,54 @@ static void ConfigMenuClosedCallback() {
} }
void Config::Init() { void Config::Init() {
WUPSConfigAPIStatus cres;
// Init the config api // Init the config api
WUPSConfigAPIOptionsV1 configOptions = { .name = "Inkay" }; WUPSConfigAPIStatus cres =
cres = WUPSConfigAPI_Init(configOptions, ConfigMenuOpenedCallback, ConfigMenuClosedCallback); WUPSConfigAPI_Init({.name = "Inkay"}, ConfigMenuOpenedCallback, ConfigMenuClosedCallback);
if (cres != WUPSCONFIG_API_RESULT_SUCCESS) return (void)report_error(cres); if (cres != WUPSCONFIG_API_RESULT_SUCCESS) return (void) report_error(cres);
WUPSStorageError res; WUPSStorageError res;
// Try to get values from storage // Try to get values from storage
res = WUPSStorageAPI::Get<bool>("connect_to_network", Config::connect_to_network); res = WUPSStorageAPI_GetBool(nullptr, "connect_to_network", &Config::connect_to_network);
if (res == WUPS_STORAGE_ERROR_NOT_FOUND) { if (res == WUPS_STORAGE_ERROR_NOT_FOUND) {
DEBUG_FUNCTION_LINE("Connect to network value not found, attempting to migrate/create"); DEBUG_FUNCTION_LINE_VERBOSE("Connect to network value not found, attempting to migrate/create");
bool skipPatches = false; bool skipPatches = false;
if (WUPSStorageAPI::Get<bool>("skipPatches", skipPatches) == WUPS_STORAGE_ERROR_SUCCESS) { if (WUPSStorageAPI_GetBool(nullptr, "skipPatches", &skipPatches) == WUPS_STORAGE_ERROR_SUCCESS) {
// Migrate old config value // Migrate old config value
Config::connect_to_network = !skipPatches; Config::connect_to_network = !skipPatches;
WUPSStorageAPI::DeleteItem("skipPatches"); WUPSStorageAPI_DeleteItem(nullptr, "skipPatches");
} }
// Add the value to the storage if it's missing.
res = WUPSStorageAPI::Store<bool>("connect_to_network", connect_to_network);
if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
}
else if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
res = WUPSStorageAPI::Get<uint32_t>("language", Config::language); // Add the value to the storage if it's missing.
res = WUPSStorageAPI_StoreBool(nullptr, "connect_to_network", connect_to_network);
if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
} else if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
res = WUPSStorageAPI_GetU32(nullptr, "language", &Config::language);
if (res == WUPS_STORAGE_ERROR_NOT_FOUND) { if (res == WUPS_STORAGE_ERROR_NOT_FOUND) {
DEBUG_FUNCTION_LINE("Language value not found, attempting to create"); DEBUG_FUNCTION_LINE_VERBOSE("Language value not found, attempting to create");
// Add the value to the storage. // Add the value to the storage.
res = WUPSStorageAPI::Store<uint32_t>("language", Config::language); res = WUPSStorageAPI_StoreU32(nullptr, "language", Config::language);
if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res); if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
} } else if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
else if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
res = WUPSStorageAPI_GetBool(nullptr, "show_startup_toast", &Config::show_startup_toast);
res = WUPSStorageAPI::Get<bool>("show_startup_toast", Config::show_startup_toast);
if (res == WUPS_STORAGE_ERROR_NOT_FOUND) { if (res == WUPS_STORAGE_ERROR_NOT_FOUND) {
DEBUG_FUNCTION_LINE("Show startup toast value not found, attempting to create"); DEBUG_FUNCTION_LINE_VERBOSE("Show startup toast value not found, attempting to create");
// Add the value to the storage if it's missing. // Add the value to the storage if it's missing.
res = WUPSStorageAPI::Store<bool>("show_startup_toast", show_startup_toast); res = WUPSStorageAPI_StoreBool(nullptr, "show_startup_toast", show_startup_toast);
if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res); if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
} } else if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
else if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
// Set the language that's currently used // Set the language that's currently used
if (Config::language == inkay_language::System) if (Config::language == inkay_language::System)
Config::current_language = (inkay_language)get_system_language(); Config::current_language = (inkay_language) get_system_language();
else else
Config::current_language = (inkay_language)Config::language; Config::current_language = (inkay_language) Config::language;
// Save storage // Save storage
res = WUPSStorageAPI::SaveStorage(); res = WUPSStorageAPI_SaveStorage(false);
if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res); if (res != WUPS_STORAGE_ERROR_SUCCESS) return report_storage_error(res);
} }

View file

@ -11,3 +11,4 @@
,.multiplayer_port_display="Nutze UDP Port %hu für Mehrspieler" ,.multiplayer_port_display="Nutze UDP Port %hu für Mehrspieler"
,.module_not_found="Pretendo Network Patch fehlgeschlagen - nutze Aroma Updater zum Reparieren (686-1001 Module missing)" ,.module_not_found="Pretendo Network Patch fehlgeschlagen - nutze Aroma Updater zum Reparieren (686-1001 Module missing)"
,.module_init_not_found="Pretendo Network Patch fehlgeschlagen - nutze Aroma Updater zum Reparieren (686-1002 Module init)" ,.module_init_not_found="Pretendo Network Patch fehlgeschlagen - nutze Aroma Updater zum Reparieren (686-1002 Module init)"
,.language_name="Deutsch"

View file

@ -1,5 +1,3 @@
.plugin_name="Inky ^w^" .plugin_name="Inky ^w^"
,.network_category="Newowk sewectiown! :3" ,.network_category="Newowk sewectiown! :3"
,.connect_to_network_setting="use dah pretender!!!!" ,.connect_to_network_setting="use dah pretender!!!!"
@ -13,3 +11,7 @@
,.multiplayer_port_display="mah secret word is %hu... ur modem will know" ,.multiplayer_port_display="mah secret word is %hu... ur modem will know"
,.module_not_found="oh noez! pls get aroma updater help :( (686-1001 Module missing)" ,.module_not_found="oh noez! pls get aroma updater help :( (686-1001 Module missing)"
,.module_init_not_found="oh noez! pls get aroma updater help :( (686-1002 Module init)" ,.module_init_not_found="oh noez! pls get aroma updater help :( (686-1002 Module init)"
,.setting_yes="yaah!"
,.setting_no="nu >w<"
,.language_name="kitteh speak!!"
,.system_language="System"

View file

@ -12,3 +12,8 @@
,.multiplayer_port_display="Using UDP port %hu for multiplayer" ,.multiplayer_port_display="Using UDP port %hu for multiplayer"
,.module_not_found="Pretendo Network patch failed - use Aroma Updater to repair (686-1001 Module missing)" ,.module_not_found="Pretendo Network patch failed - use Aroma Updater to repair (686-1001 Module missing)"
,.module_init_not_found="Pretendo Network patch failed - use Aroma Updater to repair (686-1002 Module init)" ,.module_init_not_found="Pretendo Network patch failed - use Aroma Updater to repair (686-1002 Module init)"
,.setting_yes="Yes"
,.setting_no="No"
,.language_setting="Language"
,.language_name="English"
,.system_language="System"

View file

@ -11,3 +11,4 @@
,.multiplayer_port_display="Usando puerto UDP %hu para multijugador" ,.multiplayer_port_display="Usando puerto UDP %hu para multijugador"
,.module_not_found="Ha fallado el parche Pretendo Network - usa Aroma Updater para repararlo (686-1001 Falta un módulo)" ,.module_not_found="Ha fallado el parche Pretendo Network - usa Aroma Updater para repararlo (686-1001 Falta un módulo)"
,.module_init_not_found="Ha fallado el parche Pretendo Network - usa Aroma Updater para repararlo (686-1002 Inicialización del módulo)" ,.module_init_not_found="Ha fallado el parche Pretendo Network - usa Aroma Updater para repararlo (686-1002 Inicialización del módulo)"
,.language_name="Español"

View file

@ -11,3 +11,4 @@
,.multiplayer_port_display="Le port UDP %hu sera utilisé pour le multijoueur" ,.multiplayer_port_display="Le port UDP %hu sera utilisé pour le multijoueur"
,.module_not_found="Le patch Pretendo Network a rencontré un problème, veuillez le réparer avec Aroma Updater (686-1001 Module missing)" ,.module_not_found="Le patch Pretendo Network a rencontré un problème, veuillez le réparer avec Aroma Updater (686-1001 Module missing)"
,.module_init_not_found="Le patch Pretendo Network a rencontré un problème, veuillez le réparer avec Aroma Updater (686-1002 Module init)" ,.module_init_not_found="Le patch Pretendo Network a rencontré un problème, veuillez le réparer avec Aroma Updater (686-1002 Module init)"
,.language_name="Français"

View file

@ -11,3 +11,4 @@
,.multiplayer_port_display="È in uso la porta UDP %hu per il multigiocatore" ,.multiplayer_port_display="È in uso la porta UDP %hu per il multigiocatore"
,.module_not_found="Patch Pretendo Network fallita - usa Aroma Updater per riparare (686-1001 Modulo mancante)" ,.module_not_found="Patch Pretendo Network fallita - usa Aroma Updater per riparare (686-1001 Modulo mancante)"
,.module_init_not_found="Patch Pretendo Network fallita - usa Aroma Updater per riparare (686-1002 Module init)" ,.module_init_not_found="Patch Pretendo Network fallita - usa Aroma Updater per riparare (686-1002 Module init)"
,.language_name="Italiano"

View file

@ -11,3 +11,4 @@
,.multiplayer_port_display="マルチプレイに UDPポート %hu を使用します" ,.multiplayer_port_display="マルチプレイに UDPポート %hu を使用します"
,.module_not_found="Pretendo パッチに失敗しました。Aroma Updaterを使用して解決してみてください。(686-1001 Module missing)" ,.module_not_found="Pretendo パッチに失敗しました。Aroma Updaterを使用して解決してみてください。(686-1001 Module missing)"
,.module_init_not_found="Pretendo パッチに失敗しました。Aroma Updaterを使用して解決してみてください。(686-1002 Module init)" ,.module_init_not_found="Pretendo パッチに失敗しました。Aroma Updaterを使用して解決してみてください。(686-1002 Module init)"
,.language_name="日本語"

View file

@ -11,3 +11,4 @@
,.multiplayer_port_display="멀티플레이어에 UDP 포트 %hu을(를) 사용합니다" ,.multiplayer_port_display="멀티플레이어에 UDP 포트 %hu을(를) 사용합니다"
,.module_not_found="패치를 적용하는 데 실패했습니다. Aroma Updater로 복구해 주세요. (686-1001 모듈 없음)" ,.module_not_found="패치를 적용하는 데 실패했습니다. Aroma Updater로 복구해 주세요. (686-1001 모듈 없음)"
,.module_init_not_found="패치를 적용하는 데 실패했습니다. Aroma Updater로 복구해 주세요. (686-1002 모듈 초기화)" ,.module_init_not_found="패치를 적용하는 데 실패했습니다. Aroma Updater로 복구해 주세요. (686-1002 모듈 초기화)"
,.language_name="한국어"

View file

@ -11,3 +11,4 @@
,.multiplayer_port_display="Gebruikt UDP port %hu voor multiplayer" ,.multiplayer_port_display="Gebruikt UDP port %hu voor multiplayer"
,.module_not_found="Pretendo patch mislukt - gebruik Aroma Updater om het te herstellen (686-1001 Module ontbreekt)" ,.module_not_found="Pretendo patch mislukt - gebruik Aroma Updater om het te herstellen (686-1001 Module ontbreekt)"
,.module_init_not_found="Pretendo-Netwerk patch mislukt - gebruik Aroma Updater om het te herstellen (686-1002 Module init)" ,.module_init_not_found="Pretendo-Netwerk patch mislukt - gebruik Aroma Updater om het te herstellen (686-1002 Module init)"
,.language_name="Nederlands"

View file

@ -11,3 +11,4 @@
,.multiplayer_port_display="Usando UDP port %hu para a jogatina multiplayer" ,.multiplayer_port_display="Usando UDP port %hu para a jogatina multiplayer"
,.module_not_found="Atualização do Pretendo falhou - use o Aroma Updater para corrigir (686-1001 Módulo faltando)" ,.module_not_found="Atualização do Pretendo falhou - use o Aroma Updater para corrigir (686-1001 Módulo faltando)"
,.module_init_not_found="Atualização do Pretendo falhou - use o Aroma Updater para corrigir (686-1002 Módulo de início)" ,.module_init_not_found="Atualização do Pretendo falhou - use o Aroma Updater para corrigir (686-1002 Módulo de início)"
,.language_name="Português"

View file

@ -11,3 +11,4 @@
,.multiplayer_port_display="Используем UDP-порт %hu для сетевой игры" ,.multiplayer_port_display="Используем UDP-порт %hu для сетевой игры"
,.module_not_found="Ошибка установки патча Pretendo - для восстановления, запустите Aroma Updater (686-1001 Модуль отсутствует)" ,.module_not_found="Ошибка установки патча Pretendo - для восстановления, запустите Aroma Updater (686-1001 Модуль отсутствует)"
,.module_init_not_found="Ошибка установки патча Pretendo - для восстановления, запустите Aroma Updater (686-1002 Инициализация модуля)" ,.module_init_not_found="Ошибка установки патча Pretendo - для восстановления, запустите Aroma Updater (686-1002 Инициализация модуля)"
,.language_name="Русский язык"

View file

@ -11,3 +11,4 @@
,.multiplayer_port_display="多人游戏使用 UDP 端口 %hu" ,.multiplayer_port_display="多人游戏使用 UDP 端口 %hu"
,.module_not_found="Pretendo Network 补丁失败 - 使用 Aroma Updater 修复686-1001 模块丢失)" ,.module_not_found="Pretendo Network 补丁失败 - 使用 Aroma Updater 修复686-1001 模块丢失)"
,.module_init_not_found="Pretendo Network 补丁失败 - 使用 Aroma Updater 修复686-1002 模块初始化)" ,.module_init_not_found="Pretendo Network 补丁失败 - 使用 Aroma Updater 修复686-1002 模块初始化)"
,.language_name="中文(简体)"

View file

@ -11,3 +11,4 @@
,.multiplayer_port_display="使用 UDP 端口 %hu 進行多人遊戲" ,.multiplayer_port_display="使用 UDP 端口 %hu 進行多人遊戲"
,.module_not_found="Pretendo Network 補丁失敗 - 請使用 Aroma Updater 修復(缺少 686-1001 模組)" ,.module_not_found="Pretendo Network 補丁失敗 - 請使用 Aroma Updater 修復(缺少 686-1001 模組)"
,.module_init_not_found="Pretendo Network 補丁失敗 - 請使用 Aroma Updater 修復(缺少 686-1002 模組)" ,.module_init_not_found="Pretendo Network 補丁失敗 - 請使用 Aroma Updater 修復(缺少 686-1002 模組)"
,.language_name="中文(繁體)"