diff --git a/CHANGES.md b/CHANGES.md index 53dfd4e04e..6aaebd3bde 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,13 @@ # 1.7.6 (future) +- DATE: Add Date / Time style options. +- MIDI: Add a Linux ALSA driver for MIDI. +- LOCALIZATION: Update German translation. +- LOCALIZATION: Update Italian translation. +- LOCALIZATION: Update Simplified Chinese translation. +- LOCALIZATION: Update Japanese translation. +- SCANNER: Fix GDI disc scanning. +- SWITCH/LIBNX: Improve touch scaling calculation. +- SWITCH: Proper button labels. # 1.7.5 - CAMERA: Fix Video4Linux2 driver that broke years ago. diff --git a/Makefile.common b/Makefile.common index beee6c8764..bc1ea2b9f9 100644 --- a/Makefile.common +++ b/Makefile.common @@ -252,6 +252,7 @@ OBJ += frontend/frontend.o \ $(LIBRETRO_COMM_DIR)/audio/resampler/drivers/sinc_resampler.o \ $(LIBRETRO_COMM_DIR)/audio/resampler/drivers/nearest_resampler.o \ $(LIBRETRO_COMM_DIR)/audio/resampler/drivers/null_resampler.o \ + $(LIBRETRO_COMM_DIR)/utils/md5.o \ location/drivers/nulllocation.o \ camera/drivers/nullcamera.o \ wifi/drivers/nullwifi.o \ @@ -544,6 +545,7 @@ endif ifeq ($(HAVE_ALSA), 1) OBJ += audio/drivers/alsa.o + OBJ += midi/drivers/alsa_midi.o ifeq ($(HAVE_THREADS), 1) OBJ += audio/drivers/alsathread.o @@ -720,6 +722,10 @@ ifeq ($(HAVE_LAKKA), 1) DEFINES += -DHAVE_LAKKA endif +ifeq ($(HAVE_LAKKA_SWITCH), 1) + DEFINES += -DHAVE_LAKKA_SWITCH +endif + ifeq ($(HAVE_MENU_COMMON), 1) OBJ += menu/menu_driver.o \ menu/menu_content.o \ @@ -1619,8 +1625,6 @@ ifeq ($(HAVE_NETWORKING), 1) cheevos/var.o \ cheevos/cond.o - OBJ += \ - $(LIBRETRO_COMM_DIR)/utils/md5.o ifeq ($(HAVE_LUA), 1) DEFINES += -DHAVE_LUA \ diff --git a/Makefile.ctr b/Makefile.ctr index e72f8313d4..2427e235cc 100644 --- a/Makefile.ctr +++ b/Makefile.ctr @@ -52,7 +52,7 @@ ifeq ($(GRIFFIN_BUILD), 1) OBJ += griffin/griffin.o DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_RGUI -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DWANT_ZLIB - DEFINES += -DHAVE_NETWORKING -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_SOCKET_LEGACY -DHAVE_THREADS + #DEFINES += -DHAVE_NETWORKING -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_SOCKET_LEGACY -DHAVE_THREADS #-DHAVE_SSL -DMBEDTLS_SSL_DEBUG_ALL #ssl is currently incompatible with griffin due to use of the "static" flag on repeating functions that will conflict when included in one file else @@ -72,11 +72,11 @@ else HAVE_XMB = 1 HAVE_STATIC_VIDEO_FILTERS = 1 HAVE_STATIC_AUDIO_FILTERS = 1 - HAVE_NETWORKING = 1 - HAVE_CHEEVOS = 1 - HAVE_SOCKET_LEGACY = 1 - HAVE_THREADS = 1 - HAVE_SSL = 1 + #HAVE_NETWORKING = 1 + #HAVE_CHEEVOS = 1 + #HAVE_SOCKET_LEGACY = 1 + #HAVE_THREADS = 1 + #HAVE_SSL = 1 include Makefile.common BLACKLIST := diff --git a/Makefile.libnx b/Makefile.libnx index 36b614de5e..00343d6b1c 100644 --- a/Makefile.libnx +++ b/Makefile.libnx @@ -46,6 +46,7 @@ HAVE_FREETYPE = 0 HAVE_SWITCH = 1 HAVE_LIBNX = 1 HAVE_OPENGL = 1 +HAVE_LANGEXTRA = 1 ifeq ($(HAVE_OPENGL), 1) HAVE_EGL = 1 diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 9e083a54f4..d0cc9d6497 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -124,8 +124,8 @@ static const audio_driver_t *audio_drivers[] = { &audio_ctr_dsp, #endif #ifdef SWITCH - &audio_switch, &audio_switch_thread, + &audio_switch, #endif &audio_null, NULL, diff --git a/command.c b/command.c index 6c82a56942..f52fcee785 100644 --- a/command.c +++ b/command.c @@ -117,12 +117,14 @@ struct cmd_map unsigned id; }; +#ifdef HAVE_COMMAND struct cmd_action_map { const char *str; bool (*action)(const char *arg); const char *arg_desc; }; +#endif struct command { @@ -137,9 +139,50 @@ struct command #endif }; -static bool command_version(const char *arg); +#if defined(HAVE_COMMAND) +static enum cmd_source_t lastcmd_source; +#if defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING) +static int lastcmd_net_fd; +static struct sockaddr_storage lastcmd_net_source; +static socklen_t lastcmd_net_source_len; +#endif -#if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS) +#if defined(HAVE_CHEEVOS) && (defined(HAVE_STDIN_CMD) || defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING)) +static void command_reply(const char * data, size_t len) +{ + switch (lastcmd_source) + { + case CMD_STDIN: +#ifdef HAVE_STDIN_CMD + fwrite(data, 1,len, stdout); +#endif + break; + case CMD_NETWORK: +#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORK_CMD) + sendto(lastcmd_net_fd, data, len, 0, + (struct sockaddr*)&lastcmd_net_source, lastcmd_net_source_len); +#endif + break; + case CMD_NONE: + default: + break; + } +} + +#endif +static bool command_version(const char* arg) +{ + char reply[256] = {0}; + + sprintf(reply, "%s\n", PACKAGE_VERSION); +#if defined(HAVE_CHEEVOS) && (defined(HAVE_STDIN_CMD) || defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING)) + command_reply(reply, strlen(reply)); +#endif + + return true; +} + +#if defined(HAVE_CHEEVOS) static bool command_read_ram(const char *arg); static bool command_write_ram(const char *arg); #endif @@ -147,7 +190,7 @@ static bool command_write_ram(const char *arg); static const struct cmd_action_map action_map[] = { { "SET_SHADER", command_set_shader, "" }, { "VERSION", command_version, "No argument"}, -#if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS) +#if defined(HAVE_CHEEVOS) { "READ_CORE_RAM", command_read_ram, "
" }, { "WRITE_CORE_RAM", command_write_ram, "
..." }, #endif @@ -198,41 +241,9 @@ static const struct cmd_map map[] = { { "MENU_B", RETRO_DEVICE_ID_JOYPAD_B }, { "MENU_B", RETRO_DEVICE_ID_JOYPAD_B }, }; - -static enum cmd_source_t lastcmd_source; -#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORK_CMD) -static int lastcmd_net_fd; -static struct sockaddr_storage lastcmd_net_source; -static socklen_t lastcmd_net_source_len; #endif -#if defined(HAVE_CHEEVOS) && (defined(HAVE_STDIN_CMD) || defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING)) -static bool command_reply(const char * data, size_t len) -{ - switch (lastcmd_source) - { - case CMD_NONE: - break; - case CMD_STDIN: -#ifdef HAVE_STDIN_CMD - fwrite(data, 1,len, stdout); - return true; -#else - break; -#endif - case CMD_NETWORK: -#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORK_CMD) - sendto(lastcmd_net_fd, data, len, 0, - (struct sockaddr*)&lastcmd_net_source, lastcmd_net_source_len); - return true; -#else - break; -#endif - } - return false; -} -#endif bool command_set_shader(const char *arg) { @@ -261,17 +272,6 @@ bool command_set_shader(const char *arg) #endif } -static bool command_version(const char* arg) -{ - char reply[256] = {0}; - - sprintf(reply, "%s\n", PACKAGE_VERSION); -#if defined(HAVE_CHEEVOS) && (defined(HAVE_STDIN_CMD) || defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING)) - command_reply(reply, strlen(reply)); -#endif - - return true; -} #if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS) #define SMY_CMD_STR "READ_CORE_RAM" @@ -646,7 +646,7 @@ bool command_network_new( return true; -#if (defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING)) || defined(HAVE_STDIN_CMD) +#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORK_CMD) && defined(HAVE_COMMAND) || defined(HAVE_STDIN_CMD) error: command_free(handle); return false; @@ -1670,7 +1670,7 @@ static bool command_event_main_state(unsigned cmd) { retro_ctx_size_info_t info; char msg[128]; - size_t state_path_size = 8192 * sizeof(char); + size_t state_path_size = 16384 * sizeof(char); char *state_path = (char*)malloc(state_path_size); global_t *global = global_get_ptr(); bool ret = false; diff --git a/config.def.h b/config.def.h index 4607c2eb7b..e9cadb4165 100644 --- a/config.def.h +++ b/config.def.h @@ -181,7 +181,11 @@ static unsigned swap_interval = 1; /* Threaded video. Will possibly increase performance significantly * at the cost of worse synchronization and latency. */ +#if defined(HAVE_LIBNX) +static const bool video_threaded = true; +#else static const bool video_threaded = false; +#endif #if defined(HAVE_THREADS) #if defined(GEKKO) || defined(PSP) @@ -288,7 +292,11 @@ static bool menu_show_configurations = true; static bool menu_show_help = true; static bool menu_show_quit_retroarch = true; static bool menu_show_reboot = true; +#ifdef HAVE_LAKKA_SWITCH +static bool menu_show_shutdown = false; +#else static bool menu_show_shutdown = true; +#endif #if defined(HAVE_LAKKA) || defined(VITA) || defined(_3DS) static bool menu_show_core_updater = false; #else @@ -697,6 +705,8 @@ static const unsigned menu_thumbnails_default = 3; static const unsigned menu_left_thumbnails_default = 0; +static const unsigned menu_timedate_style = 5; + static const bool xmb_vertical_thumbnails = false; #ifdef IOS diff --git a/configuration.c b/configuration.c index 7a26c0b916..4759929212 100644 --- a/configuration.c +++ b/configuration.c @@ -300,6 +300,7 @@ enum record_driver_enum enum midi_driver_enum { MIDI_WINMM = RECORD_NULL + 1, + MIDI_ALSA, MIDI_NULL }; @@ -411,6 +412,8 @@ static enum record_driver_enum RECORD_DEFAULT_DRIVER = RECORD_NULL; #ifdef HAVE_WINMM static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_WINMM; +#elif defined HAVE_ALSA +static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_ALSA; #else static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_NULL; #endif @@ -1049,6 +1052,8 @@ const char *config_get_default_midi(void) { case MIDI_WINMM: return "winmm"; + case MIDI_ALSA: + return "alsa"; case MIDI_NULL: break; } @@ -1569,6 +1574,7 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, #ifdef HAVE_MENU SETTING_UINT("dpi_override_value", &settings->uints.menu_dpi_override_value, true, menu_dpi_override_value, false); SETTING_UINT("menu_thumbnails", &settings->uints.menu_thumbnails, true, menu_thumbnails_default, false); + SETTING_UINT("menu_timedate_style", &settings->uints.menu_timedate_style, true, menu_timedate_style, false); #ifdef HAVE_XMB SETTING_UINT("menu_left_thumbnails", &settings->uints.menu_left_thumbnails, true, menu_left_thumbnails_default, false); SETTING_UINT("xmb_alpha_factor", &settings->uints.menu_xmb_alpha_factor, true, xmb_alpha_factor, false); @@ -2335,6 +2341,33 @@ error: return NULL; } +#if defined(HAVE_MENU) && defined(HAVE_RGUI) +static bool check_menu_driver_compatibility(void) +{ + settings_t *settings = config_get_ptr(); + char *video_driver = settings->arrays.video_driver; + char *menu_driver = settings->arrays.menu_driver; + + if (string_is_equal (menu_driver, "rgui") || + string_is_equal(menu_driver, "null")) + return true; + + /* TODO/FIXME - maintenance hazard */ + if (string_is_equal(video_driver, "d3d9") || + string_is_equal(video_driver, "d3d10") || + string_is_equal(video_driver, "d3d11") || + string_is_equal(video_driver, "d3d12") || + string_is_equal(video_driver, "gl") || + string_is_equal(video_driver, "gx2") || + string_is_equal(video_driver, "vulkan") || + string_is_equal(video_driver, "metal") || + string_is_equal(video_driver, "vita")) + return true; + + return false; +} +#endif + static void read_keybinds_keyboard(config_file_t *conf, unsigned user, unsigned idx, struct retro_keybind *bind) { @@ -3040,6 +3073,11 @@ static bool config_load_file(const char *path, bool set_defaults, } } +#if defined(HAVE_MENU) && defined(HAVE_RGUI) + if (!check_menu_driver_compatibility()) + strlcpy(settings->arrays.menu_driver, "rgui", sizeof(settings->arrays.menu_driver)); +#endif + frontend_driver_set_sustained_performance_mode(settings->bools.sustained_performance_mode); recording_driver_update_streaming_url(); diff --git a/configuration.h b/configuration.h index 865f7058d9..28f599ff87 100644 --- a/configuration.h +++ b/configuration.h @@ -393,6 +393,7 @@ typedef struct settings unsigned video_record_scale_factor; unsigned video_stream_scale_factor; + unsigned menu_timedate_style; unsigned menu_thumbnails; unsigned menu_left_thumbnails; unsigned menu_dpi_override_value; diff --git a/dynamic.c b/dynamic.c index 73e593298d..81a03dd2a1 100644 --- a/dynamic.c +++ b/dynamic.c @@ -955,16 +955,10 @@ static bool dynamic_request_hw_context(enum retro_hw_context_type type, break; case RETRO_HW_CONTEXT_OPENGL_CORE: - { - gfx_ctx_flags_t flags; - flags.flags = 0; - BIT32_SET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT); - - video_context_driver_set_flags(&flags); - - RARCH_LOG("Requesting core OpenGL context (%u.%u).\n", - major, minor); - } + /* TODO/FIXME - we should do a check here to see if + * the requested core GL version is supported */ + RARCH_LOG("Requesting core OpenGL context (%u.%u).\n", + major, minor); break; #endif @@ -1374,6 +1368,15 @@ bool rarch_environment_cb(unsigned cmd, void *data) if (!dynamic_verify_hw_context(cb->context_type, cb->version_minor, cb->version_major)) return false; + if (cb->context_type == RETRO_HW_CONTEXT_OPENGL_CORE) + { + gfx_ctx_flags_t flags; + flags.flags = 0; + BIT32_SET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT); + + video_context_driver_set_flags(&flags); + } + cb->get_current_framebuffer = video_driver_get_current_framebuffer; cb->get_proc_address = video_driver_get_proc_address; diff --git a/frontend/drivers/platform_switch.c b/frontend/drivers/platform_switch.c index 6bdea42936..39cb228a47 100644 --- a/frontend/drivers/platform_switch.c +++ b/frontend/drivers/platform_switch.c @@ -57,7 +57,7 @@ static uint64_t frontend_switch_get_mem_used(void); #ifdef HAVE_LIBNX -// Splash +/* Splash */ static uint32_t *splashData = NULL; static bool psmInitialized = false; @@ -66,7 +66,7 @@ static bool psmInitialized = false; extern bool nxlink_connected; #endif -#endif // HAVE_LIBNX +#endif /* HAVE_LIBNX */ static void get_first_valid_core(char *path_return) { @@ -195,7 +195,7 @@ static void frontend_switch_deinit(void *data) socketExit(); #endif - // Splash + /* Splash */ if (splashData) { free(splashData); @@ -325,33 +325,33 @@ static void frontend_switch_exitspawn(char *s, size_t len) void argb_to_rgba8(uint32_t *buff, uint32_t height, uint32_t width) { - // Convert - for (uint32_t h = 0; h < height; h++) + uint32_t h, w; + /* Convert */ + for (h = 0; h < height; h++) { - for (uint32_t w = 0; w < width; w++) + for (w = 0; w < width; w++) { uint32_t offset = (h * width) + w; - uint32_t c = buff[offset]; + uint32_t c = buff[offset]; - uint32_t a = (uint32_t)((c & 0xff000000) >> 24); - uint32_t r = (uint32_t)((c & 0x00ff0000) >> 16); - uint32_t g = (uint32_t)((c & 0x0000ff00) >> 8); - uint32_t b = (uint32_t)(c & 0x000000ff); + uint32_t a = (uint32_t)((c & 0xff000000) >> 24); + uint32_t r = (uint32_t)((c & 0x00ff0000) >> 16); + uint32_t g = (uint32_t)((c & 0x0000ff00) >> 8); + uint32_t b = (uint32_t)(c & 0x000000ff); - buff[offset] = RGBA8(r, g, b, a); + buff[offset] = RGBA8(r, g, b, a); } } } -void frontend_switch_showsplash() +void frontend_switch_showsplash(void) { printf("[Splash] Showing splashScreen\n"); if (splashData) { - uint32_t width, height; - width = height = 0; - + uint32_t width = 0; + uint32_t height = 0; uint32_t *frambuffer = (uint32_t *)gfxGetFramebuffer(&width, &height); gfx_slow_swizzling_blit(frambuffer, splashData, width, height, 0, 0, false); @@ -362,15 +362,15 @@ void frontend_switch_showsplash() } } -// From rpng_test.c -bool rpng_load_image_argb(const char *path, uint32_t **data, unsigned *width, unsigned *height) +/* From rpng_test.c */ +bool rpng_load_image_argb(const char *path, + uint32_t **data, unsigned *width, unsigned *height) { int retval; size_t file_len; - bool ret = true; - rpng_t *rpng = NULL; - void *ptr = NULL; - + bool ret = true; + rpng_t *rpng = NULL; + void *ptr = NULL; struct nbio_t *handle = (struct nbio_t *)nbio_open(path, NBIO_READ); if (!handle) @@ -463,7 +463,7 @@ ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize) return -1; } -// Taken from glibc +/* Taken from glibc */ char *realpath(const char *name, char *resolved) { char *rpath, *dest, *extra_buf = NULL; @@ -592,14 +592,14 @@ error: return NULL; } -#endif // HAVE_LIBNX +#endif /* HAVE_LIBNX */ static void frontend_switch_shutdown(bool unused) { (void)unused; } -// runloop_get_system_info isnt initialized that early.. +/* runloop_get_system_info isnt initialized that early.. */ extern void retro_get_system_info(struct retro_system_info *info); static void frontend_switch_init(void *data) @@ -608,21 +608,21 @@ static void frontend_switch_init(void *data) #ifdef HAVE_LIBNX #ifndef HAVE_OPENGL - // Init Resolution before initDefault + /* Init Resolution before initDefault */ gfxInitResolution(1280, 720); gfxInitDefault(); gfxSetMode(GfxMode_TiledDouble); gfxConfigureTransform(0); -#endif // HAVE_OPENGL +#endif /* HAVE_OPENGL */ #ifdef NXLINK socketInitializeDefault(); nxlink_connected = nxlinkStdio() != -1; #ifndef IS_SALAMANDER verbosity_enable(); -#endif // IS_SALAMANDER -#endif // NXLINK +#endif /* IS_SALAMANDER */ +#endif /* NXLINK */ Result rc; rc = psmInitialize(); @@ -642,8 +642,8 @@ static void frontend_switch_init(void *data) uint32_t width, height; width = height = 0; - // Load splash #ifndef HAVE_OPENGL + /* Load splash */ if (!splashData) { if (sys_info) @@ -685,12 +685,12 @@ static void frontend_switch_init(void *data) frontend_switch_showsplash(); } #endif -#endif // HAVE_LIBNX (splash) +#endif /* HAVE_LIBNX (splash) */ } static int frontend_switch_get_rating(void) { - return 1000; + return 11; } enum frontend_architecture frontend_switch_get_architecture(void) @@ -718,7 +718,7 @@ static int frontend_switch_parse_drive_list(void *data, bool load_content) static uint64_t frontend_switch_get_mem_total(void) { uint64_t memoryTotal = 0; - svcGetInfo(&memoryTotal, 6, 0xffff8001, 0); // avaiable + svcGetInfo(&memoryTotal, 6, 0xffff8001, 0); memoryTotal += frontend_switch_get_mem_used(); return memoryTotal; @@ -727,7 +727,7 @@ static uint64_t frontend_switch_get_mem_total(void) static uint64_t frontend_switch_get_mem_used(void) { uint64_t memoryUsed = 0; - svcGetInfo(&memoryUsed, 7, 0xffff8001, 0); // used + svcGetInfo(&memoryUsed, 7, 0xffff8001, 0); return memoryUsed; } @@ -769,7 +769,7 @@ static void frontend_switch_get_os(char *s, size_t len, int *major, int *minor) strlcpy(s, "Horizon OS", len); #ifdef HAVE_LIBNX - // There is pretty sure a better way, but this will do just fine + /* There is pretty sure a better way, but this will do just fine */ if (kernelAbove600()) { *major = 6; @@ -796,18 +796,18 @@ static void frontend_switch_get_os(char *s, size_t len, int *major, int *minor) } else { - // either 1.0 or > 5.x + /* either 1.0 or > 5.x */ *major = 1; *minor = 0; } #else - // defaults in case we error out + /* defaults in case we error out */ *major = 0; *minor = 0; char firmware_version[0x100]; - result_t r; // used by LIB_ASSERT_OK macros + result_t r; /* used by LIB_ASSERT_OK macros */ LIB_ASSERT_OK(fail, sm_init()); ipc_object_t set_sys; @@ -835,7 +835,7 @@ fail: static void frontend_switch_get_name(char *s, size_t len) { - // TODO: Add Mariko at some point + /* TODO: Add Mariko at some point */ strlcpy(s, "Nintendo Switch", len); } @@ -853,12 +853,12 @@ frontend_ctx_driver_t frontend_ctx_switch = #else frontend_switch_set_fork, #endif -#else // HAVE_LIBNX +#else /* HAVE_LIBNX */ NULL, NULL, NULL, NULL, -#endif // HAVE_LIBNX +#endif /* HAVE_LIBNX */ frontend_switch_shutdown, frontend_switch_get_name, frontend_switch_get_os, diff --git a/gfx/display_servers/dispserv_win32.c b/gfx/display_servers/dispserv_win32.c index 35d0ed367e..54c3a79d02 100644 --- a/gfx/display_servers/dispserv_win32.c +++ b/gfx/display_servers/dispserv_win32.c @@ -59,12 +59,12 @@ typedef struct } dispserv_win32_t; /* -NOTE: When an application displays a window, its taskbar button is created -by the system. When the button is in place, the taskbar sends a -TaskbarButtonCreated message to the window. Its value is computed by -calling RegisterWindowMessage(L("TaskbarButtonCreated")). That message must -be received by your application before it calls any ITaskbarList3 method. -*/ + NOTE: When an application displays a window, its taskbar button is created + by the system. When the button is in place, the taskbar sends a + TaskbarButtonCreated message to the window. Its value is computed by + calling RegisterWindowMessage(L("TaskbarButtonCreated")). That message must + be received by your application before it calls any ITaskbarList3 method. + */ static unsigned win32_orig_width = 0; static unsigned win32_orig_height = 0; @@ -105,10 +105,10 @@ static void* win32_display_server_init(void) static void win32_display_server_destroy(void *data) { dispserv_win32_t *dispserv = (dispserv_win32_t*)data; - - if (win32_orig_width > 0 && win32_orig_height > 0 ) + + if (win32_orig_width > 0 && win32_orig_height > 0) video_display_server_switch_resolution(win32_orig_width, win32_orig_height, - win32_orig_refresh , (float)win32_orig_refresh, crt_center ); + win32_orig_refresh, (float)win32_orig_refresh, crt_center ); #ifdef HAS_TASKBAR_EXT if (g_taskbarList && win32_taskbar_is_created()) @@ -124,7 +124,7 @@ static void win32_display_server_destroy(void *data) static bool win32_display_server_set_window_opacity(void *data, unsigned opacity) { - HWND hwnd = win32_get_window(); + HWND hwnd = win32_get_window(); dispserv_win32_t *serv = (dispserv_win32_t*)data; if (serv) @@ -132,11 +132,11 @@ static bool win32_display_server_set_window_opacity(void *data, unsigned opacity #if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500 /* Set window transparency on Windows 2000 and above */ - if(opacity < 100) + if (opacity < 100) { SetWindowLongPtr(hwnd, - GWL_EXSTYLE, - GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); + GWL_EXSTYLE, + GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); return SetLayeredWindowAttributes(hwnd, 0, (255 * opacity) / 100, LWA_ALPHA); } @@ -151,7 +151,7 @@ static bool win32_display_server_set_window_opacity(void *data, unsigned opacity static bool win32_display_server_set_window_progress(void *data, int progress, bool finished) { - HWND hwnd = win32_get_window(); + HWND hwnd = win32_get_window(); dispserv_win32_t *serv = (dispserv_win32_t*)data; if (serv) @@ -164,23 +164,23 @@ static bool win32_display_server_set_window_progress(void *data, int progress, b if (progress == -1) { if (ITaskbarList3_SetProgressState( - g_taskbarList, hwnd, TBPF_INDETERMINATE) != S_OK) + g_taskbarList, hwnd, TBPF_INDETERMINATE) != S_OK) return false; } else if (finished) { if (ITaskbarList3_SetProgressState( - g_taskbarList, hwnd, TBPF_NOPROGRESS) != S_OK) + g_taskbarList, hwnd, TBPF_NOPROGRESS) != S_OK) return false; } else if (progress >= 0) { if (ITaskbarList3_SetProgressState( - g_taskbarList, hwnd, TBPF_NORMAL) != S_OK) + g_taskbarList, hwnd, TBPF_NORMAL) != S_OK) return false; if (ITaskbarList3_SetProgressValue( - g_taskbarList, hwnd, progress, 100) != S_OK) + g_taskbarList, hwnd, progress, 100) != S_OK) return false; } #endif @@ -195,7 +195,7 @@ static bool win32_display_server_set_window_decorations(void *data, bool on) if (serv) serv->decorations = on; - /* menu_setting performs a reinit instead to properly + /* menu_setting performs a reinit instead to properly * apply decoration changes */ return true; @@ -216,74 +216,73 @@ static bool win32_display_server_set_resolution(void *data, if (!serv) return false; - + EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &curDevmode); - + if (win32_orig_width == 0) - win32_orig_width = GetSystemMetrics(SM_CXSCREEN); - win32_orig_refresh = curDevmode.dmDisplayFrequency; + win32_orig_width = GetSystemMetrics(SM_CXSCREEN); + win32_orig_refresh = curDevmode.dmDisplayFrequency; if (win32_orig_height == 0) - win32_orig_height = GetSystemMetrics(SM_CYSCREEN); + win32_orig_height = GetSystemMetrics(SM_CYSCREEN); /* Used to stop super resolution bug */ if (width == curDevmode.dmPelsWidth) - width = 0; - if (width == 0) + width = 0; + if (width == 0) width = curDevmode.dmPelsWidth; - if (height == 0) + if (height == 0) height = curDevmode.dmPelsHeight; - if (depth == 0) + if (depth == 0) depth = curDevmode.dmBitsPerPel; - if (freq == 0) + if (freq == 0) freq = curDevmode.dmDisplayFrequency; - for (iModeNum = 0; ; iModeNum++) + for (iModeNum = 0;; iModeNum++) { - if (!EnumDisplaySettings(NULL, iModeNum, &devmode)) + if (!EnumDisplaySettings(NULL, iModeNum, &devmode)) break; - if (devmode.dmPelsWidth != width) + if (devmode.dmPelsWidth != width) continue; - if (devmode.dmPelsHeight != height) + if (devmode.dmPelsHeight != height) continue; - if (devmode.dmBitsPerPel != depth) + if (devmode.dmBitsPerPel != depth) continue; - if (devmode.dmDisplayFrequency != freq) + if (devmode.dmDisplayFrequency != freq) continue; - devmode.dmFields |= - DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; - res = - win32_change_display_settings(NULL, &devmode, CDS_TEST); + devmode.dmFields |= + DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; + res = + win32_change_display_settings(NULL, &devmode, CDS_TEST); - switch (res) + switch (res) { + case DISP_CHANGE_SUCCESSFUL: + res = win32_change_display_settings(NULL, &devmode, flags); + switch (res) + { case DISP_CHANGE_SUCCESSFUL: - res = win32_change_display_settings(NULL, &devmode, flags); - switch (res) - { - case DISP_CHANGE_SUCCESSFUL: - return true; - case DISP_CHANGE_NOTUPDATED: - return true; - default: - break; - } - break; - case DISP_CHANGE_RESTART: - break; + return true; + case DISP_CHANGE_NOTUPDATED: + return true; default: break; + } + break; + case DISP_CHANGE_RESTART: + break; + default: + break; } } return true; } - const video_display_server_t dispserv_win32 = { win32_display_server_init, win32_display_server_destroy, @@ -294,4 +293,3 @@ const video_display_server_t dispserv_win32 = { NULL, /* get_output_options */ "win32" }; - diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c index 3a93980bea..f4f6f16f7a 100644 --- a/gfx/display_servers/dispserv_x11.c +++ b/gfx/display_servers/dispserv_x11.c @@ -50,28 +50,29 @@ static void* x11_display_server_init(void) static void x11_display_server_destroy(void *data) { - dispserv_x11_t *dispserv = (dispserv_x11_t*)data; + dispserv_x11_t *dispserv = (dispserv_x11_t*)data; int i = 0; - if (crt_en == true) - { - sprintf(output,"xrandr -s %dx%d", orig_width, orig_height); - system(output); - - for (i =0; i < 3; i++) - { - sprintf(output,"xrandr --delmode %s%d %s", "VGA",i ,old_mode); - system(output); - sprintf(output,"xrandr --delmode %s-%d %s", "VGA",i ,old_mode); - system(output); - sprintf(output,"xrandr --delmode %s%d %s", "DVI",i ,old_mode); - system(output); - sprintf(output,"xrandr --delmode %s-%d %s", "DVI",i ,old_mode); - system(output); - } - - sprintf(output,"xrandr --rmmode %s", old_mode); - system(output); + if (crt_en) + { + sprintf(output, "xrandr -s %dx%d", orig_width, orig_height); + system(output); + + for (i = 0; i < 3; i++) + { + sprintf(output, "xrandr --delmode %s%d %s", "VGA", i, old_mode); + system(output); + sprintf(output, "xrandr --delmode %s-%d %s", "VGA", i, old_mode); + system(output); + + sprintf(output, "xrandr --delmode %s%d %s", "DVI", i, old_mode); + system(output); + sprintf(output, "xrandr --delmode %s-%d %s", "DVI", i, old_mode); + system(output); + } + + sprintf(output, "xrandr --rmmode %s", old_mode); + system(output); } if (dispserv) @@ -90,7 +91,7 @@ static bool x11_display_server_set_window_opacity(void *data, unsigned opacity) if (opacity == (unsigned)-1) XDeleteProperty(g_x11_dpy, g_x11_win, net_wm_opacity); - else + else XChangeProperty(g_x11_dpy, g_x11_win, net_wm_opacity, cardinal, 32, PropModeReplace, (const unsigned char*)&opacity, 1); return true; @@ -126,62 +127,62 @@ static bool x11_display_server_set_resolution(void *data, float pixel_clock = 0; crt_en = true; - - /* set core refresh from hz */ - video_monitor_set_refresh_rate(hz); - - /* following code is the mode line genorator */ - hsp = width*1.140; - hfp = width*1.055; + /* set core refresh from hz */ + video_monitor_set_refresh_rate(hz); + + /* following code is the mode line genorator */ + + hsp = width * 1.140; + hfp = width * 1.055; pwidth = width; - if (height < 400 && width > 400 ) - pwidth = width/2; - + if (height < 400 && width > 400) + pwidth = width / 2; - roundw = roundf((float)pwidth/(float)height * 100)/100; + roundw = roundf((float)pwidth / (float)height * 100) / 100; - if (height > width ) { - roundw = roundf((float)height/(float)width * 100)/100; + if (height > width) + { + roundw = roundf((float)height / (float)width * 100) / 100; } if (roundw > 1.35) roundw = 1.25; - if (roundw < 1.20) + if (roundw < 1.20) roundw = 1.34; - hbp = width*roundw-8; + hbp = width * roundw - 8; hmax = hbp; - + if (height < 241) - { + { vmax = 261; } if (height < 241 && hz > 56 && hz < 58) - { + { vmax = 280; } - if (height < 241 && hz < 55) - { + if (height < 241 && hz < 55) + { vmax = 313; } if (height > 250 && height < 260 && hz > 54) - { + { vmax = 296; } if (height > 250 && height < 260 && hz > 52 && hz < 54) - { + { vmax = 285; } if (height > 250 && height < 260 && hz < 52) - { + { vmax = 313; } if (height > 260 && height < 300) - { + { vmax = 318; } @@ -202,33 +203,32 @@ static bool x11_display_server_set_resolution(void *data, { vmax = 624; } - if (height > 300) + if (height > 300) { - pdefault = pdefault*2; + pdefault = pdefault * 2; } - - vfp = height+((vmax-height)/2)-pdefault; + vfp = height + ((vmax - height) / 2) - pdefault; if (height < 300) { - vsp = vfp+3; /* needs to me 3 for progressive */ - } + vsp = vfp + 3; /* needs to me 3 for progressive */ + } if (height > 300) { - vsp = vfp+6; /* needs to me 6 for interlaced */ + vsp = vfp + 6; /* needs to me 6 for interlaced */ } - + vbp = vmax; if (height < 300) { - pixel_clock = (hmax*vmax*hz)/1000000; + pixel_clock = (hmax * vmax * hz) / 1000000; } - + if (height > 300) { - pixel_clock = ((hmax*vmax*hz)/1000000)/2; + pixel_clock = ((hmax * vmax * hz) / 1000000) / 2; } /* above code is the modeline genorator */ @@ -237,60 +237,63 @@ static bool x11_display_server_set_resolution(void *data, { snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"%dx%d_%0.2f\" %lf %d %d %d %d %d %d %d %d -hsync -vsync", width, height, hz, pixel_clock, width, hfp, hsp, hbp, height, vfp, vsp, vbp); system(xrandr); - } /* create interlaced newmode from modline variables */ if (height > 300) - { + { snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"%dx%d_%0.2f\" %lf %d %d %d %d %d %d %d %d interlace -hsync -vsync", width, height, hz, pixel_clock, width, hfp, hsp, hbp, height, vfp, vsp, vbp); system(xrandr); - } - /* variable for new mode */ - snprintf(new_mode, sizeof(new_mode), "%dx%d_%0.2f", width, height, hz); - /* need to run loops for DVI0 - DVI-2 and VGA0 - VGA-2 outputs to add and delete modes */ - for (i =0; i < 3; i++) - { - snprintf(output, sizeof(output), "xrandr --addmode %s%d %s", "DVI",i ,new_mode); - system(output); - snprintf(output, sizeof(output), "xrandr --delmode %s%d %s", "DVI",i ,old_mode); - system(output); - } - for (i =0; i < 3; i++) - { - snprintf(output, sizeof(output), "xrandr --addmode %s-%d %s", "DVI",i ,new_mode); - system(output); - snprintf(output, sizeof(output), "xrandr --delmode %s-%d %s", "DVI",i ,old_mode); - system(output); - } - for (i =0; i < 3; i++) - { - snprintf(output, sizeof(output), "xrandr --addmode %s%d %s", "VGA",i ,new_mode); - system(output); - snprintf(output, sizeof(output), "xrandr --delmode %s%d %s", "VGA",i ,old_mode); - system(output); - } - for (i =0; i < 3; i++) - { - snprintf(output, sizeof(output), "xrandr --addmode %s-%d %s", "VGA",i ,new_mode); - system(output); - snprintf(output, sizeof(output), "xrandr --delmode %s-%d %s", "VGA",i ,old_mode); - system(output); - } - - snprintf(output, sizeof(output), "xrandr -s %s", new_mode); + /* variable for new mode */ + snprintf(new_mode, sizeof(new_mode), "%dx%d_%0.2f", width, height, hz); + + /* need to run loops for DVI0 - DVI-2 and VGA0 - VGA-2 outputs to add and delete modes */ + for (i = 0; i < 3; i++) + { + snprintf(output, sizeof(output), "xrandr --addmode %s%d %s", "DVI", i, new_mode); system(output); - /* remove old mode */ - snprintf(output, sizeof(output), "xrandr --rmmode %s", old_mode); - system(output); - system("xdotool windowactivate $(xdotool search --class RetroArch)"); /* needs xdotool installed. needed to recaputure window. */ - /* variable for old mode */ - snprintf(old_mode, sizeof(old_mode), "%s", new_mode); - system("xdotool windowactivate $(xdotool search --class RetroArch)"); /* needs xdotool installed. needed to recaputure window. */ - /* Second run needed as some times it runs to fast to capture first time */ + snprintf(output, sizeof(output), "xrandr --delmode %s%d %s", "DVI", i, old_mode); + system(output); + } + for (i = 0; i < 3; i++) + { + snprintf(output, sizeof(output), "xrandr --addmode %s-%d %s", "DVI", i, new_mode); + system(output); + snprintf(output, sizeof(output), "xrandr --delmode %s-%d %s", "DVI", i, old_mode); + system(output); + } + for (i = 0; i < 3; i++) + { + snprintf(output, sizeof(output), "xrandr --addmode %s%d %s", "VGA", i, new_mode); + system(output); + snprintf(output, sizeof(output), "xrandr --delmode %s%d %s", "VGA", i, old_mode); + system(output); + } + for (i = 0; i < 3; i++) + { + snprintf(output, sizeof(output), "xrandr --addmode %s-%d %s", "VGA", i, new_mode); + system(output); + snprintf(output, sizeof(output), "xrandr --delmode %s-%d %s", "VGA", i, old_mode); + system(output); + } - return true; + snprintf(output, sizeof(output), "xrandr -s %s", new_mode); + system(output); + + /* remove old mode */ + snprintf(output, sizeof(output), "xrandr --rmmode %s", old_mode); + system(output); + + system("xdotool windowactivate $(xdotool search --class RetroArch)"); /* needs xdotool installed. needed to recapture window. */ + + /* variable for old mode */ + snprintf(old_mode, sizeof(old_mode), "%s", new_mode); + + system("xdotool windowactivate $(xdotool search --class RetroArch)"); /* needs xdotool installed. needed to recapture window. */ + /* Second run needed as some times it runs to fast to capture first time */ + + return true; } const char *x11_display_server_get_output_options(void) @@ -309,4 +312,3 @@ const video_display_server_t dispserv_x11 = { x11_display_server_get_output_options, "x11" }; - diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 66f45482d5..aa0f52dba7 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -953,7 +953,7 @@ static bool gl_frame(void *data, const void *frame, return false; #ifdef HAVE_LIBNX - // Should be called once per frame + /* Should be called once per frame */ if(!appletMainLoop()) return false; #endif @@ -1506,31 +1506,38 @@ static const gfx_ctx_driver_t *gl_get_context(gl_t *gl) struct retro_hw_render_callback *hwr = video_driver_get_hw_context(); unsigned major = hwr->version_major; unsigned minor = hwr->version_minor; + enum retro_hw_context_type ctx_type = hwr->context_type; + bool hw_context_in_use = ctx_type != RETRO_HW_CONTEXT_NONE; #ifdef HAVE_OPENGLES api = GFX_CTX_OPENGL_ES_API; api_name = "OpenGL ES 2.0"; - if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES3) + switch (ctx_type) { - major = 3; - minor = 0; - api_name = "OpenGL ES 3.0"; + case RETRO_HW_CONTEXT_OPENGLES3: + major = 3; + minor = 0; + api_name = "OpenGL ES 3.0"; + break; + case RETRO_HW_CONTEXT_OPENGLES_VERSION: + api_name = "OpenGL ES 3.1+"; + break; + case RETRO_HW_CONTEXT_NONE: + default: + break; } - else if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES_VERSION) - api_name = "OpenGL ES 3.1+"; #else - api = GFX_CTX_OPENGL_API; - api_name = "OpenGL"; + api = GFX_CTX_OPENGL_API; + api_name = "OpenGL"; #endif (void)api_name; gl_shared_context_use = settings->bools.video_shared_context - && hwr->context_type != RETRO_HW_CONTEXT_NONE; + && hw_context_in_use; - if ( (libretro_get_shared_context()) - && (hwr->context_type != RETRO_HW_CONTEXT_NONE)) + if (libretro_get_shared_context() && hw_context_in_use) gl_shared_context_use = true; return video_context_driver_init_first(gl, diff --git a/gfx/video_crt_switch.c b/gfx/video_crt_switch.c index a96218544b..282d2aea39 100644 --- a/gfx/video_crt_switch.c +++ b/gfx/video_crt_switch.c @@ -1,210 +1,206 @@ -/* CRT SwitchRes Core - * Copyright (C) 2018 Alphanu / Ben Templeman. - * - * RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . -*/ -#include -#include -#include - -#include "video_driver.h" -#include "video_crt_switch.h" -#include "video_display_server.h" - -static unsigned ra_core_width = 0; -static unsigned ra_core_height = 0; -static unsigned ra_tmp_width = 0; -static unsigned ra_tmp_height = 0; -static unsigned ra_set_core_hz = 0; -static unsigned orig_width = 0; -static unsigned orig_height = 0; -static int crt_center_adjust = 0; - -static bool first_run = true; - -static float ra_tmp_core_hz = 0.0f; -static float fly_aspect = 0.0f; -static float ra_core_hz = 0.0f; - -static void crt_check_first_run(void) -{ - if (!first_run) - return; - - - - first_run = false; -} - -static void switch_crt_hz(void) -{ - if (ra_core_hz == ra_tmp_core_hz) - return; - /* set hz float to an int for windows switching */ - if (ra_core_hz < 100) - { - if (ra_core_hz < 53) - ra_set_core_hz = 50; - if (ra_core_hz >= 53 && ra_core_hz < 57) - ra_set_core_hz = 55; - if (ra_core_hz >= 57) - ra_set_core_hz = 60; - } - - if (ra_core_hz > 100) - { - if (ra_core_hz < 106) - ra_set_core_hz = 120; - if (ra_core_hz >= 106 && ra_core_hz < 114) - ra_set_core_hz = 110; - if (ra_core_hz >= 114) - ra_set_core_hz = 120; - } - - video_monitor_set_refresh_rate(ra_set_core_hz); - - ra_tmp_core_hz = ra_core_hz; -} - - -void crt_aspect_ratio_switch(unsigned width, unsigned height) -{ - /* send aspect float to videeo_driver */ - fly_aspect = (float)width / height; - video_driver_set_aspect_ratio_value((float)fly_aspect); -} - -static void switch_res_crt(unsigned width, unsigned height) -{ - if (height > 100) - { - video_display_server_switch_resolution(width, height, - ra_set_core_hz, ra_core_hz, crt_center_adjust); - video_driver_apply_state_changes(); - } -} - -/* Create correct aspect to fit video if resolution does not exist */ -static void crt_screen_setup_aspect(unsigned width, unsigned height) -{ - - switch_crt_hz(); - /* get original resolution of core */ - if (height == 4) - { - /* detect menu only */ - if (width < 1920) - width = 320; - - height = 240; - - crt_aspect_ratio_switch(width, height); - } - - if (height < 200 && height != 144) - { - crt_aspect_ratio_switch(width, height); - height = 200; - } - - if (height > 200) - crt_aspect_ratio_switch(width, height); - - if (height == 144 && ra_set_core_hz == 50) - { - height = 288; - crt_aspect_ratio_switch(width, height); - } - - if (height > 200 && height < 224) - { - crt_aspect_ratio_switch(width, height); - height = 224; - } - - if (height > 224 && height < 240) - { - crt_aspect_ratio_switch(width, height); - height = 240; - } - - if (height > 240 && height < 255) - { - crt_aspect_ratio_switch(width, height); - height = 254; - } - - if (height == 528 && ra_set_core_hz == 60) - { - crt_aspect_ratio_switch(width, height); - height = 480; - } - - if (height >= 240 && height < 255 && ra_set_core_hz == 55) - { - crt_aspect_ratio_switch(width, height); - height = 254; - } - - switch_res_crt(width, height); -} - - -void crt_switch_res_core(unsigned width, unsigned height, float hz, unsigned crt_mode, int crt_switch_center_adjust) -{ - /* ra_core_hz float passed from within - * void video_driver_monitor_adjust_system_rates(void) */ - ra_core_width = width; - ra_core_height = height; - ra_core_hz = hz; - crt_center_adjust = crt_switch_center_adjust; - - if (crt_mode == 2) - { - if (hz > 53) - ra_core_hz = hz*2; - - if (hz <= 53) - ra_core_hz = 120.0f; - } - - crt_check_first_run(); - - /* Detect resolution change and switch */ - if ( - (ra_tmp_height != ra_core_height) || - (ra_core_width != ra_tmp_width) - ) - crt_screen_setup_aspect(width, height); - - ra_tmp_height = ra_core_height; - ra_tmp_width = ra_core_width; - - /* Check if aspect is correct, if notchange */ - if (video_driver_get_aspect_ratio() != fly_aspect) - { - video_driver_set_aspect_ratio_value((float)fly_aspect); - video_driver_apply_state_changes(); - } -} - -void crt_video_restore(void) -{ - if (first_run) - return; - - first_run = true; -} +/* CRT SwitchRes Core + * Copyright (C) 2018 Alphanu / Ben Templeman. + * + * RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2017 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ +#include +#include +#include + +#include "video_driver.h" +#include "video_crt_switch.h" +#include "video_display_server.h" + +static unsigned ra_core_width = 0; +static unsigned ra_core_height = 0; +static unsigned ra_tmp_width = 0; +static unsigned ra_tmp_height = 0; +static unsigned ra_set_core_hz = 0; +static unsigned orig_width = 0; +static unsigned orig_height = 0; +static int crt_center_adjust = 0; + +static bool first_run = true; + +static float ra_tmp_core_hz = 0.0f; +static float fly_aspect = 0.0f; +static float ra_core_hz = 0.0f; + +static void crt_check_first_run(void) +{ + if (!first_run) + return; + + first_run = false; +} + +static void switch_crt_hz(void) +{ + if (ra_core_hz == ra_tmp_core_hz) + return; + /* set hz float to an int for windows switching */ + if (ra_core_hz < 100) + { + if (ra_core_hz < 53) + ra_set_core_hz = 50; + if (ra_core_hz >= 53 && ra_core_hz < 57) + ra_set_core_hz = 55; + if (ra_core_hz >= 57) + ra_set_core_hz = 60; + } + + if (ra_core_hz > 100) + { + if (ra_core_hz < 106) + ra_set_core_hz = 120; + if (ra_core_hz >= 106 && ra_core_hz < 114) + ra_set_core_hz = 110; + if (ra_core_hz >= 114) + ra_set_core_hz = 120; + } + + video_monitor_set_refresh_rate(ra_set_core_hz); + + ra_tmp_core_hz = ra_core_hz; +} + +void crt_aspect_ratio_switch(unsigned width, unsigned height) +{ + /* send aspect float to videeo_driver */ + fly_aspect = (float)width / height; + video_driver_set_aspect_ratio_value((float)fly_aspect); +} + +static void switch_res_crt(unsigned width, unsigned height) +{ + if (height > 100) + { + video_display_server_switch_resolution(width, height, + ra_set_core_hz, ra_core_hz, crt_center_adjust); + video_driver_apply_state_changes(); + } +} + +/* Create correct aspect to fit video if resolution does not exist */ +static void crt_screen_setup_aspect(unsigned width, unsigned height) +{ + + switch_crt_hz(); + /* get original resolution of core */ + if (height == 4) + { + /* detect menu only */ + if (width < 1920) + width = 320; + + height = 240; + + crt_aspect_ratio_switch(width, height); + } + + if (height < 200 && height != 144) + { + crt_aspect_ratio_switch(width, height); + height = 200; + } + + if (height > 200) + crt_aspect_ratio_switch(width, height); + + if (height == 144 && ra_set_core_hz == 50) + { + height = 288; + crt_aspect_ratio_switch(width, height); + } + + if (height > 200 && height < 224) + { + crt_aspect_ratio_switch(width, height); + height = 224; + } + + if (height > 224 && height < 240) + { + crt_aspect_ratio_switch(width, height); + height = 240; + } + + if (height > 240 && height < 255) + { + crt_aspect_ratio_switch(width, height); + height = 254; + } + + if (height == 528 && ra_set_core_hz == 60) + { + crt_aspect_ratio_switch(width, height); + height = 480; + } + + if (height >= 240 && height < 255 && ra_set_core_hz == 55) + { + crt_aspect_ratio_switch(width, height); + height = 254; + } + + switch_res_crt(width, height); +} + +void crt_switch_res_core(unsigned width, unsigned height, float hz, unsigned crt_mode, int crt_switch_center_adjust) +{ + /* ra_core_hz float passed from within + * void video_driver_monitor_adjust_system_rates(void) */ + ra_core_width = width; + ra_core_height = height; + ra_core_hz = hz; + crt_center_adjust = crt_switch_center_adjust; + + if (crt_mode == 2) + { + if (hz > 53) + ra_core_hz = hz * 2; + + if (hz <= 53) + ra_core_hz = 120.0f; + } + + crt_check_first_run(); + + /* Detect resolution change and switch */ + if ( + (ra_tmp_height != ra_core_height) || + (ra_core_width != ra_tmp_width) + ) + crt_screen_setup_aspect(width, height); + + ra_tmp_height = ra_core_height; + ra_tmp_width = ra_core_width; + + /* Check if aspect is correct, if notchange */ + if (video_driver_get_aspect_ratio() != fly_aspect) + { + video_driver_set_aspect_ratio_value((float)fly_aspect); + video_driver_apply_state_changes(); + } +} + +void crt_video_restore(void) +{ + if (first_run) + return; + + first_run = true; +} diff --git a/gfx/video_crt_switch.h b/gfx/video_crt_switch.h index d23c4c3059..98cfd4150b 100644 --- a/gfx/video_crt_switch.h +++ b/gfx/video_crt_switch.h @@ -1,38 +1,38 @@ -/* CRT SwitchRes Core - * Copyright (C) 2018 Alphanu / Ben Templeman. - * - * RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . -*/ - -#ifndef __VIDEO_CRT_SWITCH_H__ -#define __VIDEO_CRT_SWITCH_H__ - -#include - -#include -#include - -RETRO_BEGIN_DECLS - -void crt_switch_res_core(unsigned width, unsigned height, float hz, unsigned crt_mode, int crt_switch_center_adjust); - -void crt_aspect_ratio_switch(unsigned width, unsigned height); - -void crt_video_restore(void); - -RETRO_END_DECLS - -#endif +/* CRT SwitchRes Core + * Copyright (C) 2018 Alphanu / Ben Templeman. + * + * RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2017 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#ifndef __VIDEO_CRT_SWITCH_H__ +#define __VIDEO_CRT_SWITCH_H__ + +#include + +#include +#include + +RETRO_BEGIN_DECLS + +void crt_switch_res_core(unsigned width, unsigned height, float hz, unsigned crt_mode, int crt_switch_center_adjust); + +void crt_aspect_ratio_switch(unsigned width, unsigned height); + +void crt_video_restore(void); + +RETRO_END_DECLS + +#endif diff --git a/griffin/griffin.c b/griffin/griffin.c index 7dd8499911..30d8c7718a 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -181,9 +181,7 @@ ACHIEVEMENTS /*============================================================ MD5 ============================================================ */ -#if defined(HAVE_CHEEVOS) || (defined(HAVE_HTTPSERVER) && defined(HAVE_ZLIB)) #include "../libretro-common/utils/md5.c" -#endif /*============================================================ CHEATS diff --git a/input/drivers/switch_input.c b/input/drivers/switch_input.c index 8ed989afa6..26cfd510d5 100644 --- a/input/drivers/switch_input.c +++ b/input/drivers/switch_input.c @@ -16,6 +16,7 @@ #include "../input_driver.h" #define MAX_PADS 10 +#define TOUCH_AXIS_MAX 0x7fff /* abstraction of pointer coords */ /* TODO/FIXME - * fix game focus toggle */ @@ -29,6 +30,12 @@ typedef struct switch_input uint32_t touch_x; uint32_t touch_y; + uint32_t touch_scale_x; + uint32_t touch_scale_y; + + uint32_t touch_half_resolution_x; + uint32_t touch_half_resolution_y; + bool touch_state; #endif } switch_input_t; @@ -57,24 +64,18 @@ static void switch_input_poll(void *data) } #ifdef HAVE_LIBNX -static int16_t scale_touch(int16_t from_min, int16_t from_max, - int16_t to_min, int16_t to_max, - int16_t value) +void calc_touch_scaling(switch_input_t *sw, uint32_t x, uint32_t y, uint32_t axis_max) { - int32_t from_range = from_max - from_min; - int32_t to_range = to_max - to_min; + sw->touch_half_resolution_x = x/2; + sw->touch_half_resolution_y = y/2; - return (((value - from_min) * to_range) / from_range) + to_min; + sw->touch_scale_x = axis_max / sw->touch_half_resolution_x; + sw->touch_scale_y = axis_max / sw->touch_half_resolution_y; } static int16_t switch_pointer_device_state(switch_input_t *sw, unsigned id, unsigned idx) { - /* - Here we assume that the touch screen is always 1280x720 - Call me back when a Nintendo Switch XL is out - */ - if (idx != 0) return 0; @@ -83,9 +84,9 @@ static int16_t switch_pointer_device_state(switch_input_t *sw, case RETRO_DEVICE_ID_POINTER_PRESSED: return sw->touch_state; case RETRO_DEVICE_ID_POINTER_X: - return scale_touch(0, 1280, -0x7fff, 0x7fff, (uint16_t) sw->touch_x); + return ((sw->touch_x - sw->touch_half_resolution_x) * sw->touch_scale_x); case RETRO_DEVICE_ID_POINTER_Y: - return scale_touch(0, 720, -0x7fff, 0x7fff, (uint16_t) sw->touch_y); + return ((sw->touch_y - sw->touch_half_resolution_y) * sw->touch_scale_y); } return 0; @@ -142,6 +143,15 @@ static void* switch_input_init(const char *joypad_driver) sw->joypad = input_joypad_init_driver(joypad_driver, sw); +#ifdef HAVE_LIBNX + /* + Here we assume that the touch screen is always 1280x720 + Call me back when a Nintendo Switch XL is out + */ + + calc_touch_scaling(sw, 1280, 720, TOUCH_AXIS_MAX); +#endif + return sw; } @@ -149,7 +159,13 @@ static uint64_t switch_input_get_capabilities(void *data) { (void) data; - return (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_ANALOG); + uint64_t caps = (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_ANALOG); + +#ifdef HAVE_LIBNX + caps |= (1 << RETRO_DEVICE_POINTER); +#endif + + return caps; } static const input_device_driver_t *switch_input_get_joypad_driver(void *data) diff --git a/input/input_autodetect_builtin.c b/input/input_autodetect_builtin.c index 9af86a6dbc..df74a8627f 100644 --- a/input/input_autodetect_builtin.c +++ b/input/input_autodetect_builtin.c @@ -554,30 +554,30 @@ DECL_AXIS(r_y_minus, +3) #endif #define SWITCH_DEFAULT_BINDS \ -DECL_BTN(a, 0) \ -DECL_BTN(b, 1) \ -DECL_BTN(x, 2) \ -DECL_BTN(y, 3) \ -DECL_BTN(start, 10) \ -DECL_BTN(select, 11) \ -DECL_BTN(up, 13) \ -DECL_BTN(down, 15) \ -DECL_BTN(left, 12) \ -DECL_BTN(right, 14) \ -DECL_BTN(l, 6) \ -DECL_BTN(r, 7) \ -DECL_BTN(l2, 8) \ -DECL_BTN(r2, 9) \ -DECL_BTN(l3, 4) \ -DECL_BTN(r3, 5) \ -DECL_AXIS(l_x_plus, +0) \ -DECL_AXIS(l_x_minus, -0) \ -DECL_AXIS(l_y_plus, +1) \ -DECL_AXIS(l_y_minus, -1) \ -DECL_AXIS(r_x_plus, +2) \ -DECL_AXIS(r_x_minus, -2) \ -DECL_AXIS(r_y_plus, +3) \ -DECL_AXIS(r_y_minus, -3) +DECL_BTN_EX(a, 0, "A") \ +DECL_BTN_EX(b, 1, "B") \ +DECL_BTN_EX(x, 2, "X") \ +DECL_BTN_EX(y, 3, "Y") \ +DECL_BTN_EX(start, 10, "Plus") \ +DECL_BTN_EX(select, 11, "Minus") \ +DECL_BTN_EX(up, 13, "D-Pad up") \ +DECL_BTN_EX(down, 15, "D-Pad down") \ +DECL_BTN_EX(left, 12, "D-Pad left") \ +DECL_BTN_EX(right, 14, "D-Pad right") \ +DECL_BTN_EX(l, 6, "L") \ +DECL_BTN_EX(r, 7, "R") \ +DECL_BTN_EX(l2, 8, "ZL") \ +DECL_BTN_EX(r2, 9, "ZR") \ +DECL_BTN_EX(l3, 4, "L3") \ +DECL_BTN_EX(r3, 5, "R3") \ +DECL_AXIS_EX(l_x_plus, +0, "L-Stick right") \ +DECL_AXIS_EX(l_x_minus, -0, "L-Stick left") \ +DECL_AXIS_EX(l_y_plus, +1, "L-Stick down") \ +DECL_AXIS_EX(l_y_minus, -1, "L-Stick up") \ +DECL_AXIS_EX(r_x_plus, +2, "R-Stick right") \ +DECL_AXIS_EX(r_x_minus, -2, "R-Stick left") \ +DECL_AXIS_EX(r_y_plus, +3, "R-Stick down") \ +DECL_AXIS_EX(r_y_minus, -3, "R-Stick up") #define EMSCRIPTEN_DEFAULT_BINDS \ DECL_BTN(a, 1) \ diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index 978563158f..e47f4ba0c0 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -1,4 +1,4 @@ -MSG_HASH( +MSG_HASH( MSG_COMPILER, "Compiler" ) @@ -1308,8 +1308,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "Start Content") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "TGDB Rating") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "Reboot into RCM") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "Reboot") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Recording Config") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, diff --git a/intl/msg_hash_chs.c b/intl/msg_hash_chs.c index 82a5da215b..7a07249434 100644 --- a/intl/msg_hash_chs.c +++ b/intl/msg_hash_chs.c @@ -59,19 +59,19 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case RARCH_PAUSE_TOGGLE: snprintf(s, len, - "在暂停和不暂停状态间切换。"); + "在暂停和非暂停状态间切换。"); break; case RARCH_FRAMEADVANCE: snprintf(s, len, - "Frame advance when content is paused."); + "在暂停时,运行一帧。"); break; case RARCH_SHADER_NEXT: snprintf(s, len, - "应用文件夹中的下一个Shader特效。"); + "应用文件夹中的后一个渲染器特效。"); break; case RARCH_SHADER_PREV: snprintf(s, len, - "应用文件夹中的上一个Shader特效。"); + "应用文件夹中的前一个渲染器特效。"); break; case RARCH_CHEAT_INDEX_PLUS: case RARCH_CHEAT_INDEX_MINUS: @@ -81,7 +81,7 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case RARCH_RESET: snprintf(s, len, - "重置游戏内容。"); + "重启游戏。"); break; case RARCH_SCREENSHOT: snprintf(s, len, @@ -97,7 +97,7 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case RARCH_ENABLE_HOTKEY: snprintf(s, len, - "启用其他热键. \n" + "启用其他热键。 \n" " \n" "If this hotkey is bound to either\n" "a keyboard, joybutton or joyaxis, \n" @@ -122,20 +122,20 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case RARCH_OVERLAY_NEXT: snprintf(s, len, - "切换到下一个屏幕覆层。将会循环选择。"); + "切换到下一个屏幕图层。将会循环选择。"); break; case RARCH_DISK_EJECT_TOGGLE: snprintf(s, len, - "切换弹出光盘。 \n" + "切换光盘弹出状态。 \n" " \n" - "用于多光盘内容。 "); + "用于多光盘游戏。 "); break; case RARCH_DISK_NEXT: case RARCH_DISK_PREV: snprintf(s, len, - "磁盘镜像周期。弹出后使用。 \n" + "切换下一张光盘。弹出光盘后才能使用。 \n" " \n" - "再次开关弹出完成。"); + "再次切换光盘弹出状态完成换盘。"); break; case RARCH_GRAB_MOUSE_TOGGLE: snprintf(s, len, @@ -150,7 +150,7 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case RARCH_LOAD_STATE_KEY: snprintf(s, len, - "加载游戏状态。"); + "加载即时存档。"); break; case RARCH_FULLSCREEN_TOGGLE_KEY: snprintf(s, len, @@ -171,23 +171,23 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) case RARCH_STATE_SLOT_PLUS: case RARCH_STATE_SLOT_MINUS: snprintf(s, len, - "状态存储槽 \n" - " \n" - "当槽位选择为0时,状态存档将以*.state命名(或其他 \n" + "即时存档栏位 \n" + "\n" + "当选择0号栏位时,即时存档将以*.state命名(或其他 \n" "在命令行中定义的名称)。 \n" - " \n" - "当状态槽不为0时,路径将会设为,其中 \n" - "是状态槽的索引。"); + "\n" + "当栏位不为0时,路径将会设为,其中 \n" + "是栏位的编号。"); break; case RARCH_SAVE_STATE_KEY: snprintf(s, len, - "保存游戏状态。"); + "保存即时存档。"); break; case RARCH_REWIND: snprintf(s, len, "按住按钮来回溯 \n" " \n" - "回溯功能必须被启用。"); + "必须先启用回溯倒带功能。"); break; case RARCH_BSV_RECORD_TOGGLE: snprintf(s, len, @@ -206,82 +206,81 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) { case MENU_ENUM_LABEL_ACCOUNTS_RETRO_ACHIEVEMENTS: snprintf(s, len, "你的登陆信息 \n" - "Retro Achievements 账号. \n" + "Retro成就账号。 \n" " \n" "访问 retroachievements.org 并注册 \n" - "以获取一个免费账号. \n" + "以获取一个免费账号。 \n" " \n" "在你注册以后, 你需要 \n" "在RetroArch输入你的 \n" - "账号以及密码."); + "账号以及密码。"); break; case MENU_ENUM_LABEL_CHEEVOS_USERNAME: - snprintf(s, len, "你的Retro Achievements账号的用户名。"); + snprintf(s, len, "你的Retro成就账号的用户名。"); break; case MENU_ENUM_LABEL_CHEEVOS_PASSWORD: - snprintf(s, len, "你的Retro Achievements账号的密码。"); + snprintf(s, len, "你的Retro成就账号的密码。"); break; case MENU_ENUM_LABEL_USER_LANGUAGE: - snprintf(s, len, "依据选择的语言来本地化菜单和其他屏显消息。 \n" + snprintf(s, len, "变更菜单和提示消息的语言设定, \n" " \n" - "需要重新启动来使之生效。 \n" + "需要重新启动才能生效。 \n" " \n" - "注意:可能不是所有的语言都已完成翻译工作。 \n" + "注意:部分语言的翻译并不完全。 \n" " \n" - "若一个语言没有被翻译,则会退回到英语显示。"); + "若一个语言尚未翻译,则会恢复英文显示。"); break; case MENU_ENUM_LABEL_VIDEO_FONT_PATH: snprintf(s, len, "改变屏显文字的字体。"); break; case MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS: - snprintf(s, len, "自动加载游戏内容指定的核心选项."); + snprintf(s, len, "自动加载各游戏单独设定的选项。"); break; case MENU_ENUM_LABEL_AUTO_OVERRIDES_ENABLE: snprintf(s, len, "自动加载覆盖配置。"); break; case MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE: - snprintf(s, len, "自动加载输入重映射文件."); + snprintf(s, len, "自动加载自定义键位文件。"); break; case MENU_ENUM_LABEL_SORT_SAVESTATES_ENABLE: - snprintf(s, len, "Sort save states in folders \n" - "named after the libretro core used."); + snprintf(s, len, "在即时存档的文件名前面加上核心名称 \n" + "来进行排序。"); break; case MENU_ENUM_LABEL_SORT_SAVEFILES_ENABLE: - snprintf(s, len, "Sort save files in folders \n" - "named after the libretro core used."); + snprintf(s, len, "在游戏存档的文件名前面加上核心名称 \n" + "来进行排序。"); break; case MENU_ENUM_LABEL_RESUME_CONTENT: - snprintf(s, len, "Exits from the menu and returns back \n" - "to the content."); + snprintf(s, len, "关闭菜单,返回游戏。"); break; case MENU_ENUM_LABEL_RESTART_CONTENT: - snprintf(s, len, "Restarts the content from the beginning."); + snprintf(s, len, "从头开始游戏。"); break; case MENU_ENUM_LABEL_CLOSE_CONTENT: - snprintf(s, len, "关闭内容并从内存中卸载。"); + snprintf(s, len, "完全关闭游戏。"); break; case MENU_ENUM_LABEL_UNDO_LOAD_STATE: - snprintf(s, len, "If a state was loaded, content will \n" - "go back to the state prior to loading."); + snprintf(s, len, "如果你不慎读错了即时存档,\n" + "使用此命令来撤销。"); break; case MENU_ENUM_LABEL_UNDO_SAVE_STATE: - snprintf(s, len, "如果状态被覆盖,它将 \n" - "它将回滚到上一保存的状态。"); + snprintf(s, len, "如果你不慎覆盖了即时存档,\n" + "使用此命令来撤销。"); break; case MENU_ENUM_LABEL_TAKE_SCREENSHOT: - snprintf(s, len, "创建一份截图. \n" + snprintf(s, len, "创建一份截图。\n" " \n" "截图文件将会存放在 \n" - "截图目录之中."); + "截图文件夹之中."); break; case MENU_ENUM_LABEL_ADD_TO_FAVORITES: snprintf(s, len, "添加到收藏夹."); break; case MENU_ENUM_LABEL_RUN: - snprintf(s, len, "启动内容."); + snprintf(s, len, "启动游戏."); break; case MENU_ENUM_LABEL_INFORMATION: - snprintf(s, len, "显示本内容的额外 \n" + snprintf(s, len, "显示本游戏的额外 \n" "元数据信息."); break; case MENU_ENUM_LABEL_FILE_BROWSER_CONFIG: @@ -302,43 +301,42 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) case MENU_ENUM_LABEL_SCAN_THIS_DIRECTORY: snprintf(s, len, "选择本项以扫描当前 \n" - "目录中的内容."); + "文件夹中的游戏。"); break; case MENU_ENUM_LABEL_USE_THIS_DIRECTORY: snprintf(s, len, - "选择本目录作为指定目录."); + "选择本文件夹作为指定文件夹。"); break; case MENU_ENUM_LABEL_CONTENT_DATABASE_DIRECTORY: snprintf(s, len, - "内容数据库目录。 \n" + "游戏数据库文件夹。 \n" " \n" - "到内容数据库目录的 \n" - "路径。"); + "到游戏数据库文件夹的路径。"); break; case MENU_ENUM_LABEL_THUMBNAILS_DIRECTORY: snprintf(s, len, - "缩略图目录. \n" + "缩略图文件夹。 \n" " \n" - "用以存放缩略图."); + "用以存放缩略图。"); break; case MENU_ENUM_LABEL_LIBRETRO_INFO_PATH: snprintf(s, len, - "核心Core信息目录. \n" + "模拟器核心信息文件夹。 \n" " \n" "用于搜索libretro核心信息 \n" - "的目录。"); + "的文件夹。"); break; case MENU_ENUM_LABEL_PLAYLIST_DIRECTORY: snprintf(s, len, - "运行列表目录. \n" + "运行列表文件夹. \n" " \n" "保存所有播放列表到 \n" - "此目录。"); + "此文件夹。"); break; case MENU_ENUM_LABEL_DUMMY_ON_CORE_SHUTDOWN: snprintf(s, len, "某些libretro核心可能会 \n" - "支持关机特性. \n" + "支持关机特性。 \n" " \n" "If this option is left disabled, \n" "selecting the shutdown procedure \n" @@ -352,29 +350,26 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_CHECK_FOR_MISSING_FIRMWARE: snprintf(s, len, - "Some cores might need \n" - "firmware or bios files. \n" + "某些核心可能需要固件或 BIOS 文件。 \n" " \n" - "If this option is disabled, \n" - "it will try to load even if such \n" - "firmware is missing. \n" - "down. \n"); + "如果禁用此选项,即使没有固件或 BIOS" + "也会尝试强行加载。 \n"); break; case MENU_ENUM_LABEL_PARENT_DIRECTORY: snprintf(s, len, - "回到上级目录。"); + "回到上级文件夹。"); break; case MENU_ENUM_LABEL_FILE_BROWSER_SHADER_PRESET: snprintf(s, len, - "Shader预设文件。"); + "渲染器预设文件。"); break; case MENU_ENUM_LABEL_FILE_BROWSER_SHADER: snprintf(s, len, - "Shader文件。"); + "渲染器文件。"); break; case MENU_ENUM_LABEL_FILE_BROWSER_REMAP: snprintf(s, len, - "控制重映射文件。"); + "控制自定义键位文件。"); break; case MENU_ENUM_LABEL_FILE_BROWSER_CHEAT: snprintf(s, len, @@ -382,7 +377,7 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_FILE_BROWSER_OVERLAY: snprintf(s, len, - "覆层文件。"); + "图层文件。"); break; case MENU_ENUM_LABEL_FILE_BROWSER_RDB: snprintf(s, len, @@ -390,7 +385,7 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_FILE_BROWSER_FONT: snprintf(s, len, - "TrueType字体文件。"); + "TrueType 字体文件。"); break; case MENU_ENUM_LABEL_FILE_BROWSER_PLAIN_FILE: snprintf(s, len, @@ -420,50 +415,50 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION: snprintf(s, len, - "Libretro核心 \n" + "Libretro 核心 \n" " \n" "选中核心将会使其关联至游戏。"); break; case MENU_ENUM_LABEL_FILE_BROWSER_CORE: snprintf(s, len, - "Libretro核心 \n" + "Libretro 核心 \n" " \n" "选择该文件使 RetroArch 加载该核心。"); break; case MENU_ENUM_LABEL_FILE_BROWSER_DIRECTORY: snprintf(s, len, - "目录 \n" + "文件夹 \n" " \n" "选择并打开该文件夹。"); break; case MENU_ENUM_LABEL_CACHE_DIRECTORY: snprintf(s, len, - "缓存目录 \n" + "缓存文件夹 \n" " \n" - "被RetroArch解压的游戏内容会临时存放到这个文 \n" + "被 RetroArch 解压的游戏内容会临时存放到这个文 \n" "件夹。"); break; case MENU_ENUM_LABEL_HISTORY_LIST_ENABLE: snprintf(s, len, - "若开启,所有在RetroArch中加载过的文件 \n" + "若开启,所有在 RetroArch 中加载过的文件 \n" "都会自动的放入最近使用历史列表中。"); break; case MENU_ENUM_LABEL_RGUI_BROWSER_DIRECTORY: snprintf(s, len, - "文件浏览器目录 \n" + "文件浏览器文件夹 \n" " \n" - "设置文件浏览器的初始目录。"); + "设置文件浏览器的初始文件夹。"); break; case MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR: snprintf(s, len, - "影响输入轮询过程在RetroArch中的执行方式。 \n" + "影响输入轮询过程在 RetroArch 中的执行方式。 \n" " \n" "稍早 - 输入轮询过程将在帧生成之前执行。 \n" "正常 - 输入轮询过程将在被请求时执行。 \n" "稍晚 - 输入轮询过程将在每一帧的首次请求时执行。 \n" " \n" - "依据设置的不同,设置为“稍早”或“稍晚”可以获得较低 \n" - "的时延。 \n" + "依据设置的不同,设置为「稍早」或「稍晚」可以获得 \n" + "较低的延迟。 \n" "当在进行在线游戏时,不管设置的值如何,都只会启用 \n" "正常模式进行输入轮询过程。" ); @@ -479,10 +474,11 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VIDEO_FORCE_SRGB_DISABLE: snprintf(s, len, - "强制关闭sRGB帧缓冲支持。\n" + "禁用 sRGB 帧缓冲支持。\n" "\n" - "某些在Windows上的Intel的OpenGL驱动会对sRGB帧缓 \n" - "冲支持产生问题,需要启用以强制关闭程序对其的使用。"); + "某些在 Windows 上的 Intel OpenGL 驱动 \n" + "对 sRGB 帧缓冲支持存在问题, \n" + "需要启用此选项以禁用帧缓冲。"); break; case MENU_ENUM_LABEL_AUDIO_ENABLE: snprintf(s, len, @@ -494,47 +490,42 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_AUDIO_LATENCY: snprintf(s, len, - "Desired audio latency in milliseconds. \n" - "Might not be honored if the audio driver \n" - "can't provide given latency."); + "音频延迟(单位:毫秒) \n" + "如果设置太低,音频驱动可能 \n" + "并不支持,从而不会生效。"); break; case MENU_ENUM_LABEL_VIDEO_ALLOW_ROTATE: snprintf(s, len, - "Allow cores to set rotation. If false, \n" - "rotation requests are honored, but ignored.\n\n" - "Used for setups where one manually rotates \n" - "the monitor."); + "允许核心自行设置屏幕旋转角度,\n" + "若关闭,旋转请求将不会得到执行。\n" + "需要旋转显示器的用户请设置此选项。\n"); break; case MENU_ENUM_LABEL_INPUT_DESCRIPTOR_LABEL_SHOW: snprintf(s, len, - "Show the input descriptors set by the core \n" - "instead of the default ones."); + "显示由核心设置的输入设备硬件信息,而非默认。"); break; case MENU_ENUM_LABEL_CONTENT_HISTORY_SIZE: snprintf(s, len, - "Number of entries that will be kept in \n" - "content history playlist."); + "在历史记录中最多保存的游戏个数。"); break; case MENU_ENUM_LABEL_VIDEO_WINDOWED_FULLSCREEN: snprintf(s, len, - "To use windowed mode or not when going \n" - "fullscreen."); + "使用无边框全屏替代普通全屏模式。"); break; case MENU_ENUM_LABEL_VIDEO_FONT_SIZE: snprintf(s, len, - "屏显信息的字体大小."); + "屏显信息的字体大小。"); break; case MENU_ENUM_LABEL_SAVESTATE_AUTO_INDEX: snprintf(s, len, - "Automatically increment slot index on each save, \n" - "generating multiple savestate files. \n" - "When the content is loaded, state slot will be \n" - "set to the highest existing value (last savestate)."); + "每次储存即时存档时,都在新的栏位储存, \n" + "以避免覆盖原有的即时存档。 \n" + "每次运行游戏时,都会定位到最新的 \n" + "即时存档栏位。"); break; case MENU_ENUM_LABEL_FPS_SHOW: snprintf(s, len, - "Enables displaying the current frames \n" - "per second."); + "显示/隐藏帧数"); break; case MENU_ENUM_LABEL_VIDEO_FONT_ENABLE: snprintf(s, len, @@ -543,17 +534,16 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) case MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_X: case MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_Y: snprintf(s, len, - "Offset for where messages will be placed \n" - "onscreen. Values are in range [0.0, 1.0]."); + "提示消息在屏幕上显示的位置,\n" + "数值范围为0.0至1.0。"); break; case MENU_ENUM_LABEL_INPUT_OVERLAY_ENABLE: snprintf(s, len, - "Enable or disable the current overlay."); + "显示/隐藏当前按下的键位。"); break; case MENU_ENUM_LABEL_INPUT_OVERLAY_HIDE_IN_MENU: snprintf(s, len, - "Hide the current overlay from appearing \n" - "inside the menu."); + "在进入菜单时,不显示当前按下的键位。"); break; case MENU_ENUM_LABEL_OVERLAY_PRESET: snprintf(s, len, @@ -561,26 +551,23 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_OVERLAY_OPACITY: snprintf(s, len, - "Overlay opacity."); + "图层透明度。"); break; case MENU_ENUM_LABEL_INPUT_BIND_TIMEOUT: snprintf(s, len, - "Input bind timer timeout (in seconds). \n" - "Amount of seconds to wait until proceeding \n" - "to the next bind."); + "绑定键位时的等待时间(单位:秒)"); break; case MENU_ENUM_LABEL_INPUT_BIND_HOLD: snprintf(s, len, - "Input bind hold time (in seconds). \n" - "Amount of seconds to hold an input to bind it."); + "绑定键位所需要按下的时间(单位:秒)"); break; case MENU_ENUM_LABEL_OVERLAY_SCALE: snprintf(s, len, - "Overlay scale."); + "图层放大比例。"); break; case MENU_ENUM_LABEL_AUDIO_OUTPUT_RATE: snprintf(s, len, - "音频输出采样率."); + "音频输出采样率。"); break; case MENU_ENUM_LABEL_VIDEO_SHARED_CONTEXT: snprintf(s, len, @@ -670,7 +657,7 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: snprintf(s, len, - "欢迎使用RetroArch\n" + "欢迎使用 RetroArch\n" "\n" "正在解压必要文件, 请稍等。\n" "这可能需要一点时间……\n" @@ -722,30 +709,28 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) "加载游戏内容 \n" "通过浏览来加载游戏内容。 \n" " \n" - "你需要同时提供一个“核心”和游戏内容文 \n" - "件才能启动并加载游戏内容。 \n" + "你需要同时提供一个「核心」和游戏内容 \n" + "文件才能启动并加载游戏内容。 \n" " \n" - "设置“文件浏览器目录”可以指定以哪个位 \n" - "置为文件浏览器的默认目录以方便加载。 \n" + "设置「文件浏览器文件夹」可以指定以哪个 \n" + "位置为文件浏览器的默认文件夹以方便加载。 \n" "若没有设置,默认以根目录为基准。 \n" " \n" "文件浏览器会以上次加载的核心所支持的 \n" - "扩展名进行过滤,并使用该核心来加载游 \n" - "戏内容。" + "扩展名进行过滤,并使用该核心来加载 \n" + "游戏内容。" ); break; case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: snprintf(s, len, - "从历史记录中加载内容. \n" + "从历史记录中加载游戏内容。 \n" " \n" - "As content is loaded, content and libretro \n" - "core combinations are saved to history. \n" + "每当你加载一个游戏时,它和所使用的核心 \n" + "将被保存到历史记录中。 \n" " \n" - "The history is saved to a file in the same \n" - "directory as the RetroArch config file. If \n" - "no config file was loaded in startup, history \n" - "will not be saved or loaded, and will not exist \n" - "in the main menu." + "历史记录文件和 RetroArch 设置文件在同一个 \n" + "文件夹中。如果 RetroArch 启动时没有找到 \n" + "历史记录文件,主菜单中将不会显示历史记录。" ); break; case MENU_ENUM_LABEL_VIDEO_DRIVER: @@ -851,7 +836,7 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET: snprintf(s, len, - "载入预设 Shader. \n" + "载入预设渲染器. \n" " \n" " Load a " #ifdef HAVE_CG @@ -869,7 +854,7 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) #endif "HLSL" #endif - " 预设目录. \n" + " 预设文件夹. \n" "The menu shader menu is updated accordingly. \n" " \n" "If the CGP uses scaling methods which are not \n" @@ -997,57 +982,56 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_LIBRETRO_LOG_LEVEL: snprintf(s, len, - "设置libretro核心的log等级 \n" + "设置Libretro核心的日志输出级别 \n" "(GET_LOG_INTERFACE). \n" - " \n" - " If a log level issued by a libretro \n" - " core is below libretro_log level, it \n" - " is ignored.\n" - " \n" - " DEBUG logs are always ignored unless \n" - " verbose mode is activated (--verbose).\n" - " \n" - " DEBUG = 0\n" - " INFO = 1\n" - " WARN = 2\n" - " ERROR = 3" + "\n" + "If a log level issued by a libretro \n" + "core is below libretro_log level, it \n" + "is ignored.\n" + "\n" + "DEBUG logs are always ignored unless \n" + "verbose mode is activated (--verbose).\n" + "\n" + "调试 = 0\n" + "提示 = 1\n" + "警告 = 2\n" + "错误 = 3" ); break; case MENU_ENUM_LABEL_STATE_SLOT_INCREASE: case MENU_ENUM_LABEL_STATE_SLOT_DECREASE: snprintf(s, len, - "即时存档栏位.\n" - " \n" - " With slot set to 0, save state name is *.state \n" - " (or whatever defined on commandline).\n" - "When slot is != 0, path will be (path)(d), \n" - "where (d) is slot number."); + "即时存档栏位\n" + "\n" + "当选择0号栏位时,即时存档将以*.state命名(或其他 \n" + "在命令行中定义的名称)。 \n" + "\n" + "当栏位不为0时,路径将会设为,其中 \n" + "是栏位的编号。"); break; case MENU_ENUM_LABEL_SHADER_APPLY_CHANGES: snprintf(s, len, - "应用Shader更改. \n" + "应用渲染器更改。 \n" " \n" - "After changing shader settings, use this to \n" - "apply changes. \n" + "当你修改渲染器设置后,执行此选项 \n" + "以应用更改。 \n" " \n" - "Changing shader settings is a somewhat \n" - "expensive operation so it has to be \n" - "done explicitly. \n" + "渲染器可能非常耗费资源, \n" + "因此必须单独进行设置。 \n" " \n" - "When you apply shaders, the menu shader \n" - "settings are saved to a temporary file (either \n" - "menu.cgp or menu.glslp) and loaded. The file \n" - "persists after RetroArch exits. The file is \n" - "saved to Shader Directory." + "应用渲染器更改后,渲染器设置将被 \n" + "保存到 Shader 文件夹下的文件中 \n" + "(扩展名为 .cgp 或 .glslp)。 \n" + "即使退出 RetroArch,该文件也会被保留。" ); break; case MENU_ENUM_LABEL_MENU_TOGGLE: snprintf(s, len, - "切换菜单."); + "切换菜单。"); break; case MENU_ENUM_LABEL_GRAB_MOUSE_TOGGLE: snprintf(s, len, - "切换鼠标抓取.\n" + "切换鼠标抓取。\n" " \n" "When mouse is grabbed, RetroArch hides the \n" "mouse, and keeps the mouse pointer inside \n" @@ -1056,10 +1040,9 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_DISK_NEXT: snprintf(s, len, - "Cycles through disk images. Use after \n" - "ejecting. \n" + "切换下一张光盘。弹出光盘后才能使用。 \n" " \n" - " Complete by toggling eject again."); + "再次切换光盘弹出状态完成换盘。"); break; case MENU_ENUM_LABEL_VIDEO_FILTER: #ifdef HAVE_FILTERS_BUILTIN @@ -1092,20 +1075,19 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) #endif #ifdef HAVE_RSOUND " \n" - "RSound wants an IP address to an RSound \n" - "server." + "RSound 需要 RSound 服务器的 IP 地址。 \n" #endif ); break; case MENU_ENUM_LABEL_DISK_EJECT_TOGGLE: snprintf(s, len, - "Toggles eject for disks.\n" + "切换光盘弹出状态。\n" " \n" - "Used for multiple-disk content."); + "用于多光盘游戏。"); break; case MENU_ENUM_LABEL_ENABLE_HOTKEY: snprintf(s, len, - "启用其他热键.\n" + "启用其他热键。\n" " \n" " If this hotkey is bound to either keyboard, \n" "joybutton or joyaxis, all other hotkeys will \n" @@ -1119,21 +1101,20 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_REWIND_ENABLE: snprintf(s, len, - "启用回溯倒带功能.\n" + "启用回溯倒带功能。\n" " \n" "这可能会严重影响性能, \n" - "所以缺省设置为关闭."); + "所以默认设置为关闭。"); break; case MENU_ENUM_LABEL_LIBRETRO_DIR_PATH: snprintf(s, len, - "核心目录. \n" + "核心文件夹。 \n" " \n" - "A directory for where to search for \n" - "libretro core implementations."); + "放置 Libretro 核心的文件夹。"); break; case MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO: snprintf(s, len, - "自动匹配刷新率.\n" + "自动匹配刷新率。\n" " \n" "The accurate refresh rate of our monitor (Hz).\n" "This is used to calculate audio input rate with \n" @@ -1162,34 +1143,27 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VIDEO_SCALE: snprintf(s, len, - "全屏分辨率.\n" + "全屏分辨率。\n" " \n" - "Resolution of 0 uses the \n" - "resolution of the environment.\n"); + "如果设置为 0,则使用设备默认分辨率。\n"); break; case MENU_ENUM_LABEL_FASTFORWARD_RATIO: snprintf(s, len, - "快进比率." + "快进速度。\n" " \n" - "The maximum rate at which content will\n" - "be run when using fast forward.\n" + "开启快进模式时的最大运行速度倍数。\n" " \n" - " (E.g. 5.0 for 60 fps content => 300 fps \n" - "cap).\n" + "例如 60fps 的游戏开启 5 倍速 就是 300 fps。\n" " \n" - "RetroArch will go to sleep to ensure that \n" - "the maximum rate will not be exceeded.\n" - "Do not rely on this cap to be perfectly \n" - "accurate."); + "RetroArch 会尽可能保证快进时不超过该速度,\n" + "但不会特别精确。"); break; case MENU_ENUM_LABEL_VIDEO_MONITOR_INDEX: snprintf(s, len, - "指定输出显示器.\n" + "指定输出显示器。\n" " \n" - "0 (default) means no particular monitor \n" - "is preferred, 1 and up (1 being first \n" - "monitor), suggests RetroArch to use that \n" - "particular monitor."); + "(默认 0)表示不指定显示器,\n" + "1 表示使用 1 号显示器,以此类推。"); break; case MENU_ENUM_LABEL_VIDEO_CROP_OVERSCAN: snprintf(s, len, @@ -1201,20 +1175,18 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER: snprintf(s, len, - "Only scales video in integer \n" - "steps.\n" - " \n" - "The base size depends on system-reported \n" - "geometry and aspect ratio.\n" - " \n" - "If Force Aspect is not set, X/Y will be \n" - "integer scaled independently."); + "只放大整数倍。\n" + "\n" + "基础分辨率与游戏、宽高比有关。\n" + "\n" + "如果「保持宽高比」选项未开启,\n" + "不保证宽高放大倍数相同。"); break; case MENU_ENUM_LABEL_AUDIO_VOLUME: snprintf(s, len, - "Audio volume, expressed in dB.\n" + "音量增益(分贝)。\n" " \n" - " 0 dB is normal volume. No gain will be applied.\n" + "0 表示正常音量。\n" "Gain can be controlled in runtime with Input\n" "Volume Up / Input Volume Down."); break; @@ -1258,11 +1230,11 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VOLUME_UP: snprintf(s, len, - "调高音量."); + "调高音量。"); break; case MENU_ENUM_LABEL_VOLUME_DOWN: snprintf(s, len, - "降低音量."); + "降低音量。"); break; case MENU_ENUM_LABEL_VIDEO_DISABLE_COMPOSITION: snprintf(s, len, @@ -1272,11 +1244,11 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) case MENU_ENUM_LABEL_PERFCNT_ENABLE: snprintf(s, len, "启用或关闭前端 \n" - "性能计数."); + "性能计数。"); break; case MENU_ENUM_LABEL_SYSTEM_DIRECTORY: snprintf(s, len, - "系统目录. \n" + "系统文件夹。 \n" " \n" "Sets the 'system' directory.\n" "Cores can query for this\n" @@ -1286,20 +1258,18 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) case MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE: case MENU_ENUM_LABEL_SAVESTATE_AUTO_LOAD: snprintf(s, len, - "Automatically saves a savestate at the \n" - "end of RetroArch's lifetime.\n" + "在 RetroArch 退出时 \n" + "自动保存即时存档。\n" " \n" - "RetroArch will automatically load any savestate\n" - "with this path on startup if 'Auto Load State\n" - "is enabled."); + "如果自动读档选项已打开,\n" + "每次运行游戏时还会读取该存档。"); break; case MENU_ENUM_LABEL_VIDEO_THREADED: snprintf(s, len, - "Use threaded video driver.\n" + "使用独立线程来处理视频。\n" " \n" - "Using this might improve performance at the \n" - "possible cost of latency and more video \n" - "stuttering."); + "虽然可能提升游戏速度,但也可能" + "增加延迟或导致图像卡顿。"); break; case MENU_ENUM_LABEL_VIDEO_VSYNC: snprintf(s, len, @@ -1307,24 +1277,19 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VIDEO_HARD_SYNC: snprintf(s, len, - "尝试硬件同步 \n" - "CPU和GPU.\n" + "尝试硬件同步CPU和GPU。\n" " \n" - "可以降低潜在的性能 \n" - "开销."); + "可以减少潜在的性能开销。"); break; case MENU_ENUM_LABEL_REWIND_GRANULARITY: snprintf(s, len, - "Rewind granularity.\n" + "每次回溯的帧数\n" " \n" - " When rewinding defined number of \n" - "frames, you can rewind several frames \n" - "at a time, increasing the rewinding \n" - "speed."); + "通过一次回溯多帧来提升回溯的速度。"); break; case MENU_ENUM_LABEL_SCREENSHOT: snprintf(s, len, - "Take screenshot."); + "截图。"); break; case MENU_ENUM_LABEL_VIDEO_FRAME_DELAY: snprintf(s, len, @@ -1350,16 +1315,13 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION: snprintf(s, len, - "Inserts a black frame inbetween \n" - "frames.\n" + "在每帧之间插入一帧黑屏。\n" " \n" - "Useful for 120 Hz monitors who want to \n" - "play 60 Hz material with eliminated \n" - "ghosting.\n" + "120 Hz 显示器开启此选项运行 \n" + "60 Hz 游戏可以避免重影。 \n" " \n" - "Video refresh rate should still be \n" - "configured as if it is a 60 Hz monitor \n" - "(divide refresh rate by 2)."); + "图像刷新率仍应按照 60 Hz 显示器 \n" + "来进行设置。(除以 2) \n"); break; case MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN: snprintf(s, len, @@ -1382,17 +1344,15 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_PAUSE_NONACTIVE: snprintf(s, len, - "Pause gameplay when window focus \n" - "is lost."); + "切换窗口时暂停游戏。"); break; case MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT: snprintf(s, len, - "Screenshots output of GPU shaded \n" - "material if available."); + "使用 GPU 输出来进行截图(如果可能的话)。"); break; case MENU_ENUM_LABEL_SCREENSHOT_DIRECTORY: snprintf(s, len, - "截图目录 \n" + "截图文件夹 \n" " \n" "用于保存截图的文件夹。" ); @@ -1406,53 +1366,49 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_SAVEFILE_DIRECTORY: snprintf(s, len, - "游戏存盘目录. \n" + "游戏存档文件夹。 \n" " \n" - "Save all save files (*.srm) to this \n" - "directory. This includes related files like \n" - ".bsv, .rt, .psrm, etc...\n" + "所有游戏存档都保存在此文件夹。 \n" + "常见的游戏存档格式有 \n" + ".srm, .bsv, .rt, .psrm 等\n" " \n" - "This will be overridden by explicit command line\n" - "options."); + "此选项可能被特定命令行选项覆盖。"); break; case MENU_ENUM_LABEL_SAVESTATE_DIRECTORY: snprintf(s, len, - "即时存档目录. \n" + "即时存档文件夹. \n" " \n" - "Save all save states (*.state) to this \n" - "directory.\n" + "所有即时存档 (.state 文件) 都 \n" + "保存在此文件夹。 \n" " \n" - "This will be overridden by explicit command line\n" - "options."); + "此选项可能被特定命令行选项覆盖。"); break; case MENU_ENUM_LABEL_ASSETS_DIRECTORY: snprintf(s, len, "Assets Directory. \n" " \n" - " This location is queried by default when \n" + "This location is queried by default when \n" "menu interfaces try to look for loadable \n" "assets, etc."); break; case MENU_ENUM_LABEL_DYNAMIC_WALLPAPERS_DIRECTORY: snprintf(s, len, - "动态壁纸目录 \n" + "动态壁纸文件夹 \n" " \n" "保存用于主界面的、依据游戏内容变化的动态壁纸。"); break; case MENU_ENUM_LABEL_SLOWMOTION_RATIO: snprintf(s, len, - "Slowmotion ratio." + "减速比例" " \n" - "When slowmotion, content will slow\n" - "down by factor."); + "减速游戏时,速度将被降低的倍数。"); break; case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: snprintf(s, len, - "Defines axis threshold.\n" + "摇杆灵敏度\n" " \n" - "How far an axis must be tilted to result\n" - "in a button press.\n" - " Possible values are [0.0, 1.0]."); + "必须把摇杆推到多大幅度才算按下按键。\n" + "数值范围为0.0至1.0。"); break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, @@ -1475,19 +1431,19 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) ); break; case MENU_ENUM_LABEL_INPUT_TOUCH_ENABLE: - snprintf(s, len, "Enable touch support."); + snprintf(s, len, "启用触摸屏支持。"); break; case MENU_ENUM_LABEL_INPUT_PREFER_FRONT_TOUCH: - snprintf(s, len, "Use front instead of back touch."); + snprintf(s, len, "使用前触摸屏,而非后触摸屏。"); break; case MENU_ENUM_LABEL_MOUSE_ENABLE: - snprintf(s, len, "Enable mouse input inside the menu."); + snprintf(s, len, "在菜单中,启用鼠标。"); break; case MENU_ENUM_LABEL_POINTER_ENABLE: - snprintf(s, len, "Enable touch input inside the menu."); + snprintf(s, len, "在菜单中,启用触摸屏。"); break; case MENU_ENUM_LABEL_MENU_WALLPAPER: - snprintf(s, len, "Path to an image to set as menu wallpaper."); + snprintf(s, len, "菜单壁纸图片的路径。"); break; case MENU_ENUM_LABEL_NAVIGATION_WRAPAROUND: snprintf(s, len, @@ -1497,9 +1453,8 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_PAUSE_LIBRETRO: snprintf(s, len, - "If disabled, the libretro core will keep \n" - "running in the background when we are in the \n" - "menu."); + "如果关闭此选项,打开菜单时 \n" + "游戏仍会后台运行。"); break; case MENU_ENUM_LABEL_SUSPEND_SCREENSAVER_ENABLE: snprintf(s, len, @@ -1509,15 +1464,15 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_NETPLAY_MODE: snprintf(s, len, - "Netplay client mode for the current user. \n" - "Will be 'Server' mode if disabled."); + "开启:联网时为客户端模式。\n" + "关闭:联网时为服务器模式。"); break; case MENU_ENUM_LABEL_NETPLAY_DELAY_FRAMES: snprintf(s, len, - "The amount of delay frames to use for netplay. \n" + "联网时延迟的帧数。 \n" " \n" - "Increasing this value will increase \n" - "performance, but introduce more latency."); + "提升数值将改善游戏表现, \n" + "但延迟也会增加。"); break; case MENU_ENUM_LABEL_NETPLAY_CHECK_FRAMES: snprintf(s, len, @@ -1550,41 +1505,40 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VIDEO_SMOOTH: snprintf(s, len, - "Smoothens picture with bilinear filtering. \n" - "Should be disabled if using shaders."); + "用双线性过滤使图像平滑。 \n" + "如果你使用了渲染器,请关闭它。"); break; case MENU_ENUM_LABEL_TIMEDATE_ENABLE: snprintf(s, len, - "Shows current date and/or time inside menu."); + "在菜单中显示当前日期和时间。"); break; case MENU_ENUM_LABEL_CORE_ENABLE: snprintf(s, len, - "Shows current core inside menu."); + "在菜单中显示当前运行的核心名称。"); break; case MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST: snprintf(s, len, - "Enables Netplay in host (server) mode."); + "启用联机游戏(服务器模式)。"); break; case MENU_ENUM_LABEL_NETPLAY_ENABLE_CLIENT: snprintf(s, len, - "Enables Netplay in client mode."); + "启用联机游戏(客户端模式)。"); break; case MENU_ENUM_LABEL_NETPLAY_DISCONNECT: snprintf(s, len, - "Disconnects an active Netplay connection."); + "断开当前网络连接。"); break; case MENU_ENUM_LABEL_NETPLAY_SETTINGS: snprintf(s, len, - "Setting related to Netplay."); + "联机游戏设置。"); break; case MENU_ENUM_LABEL_NETPLAY_LAN_SCAN_SETTINGS: snprintf(s, len, - "Search for and connect to netplay hosts on the local network."); + "在局域网中搜索并加入联机游戏服务器。"); break; case MENU_ENUM_LABEL_DYNAMIC_WALLPAPER: snprintf(s, len, - "Dynamically load a new wallpaper \n" - "depending on context."); + "在不同的环境下加载不同的壁纸。"); break; case MENU_ENUM_LABEL_CORE_UPDATER_BUILDBOT_URL: snprintf(s, len, @@ -1611,14 +1565,11 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_INPUT_MAX_USERS: snprintf(s, len, - "Maximum amount of users supported by \n" - "RetroArch."); + "RetroArch 支持的最大用户数量。"); break; case MENU_ENUM_LABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE: snprintf(s, len, - "After downloading, automatically extract \n" - "archives that the downloads are contained \n" - "inside."); + "下载后自动解压。"); break; case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE: snprintf(s, len, @@ -1627,26 +1578,24 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_NETPLAY_NICKNAME: snprintf(s, len, - "The username of the person running RetroArch. \n" - "This will be used for playing online games."); + "你的 RetroArch 用户名,用于联机游戏。"); break; case MENU_ENUM_LABEL_NETPLAY_TCP_UDP_PORT: snprintf(s, len, - "The port of the host IP address. \n" - "Can be either a TCP or UDP port."); + "服务器的端口。 \n" + "TCP 或 UDP 端口均可。"); break; case MENU_ENUM_LABEL_NETPLAY_SPECTATOR_MODE_ENABLE: snprintf(s, len, - "Enable or disable spectator mode for \n" - "the user during netplay."); + "启用或禁用网络对战的观战模式。"); break; case MENU_ENUM_LABEL_NETPLAY_IP_ADDRESS: snprintf(s, len, - "The address of the host to connect to."); + "服务器的地址。"); break; case MENU_ENUM_LABEL_STDIN_CMD_ENABLE: snprintf(s, len, - "Enable stdin command interface."); + "启用标准命令行输入。"); break; case MENU_ENUM_LABEL_UI_COMPANION_START_ON_BOOT: snprintf(s, len, @@ -1658,33 +1607,30 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO: snprintf(s, len, - "Gamepad button combination to toggle menu. \n" + "切换菜单的按键。 \n" " \n" - "0 - None \n" - "1 - Press L + R + Y + D-Pad Down \n" - "simultaneously. \n" - "2 - Press L3 + R3 simultaneously. \n" - "3 - Press Start + Select simultaneously."); + "0 - 无 \n" + "1 - 同时按下 L + R + Y + D-Pad \n" + "2 - 同时按下 L3 + R3 \n" + "3 - 同时按下 Start + Select "); break; case MENU_ENUM_LABEL_INPUT_ALL_USERS_CONTROL_MENU: - snprintf(s, len, "Allow any RetroPad to control the menu."); + snprintf(s, len, "允许任何玩家打开菜单。"); break; case MENU_ENUM_LABEL_INPUT_AUTODETECT_ENABLE: snprintf(s, len, - "Enable input auto-detection.\n" + "启用自动配置按键。\n" " \n" - "Will attempt to auto-configure \n" - "joypads, Plug-and-Play style."); + "RetroArch 将尝试自动配置手柄按键, \n" + "和即插即用模式。"); break; case MENU_ENUM_LABEL_CAMERA_ALLOW: snprintf(s, len, - "Allow or disallow camera access by \n" - "cores."); + "允许或禁止核心调用摄像头。"); break; case MENU_ENUM_LABEL_LOCATION_ALLOW: snprintf(s, len, - "Allow or disallow location services \n" - "access by cores."); + "允许或禁止核心调用定位系统(GPS)。"); break; case MENU_ENUM_LABEL_TURBO: snprintf(s, len, @@ -1700,21 +1646,21 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_OSK_ENABLE: snprintf(s, len, - "Enable/disable on-screen keyboard."); + "启用或禁用屏幕软键盘。"); break; case MENU_ENUM_LABEL_AUDIO_MUTE: snprintf(s, len, - "Mute/unmute audio."); + "静音或恢复声音。"); break; case MENU_ENUM_LABEL_REWIND: snprintf(s, len, - "Hold button down to rewind.\n" + "按住按钮来回溯 \n" " \n" - "Rewind must be enabled."); + "必须先启用回溯倒带功能。"); break; case MENU_ENUM_LABEL_EXIT_EMULATOR: snprintf(s, len, - "Key to exit RetroArch cleanly." + "正常退出 RetroArch。" #if !defined(RARCH_MOBILE) && !defined(RARCH_CONSOLE) "\nKilling it in any hard way (SIGKILL, \n" "etc) will terminate without saving\n" @@ -1726,56 +1672,55 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_LOAD_STATE: snprintf(s, len, - "Loads state."); + "读取即时存档。"); break; case MENU_ENUM_LABEL_SAVE_STATE: snprintf(s, len, - "Saves state."); + "保存即时存档。"); break; case MENU_ENUM_LABEL_CHEAT_INDEX_PLUS: snprintf(s, len, - "Increment cheat index.\n"); + "下一个金手指。"); break; case MENU_ENUM_LABEL_CHEAT_INDEX_MINUS: snprintf(s, len, - "Decrement cheat index.\n"); + "前一个金手指。"); break; case MENU_ENUM_LABEL_SHADER_PREV: snprintf(s, len, - "Applies previous shader in directory."); + "应用文件夹中的前一个渲染器特效。"); break; case MENU_ENUM_LABEL_SHADER_NEXT: snprintf(s, len, - "Applies next shader in directory."); + "应用文件夹中的后一个渲染器特效。"); break; case MENU_ENUM_LABEL_RESET: snprintf(s, len, - "Reset the content.\n"); + "重启游戏。"); break; case MENU_ENUM_LABEL_PAUSE_TOGGLE: snprintf(s, len, - "Toggle between paused and non-paused state."); + "在暂停和非暂停状态间切换。"); break; case MENU_ENUM_LABEL_CHEAT_TOGGLE: snprintf(s, len, - "打开金手指索引.\n"); + "切换金手指启用状态。"); break; case MENU_ENUM_LABEL_HOLD_FAST_FORWARD: snprintf(s, len, - "Hold for fast-forward. Releasing button \n" - "disables fast-forward."); + "按下按键快进,松开按键恢复正常。"); break; case MENU_ENUM_LABEL_SLOWMOTION_HOLD: snprintf(s, len, - "Hold for slowmotion."); + "按下按键减速,松开按键恢复正常。"); break; case MENU_ENUM_LABEL_FRAME_ADVANCE: snprintf(s, len, - "Frame advance when content is paused."); + "游戏暂停时,运行一帧。"); break; case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, - "Toggle between recording and not."); + "切换是否处于录像状态。"); break; case MENU_ENUM_LABEL_L_X_PLUS: case MENU_ENUM_LABEL_L_X_MINUS: @@ -1796,28 +1741,28 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VALUE_WHAT_IS_A_CORE_DESC: snprintf(s, len, - "RetroArch本身并不能做什么事情。 \n" + "RetroArch 本身并不能做什么事情。 \n" " \n" - "如果想在上面干点什么,你需要向它加载一个程 \n" - "序。 \n" - "\n" - "我们把这样的程序叫做“Libretro核心”,简单 \n" - "的称呼其为“核心”。 \n" + "如果想在上面干点什么,你需要向它加载 \n" + "一个程序。\n" " \n" - "你可以从“加载核心”菜单中选择一个核心。 \n" + "我们把这样的程序叫做「Libretro 核心」, \n" + "简称「核心」。 \n" + " \n" + "你可以从「加载核心」菜单中选择一个核心。 \n" " \n" #ifdef HAVE_NETWORKING "你可以通过以下几种方法来获取核心: \n" "一、通过访问菜单项「%s」 \n" " -> 「%s」来下载;\n" - "二、手动将其移入核心目录中,访问目录设置 \n" - "找到你的“%s”。", + "二、手动将其移入核心文件夹中,访问文件夹设置 \n" + "找到你的「%s」。", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH) #else - "你可以通过手动将核心移入目录中来添加他 \n" - "们,访问目录设置找到你的“%s”。", + "你可以通过手动将核心移入文件夹中来添加它们, \n" + "访问文件夹设置找到你的「%s」。", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH) #endif ); diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 3cb9488b9d..27e26619c4 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -1,3 +1,29 @@ +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_GPU_PROFILE, + "GPU 超频" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_GPU_PROFILE, + "对 Switch 的 GPU 超频或降频" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_BACKLIGHT_CONTROL, + "屏幕亮度" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_BACKLIGHT_CONTROL, + "调整 Switch 的屏幕亮度" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_CPU_PROFILE, + "CPU 超频" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_CPU_PROFILE, + "对 Switch 的 CPU 超频" + ) +#endif MSG_HASH( MSG_COMPILER, "编译器" @@ -23,11 +49,11 @@ MSG_HASH( ) MSG_HASH( MSG_GOT_CONNECTION_FROM, - "连接来自: \"%s\"" + "连接来自:「%s」" ) MSG_HASH( MSG_GOT_CONNECTION_FROM_NAME, - "连接来自: \"%s (%s)\"" + "连接来自:「%s (%s)」" ) MSG_HASH( MSG_PUBLIC_ADDRESS, @@ -87,7 +113,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_CANNOT_PLAY_NO_SLOTS, - "已无空闲插槽" /*FIXME:"There are no free player slots"*/ + "玩家数量已满" ) MSG_HASH( MSG_NETPLAY_CANNOT_PLAY, @@ -95,11 +121,11 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_PEER_PAUSED, - "联机游戏对方 \"%s\" 暂停" + "联机游戏对方「%s」暂停" ) MSG_HASH( MSG_NETPLAY_CHANGED_NICK, - "你的昵称已修改为 \"%s\"" + "你的昵称已修改为「%s」" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, @@ -159,7 +185,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_SETTINGS, - "Cheevos账户" /*FIXME:"Accounts Cheevos"*/ + "Cheevos 账户设置" /*FIXME:"Accounts Cheevos"*/ /*Should be fixed now, not sure though*/ ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_USERNAME, @@ -208,7 +234,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ASSETS_DIRECTORY, - "资源目录" + "资源文件夹" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_BLOCK_FRAMES, @@ -232,7 +258,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR, - "音频过滤器目录" + "音频过滤器文件夹" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_TURBO_DEADZONE_LIST, @@ -280,15 +306,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, - "自动加载覆写文件" + "自动加载独立配置文件" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, - "自动加载重映射文件" + "自动加载自定义键位文件" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, - "自动加载Shader预设" + "自动加载渲染器预设" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_BACK, @@ -360,7 +386,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE, - "加载保存状态时不覆盖SaveRAM" + "加载即时存档时不覆盖游戏自带存档" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BLUETOOTH_ENABLE, @@ -372,7 +398,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY, - "缓存目录" + "缓存文件夹" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CAMERA_ALLOW, @@ -392,7 +418,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH, - "金手指文件目录" + "金手指文件文件夹" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_FILE, @@ -408,7 +434,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_NUM_PASSES, - "金手指通过" /*FIXME: "Cheat Passes"*/ + "金手指列表" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_DESCRIPTION, @@ -416,7 +442,6 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE, -/* FIXME? Translate 'Hardcore Mode' */ "专家模式" ) MSG_HASH( @@ -433,8 +458,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, -/* FIXME? Translate 'Test Unofficial Achievements' */ - "非官方测试" + "非官方成就测试" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, @@ -474,11 +498,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, - "游戏内容数据库目录" + "游戏内容数据库文件夹" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DIR, - "游戏内容目录" + "游戏内容文件夹" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, @@ -488,9 +512,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE, MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS, "快捷菜单") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIR, - "下载目录") + "下载文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIRECTORY, - "下载目录") + "下载文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS, "金手指") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_COUNTERS, @@ -520,11 +544,11 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_MANUFACTURER, MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_NAME, "系统名称") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS, - "控制") + "键位设置") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_LIST, "加载核心") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS, - "选项") + "核心选项") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SETTINGS, "核心") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE, @@ -542,7 +566,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_CPU_ARCHITECTURE, MSG_HASH(MENU_ENUM_LABEL_VALUE_CPU_CORES, "CPU核心:") MSG_HASH(MENU_ENUM_LABEL_VALUE_CURSOR_DIRECTORY, - "指针目录") + "指针文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_CURSOR_MANAGER, "光标管理器") MSG_HASH(MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, @@ -556,7 +580,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DELETE_ENTRY, MSG_HASH(MENU_ENUM_LABEL_VALUE_FAVORITES, "选择文件并探测核心") /* TODO/FIXME - update */ MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT, - "<游戏内容目录>") + "<游戏内容文件夹>") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT, "<默认>") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE, @@ -564,7 +588,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE, MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND, "没有找到文件夹。") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, - "目录") + "文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS, "Disk Cycle Tray Status") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND, @@ -576,7 +600,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS, MSG_HASH(MENU_ENUM_LABEL_VALUE_DONT_CARE, "不关心") MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOADED_FILE_DETECT_CORE_LIST, - "下载目录") + "下载文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE, "下载核心……") MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT, @@ -588,17 +612,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_VALUE, MSG_HASH(MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS, "驱动") MSG_HASH(MENU_ENUM_LABEL_VALUE_DUMMY_ON_CORE_SHUTDOWN, -/* FIXME? Translate 'Load Dummy on Core Shutdown' */ - "核心关闭时加载虚拟程序") + "核心关闭时不彻底关机") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHECK_FOR_MISSING_FIRMWARE, - "加载前检查丢失的固件") /*FIXME: "Check for Missing Firmware Before Loading"*/ + "加载前检查固件完整性") MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, "动态壁纸") MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY, - "动态壁纸目录") + "动态壁纸文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_ENABLE, -/* FIXME? Translate 'Enable Achievements' */ - "启用") + "启用成就系统") MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_HOVER_COLOR, "菜单项悬停颜色") MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_NORMAL_COLOR, @@ -626,7 +648,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP, MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING, "音频/视频故障排除") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD, - "变更虚拟游戏控制器覆层") + "变更虚拟游戏控制器图层") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CONTROLS, "基本菜单控制") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_LIST, @@ -702,9 +724,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "启用自动配置") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "输入轴阈值") + "摇杆灵敏度") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, - "菜单切换 确定/取消 按钮") /*FIXME:"Menu Swap OK & Cancel Buttons"*/ + "互换确定键和取消键") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, "绑定全部") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, @@ -760,7 +782,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y键(左侧)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, - "(键: %s)") /*FIXME:"(Key: %s)"*/ + "(%s 键)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, @@ -812,7 +834,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, "Game focus toggle") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, - "加载状态") + "即时读档") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "切换菜单") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, @@ -824,7 +846,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, "切换屏幕键盘") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, - "下一个覆层") + "下一个图层") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, "切换暂停") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, @@ -834,13 +856,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, "回溯") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, - "保存状态") + "即时存档") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, "屏幕截图") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, - "下一个Shader") + "下一个渲染器") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, - "上一个Shader") + "上一个渲染器") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_HOLD_KEY, "慢动作") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, @@ -852,11 +874,11 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, "音量 +") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OSK_OVERLAY_ENABLE, - "显示键盘覆层") + "显示键盘图层") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ENABLE, - "显示覆层") + "显示图层") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU, - "在菜单中隐藏覆层") + "在菜单中隐藏图层") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR, "轮询类型行为") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_EARLY, @@ -868,9 +890,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_NORMAL, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_PREFER_FRONT_TOUCH, "优先前置触摸") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY, - "输入重映射目录") + "自定义键位文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, - "启用绑定重映射") + "启用绑定自定义键位") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, "保存自动设置") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS, @@ -885,10 +907,12 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, "Turbo区间") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, "输入用户 %u 的绑定") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LATENCY_SETTINGS, + "延迟") MSG_HASH(MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS, "内部存储状态") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR, - "输入设备自动配置目录") + "输入设备自动配置文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER, "手柄驱动") MSG_HASH(MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES, @@ -930,9 +954,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ARABIC, MSG_HASH(MENU_ENUM_LABEL_VALUE_LEFT_ANALOG, "左侧摇杆") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH, - "核心目录") + "核心文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_INFO_PATH, - "核心信息目录") + "核心信息文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_LOG_LEVEL, "核心日志级别") MSG_HASH(MENU_ENUM_LABEL_VALUE_LINEAR, @@ -944,7 +968,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY, MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST, "载入游戏内容") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_STATE, - "加载状态") + "即时读档") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW, "允许使用位置") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER, @@ -1094,43 +1118,49 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND, "没有找到设置。") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS, - "没有Shader参数.") + "没有渲染器参数.") MSG_HASH(MENU_ENUM_LABEL_VALUE_OFF, "关") MSG_HASH(MENU_ENUM_LABEL_VALUE_ON, "开") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ONLINE, + "在线") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER, "在线更新器") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_DISPLAY_SETTINGS, "屏幕显示") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_OVERLAY_SETTINGS, - "屏幕覆层") + "屏幕图层") +MSG_HASH(MENU_ENUM_SUBLABEL_ONSCREEN_OVERLAY_SETTINGS, + "Adjust Bezels and Onscreen controls") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_SETTINGS, + "屏幕提示") +MSG_HASH(MENU_ENUM_SUBLABEL_ONSCREEN_NOTIFICATIONS_SETTINGS, + "调整屏幕提示") MSG_HASH(MENU_ENUM_LABEL_VALUE_OPEN_ARCHIVE, "以文件夹形式打开压缩包") -MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_SETTINGS, - "屏幕通知") MSG_HASH(MENU_ENUM_LABEL_VALUE_OPTIONAL, "任意") MSG_HASH(MENU_ENUM_LABEL_VALUE_OSK_OVERLAY_DIRECTORY, - "OSK覆层目录") + "OSK图层文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY, - "覆层") + "图层") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_AUTOLOAD_PREFERRED, - "自动加载最佳的覆层") + "自动加载最佳的图层") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_DIRECTORY, - "覆层目录") + "图层文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_OPACITY, - "覆层不透明度") + "图层不透明度") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_PRESET, - "覆层预设") + "图层预设") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE, - "覆层缩放比例") + "图层缩放比例") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_SETTINGS, - "屏幕覆层") + "屏幕图层") MSG_HASH(MENU_ENUM_LABEL_VALUE_PAL60_ENABLE, "使用PAL60模式") MSG_HASH(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY, - "上一级目录") + "上一级文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO, "当菜单激活时暂停") MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_NONACTIVE, @@ -1140,7 +1170,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, "游戏列表") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "游戏列表目录") + "游戏列表文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, "游戏列表") MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, @@ -1209,32 +1239,41 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "启动游戏内容") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "TGDB 评分") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "重启 (RCM)") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "重启") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, - "录像配置目录") + "录像配置文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, - "录像输出目录") + "录像输出文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_SETTINGS, "录像") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_CONFIG, "录像配置") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_DRIVER, "录像驱动") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MIDI_DRIVER, + "MIDI 驱动") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "启用录像") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_PATH, "输出文件") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, - "使用输出目录") + "使用输出文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE, - "重映射文件") + "自定义键位文件") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD, - "加载重映射文件") + "加载自定义键位文件") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, - "保存核心重映射文件") + "保存核心自定义键位文件") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CONTENT_DIR, + "保存游戏文件夹自定义键位文件") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, - "保存游戏重映射文件") + "保存游戏自定义键位文件") MSG_HASH(MENU_ENUM_LABEL_VALUE_REQUIRED, "必须") MSG_HASH(MENU_ENUM_LABEL_VALUE_RESTART_CONTENT, @@ -1246,9 +1285,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RESUME, MSG_HASH(MENU_ENUM_LABEL_VALUE_RESUME_CONTENT, "继续") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROKEYBOARD, - "Retro键盘") + "Retro 键盘") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROPAD, - "Retro触摸板") + "Retro 触摸板") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROPAD_WITH_ANALOG, "RetroPad w/ Analog") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS, @@ -1260,39 +1299,49 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY, MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS, "回溯") MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY, - "文件浏览器目录") + "文件浏览器文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_CONFIG_DIRECTORY, - "配置目录") + "配置文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_SHOW_START_SCREEN, "显示开始屏幕") MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, "右侧摇杆") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, + "添加到收藏") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "添加到收藏") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RESET_CORE_ASSOCIATION, + "重置核心关联") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "运行") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_MUSIC, + "运行") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAMBA_ENABLE, "启用SAMBA文件共享服务") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY, - "存档文件目录") + "存档文件文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX, - "自动索引保存状态") + "自动索引即时存档") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_LOAD, - "自动加载状态") + "自动加载即时存档") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE, - "自动保存状态") + "自动保存即时存档") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY, - "状态存储目录") + "即时存档文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_THUMBNAIL_ENABLE, "Savestate Thumbnails") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG, "保存当前配置") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, - "保存核心覆写") + "保存核心独立配置") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + "保存游戏文件夹独立配置") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, - "保存游戏覆写") + "保存游戏独立配置") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG, "保存新配置") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_STATE, - "保存状态") + "即时存档") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS, "存档") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY, @@ -1300,9 +1349,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY, MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_FILE, "扫描文件") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_THIS_DIRECTORY, - "<扫描当前目录>") + "<扫描当前文件夹>") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREENSHOT_DIRECTORY, - "屏幕截图目录") + "屏幕截图文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREEN_RESOLUTION, "屏幕分辨率") MSG_HASH(MENU_ENUM_LABEL_VALUE_SEARCH, @@ -1314,11 +1363,11 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SETTINGS, MSG_HASH(MENU_ENUM_LABEL_VALUE_SETTINGS_TAB, "设置") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER, - "Shader") + "渲染器") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_APPLY_CHANGES, - "应用Shader修改") + "应用渲染器修改") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS, - "Shader效果") + "渲染器效果") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, "Ribbon") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, @@ -1336,9 +1385,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SHUTDOWN, MSG_HASH(MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, "慢动作倍率") MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, - "排序文件夹中的存档") + "排序文件夹中的游戏存档") MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, - "排序文件夹中的状态存储") + "排序文件夹中的即时存档") MSG_HASH(MENU_ENUM_LABEL_VALUE_SSH_ENABLE, "启用SSH远程终端服务") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_CORE, @@ -1348,7 +1397,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD, MSG_HASH(MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR, "启动视频处理") MSG_HASH(MENU_ENUM_LABEL_VALUE_STATE_SLOT, - "状态存储槽") + "即时存档栏位") MSG_HASH(MENU_ENUM_LABEL_VALUE_STATUS, "状态") MSG_HASH(MENU_ENUM_LABEL_VALUE_STDIN_CMD_ENABLE, @@ -1360,7 +1409,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "启用系统背景音乐") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_DIRECTORY, - "系统/BIOS目录") + "系统/BIOS文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFORMATION, "系统信息") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_7ZIP_SUPPORT, @@ -1396,7 +1445,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYNAMIC_SUPPORT, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_EGL_SUPPORT, "EGL 支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FBO_SUPPORT, - "OpenGL/Direct3D 渲染至纹理 (多渲染批次Shader) 支持") + "OpenGL/Direct3D 渲染至纹理 (多渲染批次渲染器) 支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FFMPEG_SUPPORT, "FFmpeg 支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FREETYPE_SUPPORT, @@ -1444,7 +1493,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENVG_SUPPORT, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OSS_SUPPORT, "OSS 支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OVERLAY_SUPPORT, - "覆层支持") + "图层支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE, "电源") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED, @@ -1458,7 +1507,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_NO_SOURCE, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PULSEAUDIO_SUPPORT, "PulseAudio 支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PYTHON_SUPPORT, - "Python (Shader中脚本支持) 支持") + "Python (渲染器中脚本支持) 支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RBMP_SUPPORT, "BMP 支持 (RBMP)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RETRORATING_LEVEL, @@ -1502,13 +1551,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XVIDEO_SUPPORT, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ZLIB_SUPPORT, "Zlib 支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT, - "截取屏幕") + "截图") MSG_HASH(MENU_ENUM_LABEL_VALUE_THREADED_DATA_RUNLOOP_ENABLE, /* TODO/FIXME - update */ "启用多线程数据执行循环") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS, "缩略图") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY, - "缩略图目录") + "缩略图文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST, "缩略图更新程序") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS, @@ -1532,9 +1581,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_MENUBAR_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE, "无法读取压缩的文件。") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, - "撤销加载状态") + "撤销即时读档") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE, - "撤销保存状态") + "撤销即时存档") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNKNOWN, "未知") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS, @@ -1544,7 +1593,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS, MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES, "更新自动配置档案") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS, - "更新CG Shader效果文件") + "更新CG 渲染器效果文件") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS, "更新金手指") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CORE_INFO_FILES, @@ -1552,13 +1601,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CORE_INFO_FILES, MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_DATABASES, "更新数据库") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_GLSL_SHADERS, - "更新GLSL Shader效果文件") + "更新GLSL 渲染器效果文件") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_LAKKA, "更新 Lakka") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_OVERLAYS, - "更新覆层") + "更新图层") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_SLANG_SHADERS, - "更新Slang Shader效果文件") + "更新Slang 渲染器效果文件") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER, "用户") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS, @@ -1572,17 +1621,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_IMAGE_VIEWER, MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "使用内建媒体播放器") MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY, - "<使用当前目录>") + "<使用当前文件夹>") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, "允许旋转") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "自动选择视口比例") + "自动选择视窗比例") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX, - "视口比例选项") + "视窗比例选项") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, "黑色帧补间") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, - "Crop Overscan (Reload)") + "裁剪过扫描部分(需重启)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "禁用桌面元素") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, @@ -1590,7 +1639,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, "视频滤镜") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR, - "视频滤镜目录") + "视频滤镜文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, "闪烁过滤器") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE, @@ -1600,7 +1649,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_PATH, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE, "屏显消息(OSD)大小") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "强制视口比例") + "强制视窗比例") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE, "强制禁止sRGB帧缓冲") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY, @@ -1630,7 +1679,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE, "刷新率") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO, - "估算的显示器帧率") + "预估刷新率") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_POLLED, "Set Display-Reported Refresh Rate") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION, @@ -1638,21 +1687,21 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE, "窗口缩放量") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER, - "整数化缩放量") + "放大整数倍") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS, "视频") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR, - "视频Shader目录") + "视频渲染器文件夹") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES, - "Shader渲染遍数") + "渲染器渲染次数") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, - "预览Shader参数") + "预览渲染器参数") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, - "加载Shader预设") + "加载渲染器预设") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "菜单Shader参数") + "菜单渲染器参数") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, - "保存Shader预设为") + "保存渲染器预设为") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, "保存核心预设") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME, @@ -1672,13 +1721,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_THREADED, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VFILTER, "降低闪烁") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_HEIGHT, - "自定义视口高度") + "自定义视窗高度") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, - "自定义视口宽度") + "自定义视窗宽度") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, - "自定义视口X") + "自定义视窗X") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, - "自定义视口Y") + "自定义视窗Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VI_WIDTH, "设置 VI 屏幕宽度") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC, @@ -1746,7 +1795,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_UNDERSEA, MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_VOLCANIC_RED, "火山红") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE, - "菜单Shader管线") + "菜单渲染器管线") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SCALE_FACTOR, "菜单缩放因子") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE, @@ -1770,7 +1819,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_THEME, MSG_HASH(MENU_ENUM_LABEL_VALUE_YES, "是") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO, - "Shader预设") + "渲染器预设") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE, "打开或关闭成就。更多内容请访问 http://retroachievements.org") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, @@ -1800,7 +1849,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_USER_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_PRIVACY_SETTINGS, "修改你的隐私设置。") MSG_HASH(MENU_ENUM_SUBLABEL_DIRECTORY_SETTINGS, - "修改此系统的默认目录。") + "修改此系统的默认文件夹。") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_SETTINGS, "修改游戏列表设置。") MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_SETTINGS, @@ -1829,6 +1878,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_SETTINGS, "调整游戏控制器、键盘和鼠标的设置。") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_USER_BINDS, "配置该用户的控制选项。") +MSG_HASH(MENU_ENUM_SUBLABEL_LATENCY_SETTINGS, + "更改关于视频、音频和输入延迟的设置。") MSG_HASH(MENU_ENUM_SUBLABEL_LOG_VERBOSITY, "启用或禁止向控制台打印日志。") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY, @@ -1854,7 +1905,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_USER_LANGUAGE, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION, "在帧与帧之间插入黑色的中间帧,通常用于消除在\n" "120Hz刷新率的显示器上运行60Hz的游戏内容带来\n" - "的鬼影。") + "的重影。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, "以增加画面卡顿的风险换取低延时,在垂直同步后增加\n" "时延(毫秒)。") @@ -1877,7 +1928,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_HELP_LIST, MSG_HASH(MSG_APPENDED_DISK, "Appended disk") MSG_HASH(MSG_APPLICATION_DIR, - "应用程序目录") + "应用程序文件夹") MSG_HASH(MSG_APPLYING_SHADER, "Applying shader") MSG_HASH(MSG_AUDIO_MUTED, @@ -1891,7 +1942,7 @@ MSG_HASH(MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, MSG_HASH(MSG_AUTOSAVE_FAILED, "无法初始化自动保存。") MSG_HASH(MSG_AUTO_SAVE_STATE_TO, - "自动保存状态至") + "自动保存即时存档至") MSG_HASH(MSG_BLOCKING_SRAM_OVERWRITE, "阻止 SRAM 覆盖") MSG_HASH(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT, @@ -1907,7 +1958,7 @@ MSG_HASH(MSG_COMPARING_WITH_KNOWN_MAGIC_NUMBERS, MSG_HASH(MSG_COMPILED_AGAINST_API, "Compiled against API") MSG_HASH(MSG_CONFIG_DIRECTORY_NOT_SET, - "未设置配置目录,无法保存新的配置。") + "未设置配置文件夹,无法保存新的配置。") MSG_HASH(MSG_CONNECTED_TO, "连接至") MSG_HASH(MSG_CONTENT_CRC32S_DIFFER, @@ -1915,9 +1966,9 @@ MSG_HASH(MSG_CONTENT_CRC32S_DIFFER, MSG_HASH(MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT, "跳过内容加载。实现将自行加载。") MSG_HASH(MSG_CORE_DOES_NOT_SUPPORT_SAVESTATES, - "核心不支持保存状态。") + "核心不支持即时存档。") MSG_HASH(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, - "Core options file created successfully.") + "已创建核心选项文件。") MSG_HASH(MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, "Could not find any next driver") MSG_HASH(MSG_COULD_NOT_FIND_COMPATIBLE_SYSTEM, @@ -1957,19 +2008,19 @@ MSG_HASH(MSG_DOWNLOAD_FAILED, MSG_HASH(MSG_ERROR, "错误") MSG_HASH(MSG_ERROR_LIBRETRO_CORE_REQUIRES_CONTENT, - "Libretro core requires content, but nothing was provided.") + "Libretro 核心需要加载游戏才能运行。") MSG_HASH(MSG_ERROR_LIBRETRO_CORE_REQUIRES_SPECIAL_CONTENT, - "Libretro core requires special content, but none were provided.") + "Libretro 核心需要加载特定游戏内容才能运行。") MSG_HASH(MSG_ERROR_PARSING_ARGUMENTS, - "Error parsing arguments.") + "解析命令行时出现错误。") MSG_HASH(MSG_ERROR_SAVING_CORE_OPTIONS_FILE, - "Error saving core options file.") + "保存核心选项文件时出现错误。") MSG_HASH(MSG_ERROR_SAVING_REMAP_FILE, - "Error saving remap file.") + "保存自定义键位文件时出现错误。") MSG_HASH(MSG_ERROR_SAVING_SHADER_PRESET, - "Error saving shader preset.") + "保存预设渲染器文件时出现错误。") MSG_HASH(MSG_EXTERNAL_APPLICATION_DIR, - "外部应用程序目录") + "外部应用程序文件夹") MSG_HASH(MSG_EXTRACTING, "正在解压") MSG_HASH(MSG_EXTRACTING_FILE, @@ -1987,7 +2038,7 @@ MSG_HASH(MSG_FAILED_TO_APPLY_SHADER, MSG_HASH(MSG_FAILED_TO_BIND_SOCKET, "Failed to bind socket.") MSG_HASH(MSG_FAILED_TO_CREATE_THE_DIRECTORY, - "创建目录失败。") + "创建文件夹失败。") MSG_HASH(MSG_FAILED_TO_EXTRACT_CONTENT_FROM_COMPRESSED_FILE, "从压缩文件中提取内容失败") MSG_HASH(MSG_FAILED_TO_GET_NICKNAME_FROM_CLIENT, @@ -2105,9 +2156,9 @@ MSG_HASH(MSG_LIBRETRO_ABI_BREAK, MSG_HASH(MSG_LIBRETRO_FRONTEND, "为libretro而设计的前端") MSG_HASH(MSG_LOADED_STATE_FROM_SLOT, - "加载状态从槽 #%d.") + "读取 #%d 号即时存档。") MSG_HASH(MSG_LOADED_STATE_FROM_SLOT_AUTO, - "加载状态从槽 #-1 (auto).") + "读取 #-1 号即时存档(自动)。") MSG_HASH(MSG_LOADING, "正在加载") MSG_HASH(MSG_FIRMWARE, @@ -2137,9 +2188,9 @@ MSG_HASH(MSG_NO_SAVE_STATE_HAS_BEEN_OVERWRITTEN_YET, MSG_HASH(MSG_NO_STATE_HAS_BEEN_LOADED_YET, "没有加载任何存档。") MSG_HASH(MSG_OVERRIDES_ERROR_SAVING, - "保存覆盖错误。") + "保存独立配置时出现错误。") MSG_HASH(MSG_OVERRIDES_SAVED_SUCCESSFULLY, - "覆盖保存成功。") + "独立配置保存成功。") MSG_HASH(MSG_PAUSED, "暂停。") MSG_HASH(MSG_PROGRAM, @@ -2155,11 +2206,11 @@ MSG_HASH(MSG_RECORDING_TO, MSG_HASH(MSG_REDIRECTING_CHEATFILE_TO, "重定向金手指文件至") MSG_HASH(MSG_REDIRECTING_SAVEFILE_TO, - "Redirecting save file to") + "重定向游戏存档文件至") MSG_HASH(MSG_REDIRECTING_SAVESTATE_TO, - "Redirecting savestate to") + "重定向即时存档文件至") MSG_HASH(MSG_REMAP_FILE_SAVED_SUCCESSFULLY, - "Remap file saved successfully.") + "自定义键位文件已保存。") MSG_HASH(MSG_REMOVED_DISK_FROM_TRAY, "Removed disk from tray.") MSG_HASH(MSG_REMOVING_TEMPORARY_CONTENT_FILE, @@ -2171,7 +2222,7 @@ MSG_HASH(MSG_RESTARTING_RECORDING_DUE_TO_DRIVER_REINIT, MSG_HASH(MSG_RESTORED_OLD_SAVE_STATE, "重载旧的存档。") MSG_HASH(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO, - "Shaders: restoring default shader preset to") + "重置渲染器预设到") MSG_HASH(MSG_REVERTING_SAVEFILE_DIRECTORY_TO, "Reverting savefile directory to") MSG_HASH(MSG_REVERTING_SAVESTATE_DIRECTORY_TO, @@ -2189,9 +2240,9 @@ MSG_HASH(MSG_REWIND_REACHED_END, MSG_HASH(MSG_SAVED_NEW_CONFIG_TO, "已保存新配置到") MSG_HASH(MSG_SAVED_STATE_TO_SLOT, - "保存状态至槽 #%d.") + "保存 #%d 号即时存档。") MSG_HASH(MSG_SAVED_STATE_TO_SLOT_AUTO, - "保存状态至槽 #-1 (auto).") + "保存 #-1 号即时存档(自动)。") MSG_HASH(MSG_SAVED_SUCCESSFULLY_TO, "成功保存至") MSG_HASH(MSG_SAVING_RAM_TYPE, @@ -2207,9 +2258,9 @@ MSG_HASH(MSG_SENDING_COMMAND, MSG_HASH(MSG_SEVERAL_PATCHES_ARE_EXPLICITLY_DEFINED, "Several patches are explicitly defined, ignoring all...") MSG_HASH(MSG_SHADER, - "Shader") + "渲染器") MSG_HASH(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY, - "Shader preset saved successfully.") + "预设渲染器已加载。") MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳过 SRAM 加载。") MSG_HASH(MSG_SLOW_MOTION, @@ -2227,13 +2278,13 @@ MSG_HASH(MSG_STARTING_MOVIE_RECORD_TO, MSG_HASH(MSG_STATE_SIZE, "State size") MSG_HASH(MSG_STATE_SLOT, - "状态存档槽") + "即时存档栏位") MSG_HASH(MSG_TAKING_SCREENSHOT, "截屏。") MSG_HASH(MSG_TO, "到") MSG_HASH(MSG_UNDID_LOAD_STATE, - "已撤销加载状态。") + "已撤销即时读档。") MSG_HASH(MSG_UNDOING_SAVE_STATE, "撤销即时存档") MSG_HASH(MSG_UNKNOWN, @@ -2286,11 +2337,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_ALL_USERS_CONTROL_MENU, - "Allows any user to control the menu. If disabled, only User 1 can control the menu." + "允许任何用户打开菜单。如果禁用,则只有用户1能打开菜单。" ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_VOLUME, - "Audio volume (in dB). 0 dB is normal volume, no gain applied." + "音量增益(单位:分贝)。0 为正常音量。" ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, @@ -2298,7 +2349,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "How far an axis must be tilted to result in a button press." + "必须把摇杆推到多大幅度才算按下按键。" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, @@ -2322,19 +2373,19 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ALLOW_ROTATE, - "Allow cores to set rotation. When disabled, rotation requests are ignored. Useful for setups where one manually rotates the screen." + "允许核心自行设置屏幕旋转角度,若关闭,旋转请求将被忽略。需要旋转显示器的用户请设置此选项。" ) MSG_HASH( MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, - "Some cores might have a shutdown feature. If enabled, it will prevent the core from shutting RetroArch down. Instead, it loads a dummy core." + "某些核心关闭时可能会直接关闭 RetroArch。启用此选项可以避免这种情况发生。" ) MSG_HASH( MENU_ENUM_SUBLABEL_CHECK_FOR_MISSING_FIRMWARE, - "Check if all the required firmware is present before attempting to load content." + "在加载游戏之前,先检查固件或 BIOS 的完整性。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE, - "Vertical refresh rate of your screen. Used to calculate a suitable audio input rate. NOTE: This will be ignored if 'Threaded Video' is enabled." + "屏幕的刷新率。注意:如果视频独立线程已启用,此选项将被忽略。" ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_ENABLE, @@ -2358,7 +2409,7 @@ MSG_HASH( ) MSG_HASH( MSG_DEVICE_NOT_CONFIGURED_FALLBACK, - "not configured, using fallback" + "用户未设置,使用备用设置。" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST, @@ -2390,15 +2441,15 @@ MSG_HASH( MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_FRANCHISE, "数据库 - 过滤器 : Franchise") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ESRB_RATING, - "数据库 - 过滤器 : ESRB Rating") + "数据库 - 过滤器 : ESRB 分级") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ELSPA_RATING, - "数据库 - 过滤器 : ELSPA Rating") + "数据库 - 过滤器 : ELSPA 分级") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PEGI_RATING, - "数据库 - 过滤器 : PEGI Rating") + "数据库 - 过滤器 : PEGI 分级") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_CERO_RATING, - "数据库 - 过滤器 : CERO Rating") + "数据库 - 过滤器 : CERO 分级") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_BBFC_RATING, - "数据库 - 过滤器 : BBFC Rating") + "数据库 - 过滤器 : BBFC 分级") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_MAX_USERS, "数据库 - 过滤器 : 最大用户数") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_MONTH, @@ -2464,64 +2515,64 @@ MSG_HASH( MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, "Bokeh") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS, - "Refresh Room List") + "刷新房间列表") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, - "Nickname: %s") + "昵称:%s") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, - "Nickname (lan): %s") + "昵称(局域网):%s") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_FOUND, "Compatible content found") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_CROP_OVERSCAN, - "Cuts off a few pixels around the edges of the image customarily left blank by developers which sometimes also contain garbage pixels.") + "不显示图像周围可能存在的黑边。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SMOOTH, - "Adds a slight blur to the image to take the edge off of the hard pixel edges. This option has very little impact on performance.") + "轻微模糊像素点边缘以减少像素颗粒感。对运行速度影响很小。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FILTER, - "Apply a CPU-powered video filter. NOTE: Might come at a high performance cost. Some video filters might only work for cores that use 32bit or 16bit color.") + "加载一个由 CPU 控制的视频过滤器。注意:这可能显著降低游戏运行速度。某些视频过滤器仅对32位色(或16位色)核心生效。") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_USERNAME, - "Input the username of your Retro Achievements account.") + "输入您的 Retro 成就账号的用户名。") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD, - "Input the password of your Retro Achievements account.") + "输入您的 Retro 成就账号的密码。") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, - "Input your user name here. This will be used for netplay sessions, among other things.") + "在这里输入您的昵称,用于联网和一些其他服务。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, "Capture the image after filters (but not shaders) are applied. Your video will look as fancy as what you see on your screen.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_LIST, - "Select which core to use.") + "选择使用的模拟器核心。") MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_CONTENT_LIST, - "Select which content to start.") + "选择需要加载的游戏。") MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_INFORMATION, "Show network interface(s) and associated IP addresses.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, - "Show information specific to the device.") + "显示此设备的信息。") MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, - "Quit the program.") + "退出程序。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, - "Set the custom width size for the display window. Leaving it at 0 will attempt to scale the window as large as possible.") + "设置视窗的宽度,0 表示尽可能地放大。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, - "Set the custom height size for the display window. Leaving it at 0 will attempt to scale the window as large as possible.") + "设置视窗的高度,0 表示尽可能地放大。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_X, - "Set the custom width size for the non-windowed fullscreen mode. Leaving it at 0 will use the desktop resolution.") + "设置全屏模式的分辨率宽度,0 表示使用桌面分辨率。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_Y, - "Set the custom height size for the non-windowed fullscreen mode. Leaving it at 0 will use the desktop resolution") + "设置全屏模式的分辨率高度,0 表示使用桌面分辨率。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_X, - "Specify custom X axis position for onscreen text.") + "设置屏显文字的 X 坐标。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, - "Specify custom Y axis position for onscreen text.") + "设置屏显文字的 Y 坐标。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, - "Specify the font size in points.") + "设置字体大小(单位:像素)。") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, - "Hide the overlay while inside the menu, and show it again when exiting the menu.") + "在菜单中隐藏图层,退出菜单后重新显示。") MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, - "Scanned content will appear here." + "扫描到的游戏内容将在此处显示。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, - "Only scales video in integer steps. The base size depends on system-reported geometry and aspect ratio. If 'Force Aspect' is not set, X/Y will be integer scaled independently." + "只放大整数倍显示。基础分辨率与游戏、宽高比有关。如果「保持宽高比」选项未开启,不保证宽高放大倍数相同。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT, - "Screenshots output of GPU shaded material if available." + "使用 GPU 输出来进行截图(如果可能的话)。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ROTATION, @@ -2533,39 +2584,38 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN, - "Start in fullscreen. Can be changed at runtime." + "以全屏模式开始。运行时可以切换到窗口模式。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_WINDOWED_FULLSCREEN, - "If fullscreen, prefer using a windowed fullscreen mode." + "使用无边框全屏模式来替代普通的全屏模式。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_GPU_RECORD, - "Records output of GPU shaded material if available." + "使用 GPU 输出来进行录像(如果可能的话)。" ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_INDEX, - "When making a savestate, save state index is automatically increased before it is saved. When loading content, the index will be set to the highest existing index." - ) + "每次储存即时存档时,都在新的栏位储存,以避免覆盖原有的即时存档。每次运行游戏时,都会定位到最新的即时存档栏位。") MSG_HASH( MENU_ENUM_SUBLABEL_BLOCK_SRAM_OVERWRITE, - "Block Save RAM from being overwritten when loading save states. Might potentially lead to buggy games." + "读取即时存档时不覆盖游戏存档。可能会导致某些游戏产生 BUG。" ) MSG_HASH( MENU_ENUM_SUBLABEL_FASTFORWARD_RATIO, - "The maximum rate at which content will be run when using fast forward (e.g., 5.0x for 60 fps content = 300 fps cap). If set to 0.0x, fastforward ratio is unlimited (no FPS cap)." + "快进时最多以几倍速运行。设置为 0 代表不限速。" ) MSG_HASH( MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO, - "When in slow motion, content will slow down by the factor specified/set." + "减速时以几分之一速度运行。" ) MSG_HASH( MENU_ENUM_SUBLABEL_REWIND_ENABLE, - "Enable rewinding. This will take a performance hit when playing." + "启用回溯倒带功能。对游戏运行速度有一定影响。" ) MSG_HASH( MENU_ENUM_SUBLABEL_REWIND_GRANULARITY, - "When rewinding a defined number of frames, you can rewind several frames at a time, increasing the rewind speed." + "每次回溯时回退的帧数。数值越高,回溯越快。" ) MSG_HASH( MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL, @@ -2577,87 +2627,91 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE, - "Automatically makes a savestate at the end of RetroArch's runtime. RetroArch will automatically load this savestate if 'Auto Load State' is enabled." + "在 RetroArch 关闭时自动保存即时存档。如果开启了「自动加载即时存档」功能,下次开始游戏时会加载该存档。" ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_LOAD, - "Automatically load the auto save state on startup." + "开始游戏时,自动加载最新的即时存档。" ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_THUMBNAIL_ENABLE, - "Show thumbnails of save states inside the menu." + "在菜单中显示即时存档缩略图。" ) MSG_HASH( MENU_ENUM_SUBLABEL_AUTOSAVE_INTERVAL, - "Autosaves the non-volatile Save RAM at a regular interval. This is disabled by default unless set otherwise. The interval is measured in seconds. A value of 0 disables autosave." + "每隔一段时间(单位:秒)自动保存游戏存档,此选项默认关闭(0 表示关闭)。" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_REMAP_BINDS_ENABLE, - "If enabled, overrides the input binds with the remapped binds set for the current core." + "如果开启,则当前核心改为使用自定义键位设置。" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_AUTODETECT_ENABLE, - "Enable input auto-detection. Will attempt to autoconfigure joypads, Plug-and-Play style." + "启用自动配置按键。RetroArch 将尝试自动配置手柄按键和即插即用模式。" ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_INPUT_SWAP_OK_CANCEL, - "Swap buttons for OK/Cancel. Disabled is the Japanese button orientation, enabled is the western orientation." + "交换确认键和取消键的键位,默认(关闭)为日版键位,开启则为美版键位。" ) MSG_HASH( MENU_ENUM_SUBLABEL_PAUSE_LIBRETRO, - "If disabled, the content will keep running in the background when RetroArch's menu is toggled." + "如果关闭此选项,打开菜单时游戏仍会后台运行。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_DRIVER, - "Video driver to use." + "使用的视频驱动。" ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_DRIVER, - "Audio driver to use." + "使用的音频驱动。" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DRIVER, - "Input driver to use. Depending on the video driver, it might force a different input driver." + "使用的输入驱动。不同的视频驱动可能需要使用不同的输入驱动。" ) MSG_HASH( MENU_ENUM_SUBLABEL_JOYPAD_DRIVER, - "Joypad driver to use." + "使用的手柄驱动。" ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_DRIVER, - "Audio resampler driver to use." + "使用的音频重采样驱动。" ) MSG_HASH( MENU_ENUM_SUBLABEL_CAMERA_DRIVER, - "Camera driver to use." + "使用的摄像头驱动。" ) MSG_HASH( MENU_ENUM_SUBLABEL_LOCATION_DRIVER, - "Location driver to use." + "使用的定位(GPS)驱动。" ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_DRIVER, - "Menu driver to use." + "使用的菜单驱动。" ) MSG_HASH( MENU_ENUM_SUBLABEL_RECORD_DRIVER, - "Record driver to use." + "使用的录像驱动。" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIDI_DRIVER, + "使用的 MIDI 驱动。" ) MSG_HASH( MENU_ENUM_SUBLABEL_WIFI_DRIVER, - "WiFi driver to use." + "使用的 WiFi 驱动。" ) MSG_HASH( MENU_ENUM_SUBLABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, - "Filter files being shown in filebrowser by supported extensions." + "在文件管理器中,只显示当前核心支持的游戏(根据扩展名)。" ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_WALLPAPER, - "Select an image to set as menu wallpaper." + "选择一张图片来将它设为菜单壁纸。" ) MSG_HASH( MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPER, - "Dynamically load a new wallpaper depending on context." + "根据核心或游戏的不同,使用不同的壁纸。" ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_DEVICE, @@ -2669,23 +2723,23 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_OUTPUT_RATE, - "Audio output sample rate." + "音频输出的采样率。" ) MSG_HASH( MENU_ENUM_SUBLABEL_OVERLAY_OPACITY, - "Opacity of all UI elements of the overlay." + "图层的 UI 透明度。" ) MSG_HASH( MENU_ENUM_SUBLABEL_OVERLAY_SCALE, - "Scale of all UI elements of the overlay." + "图层的 UI 缩放倍数。" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ENABLE, - "Enable the overlay." + "开启此图层。" ) MSG_HASH( MENU_ENUM_SUBLABEL_OVERLAY_PRESET, - "Select an overlay from the file browser." + "从文件管理器中选择图层。" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_IP_ADDRESS, @@ -2733,40 +2787,40 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_STDIN_CMD_ENABLE, - "Enable stdin command interface." + "启用标准命令行输入。" ) MSG_HASH( MENU_ENUM_SUBLABEL_MOUSE_ENABLE, - "Enable mouse controls inside the menu." + "允许在菜单中使用鼠标输入。" ) MSG_HASH( MENU_ENUM_SUBLABEL_POINTER_ENABLE, - "Enable touch controls inside the menu." + "允许在菜单中使用触摸屏输入。" ) MSG_HASH( MENU_ENUM_SUBLABEL_THUMBNAILS, - "Type of thumbnail to display." + "缩略图的显示类型。" ) MSG_HASH( MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE, - "Shows current date and/or time inside the menu." + "在菜单中显示当前的日期和时间。" ) MSG_HASH( MENU_ENUM_SUBLABEL_BATTERY_LEVEL_ENABLE, - "Shows current battery level inside the menu." + "在菜单中显示电量。" ) MSG_HASH( MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND, - "Wrap-around to beginning and/or end if boundary of list is reached horizontally or vertically." + "如果开启此选项,在列表的最上端继续向上翻页会回到最下端,向下翻页时也一样。" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_HOST, - "Enables netplay in host (server) mode." + "启用联机游戏(服务器模式)。" ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, - "Enables netplay in client mode.") + "启用联机游戏(客户端模式)。") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, - "Disconnects an active Netplay connection.") + "断开当前网络连接。") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, "Scans a directory for compatible files and add them to the collection.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, @@ -2775,28 +2829,32 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." ) MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVEFILES_ENABLE, - "Sort save files in folders named after the core used." + "在游戏存档的文件名前面加上核心名称来进行排序。" ) MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVESTATES_ENABLE, - "Sort save states in folders named after the core used." + "在即时存档的文件名前面加上核心名称来进行排序。" ) MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_BUILDBOT_URL, "URL to core updater directory on the Libretro buildbot.") MSG_HASH(MENU_ENUM_SUBLABEL_BUILDBOT_ASSETS_URL, "URL to assets updater directory on the Libretro buildbot.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, - "After downloading, automatically extract files contained in the downloaded archives." + "下载后自动解压。" ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Scan for new rooms.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remove this entry from the collection.") + "删除此条目。") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "View more information about the content.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, + "将此游戏加入你的收藏夹。") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "将此游戏加入你的收藏夹。") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, - "Start the content.") + "开始游戏。") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, - "Adjusts filebrowser settings.") + "调整文件管理器设置。") MSG_HASH( MENU_ENUM_SUBLABEL_AUTO_REMAPS_ENABLE, "Enable customized controls by default at startup." @@ -2814,25 +2872,25 @@ MSG_HASH(MENU_ENUM_SUBLABEL_DATABASE_MANAGER, MSG_HASH(MENU_ENUM_SUBLABEL_CURSOR_MANAGER, "View previous searches.") MSG_HASH(MENU_ENUM_SUBLABEL_TAKE_SCREENSHOT, - "Captures an image of the screen.") + "截取当前屏幕。") MSG_HASH( MENU_ENUM_SUBLABEL_CLOSE_CONTENT, - "Closes the current content. Any unsaved changes might be lost." + "关闭当前游戏。未保存的进度可能会丢失。" ) MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_STATE, - "Load a saved state from the currently selected slot.") + "读取当前栏位的即时存档。") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_STATE, - "Save a state to the currently selected slot.") + "在当前栏位保存即时存档。") MSG_HASH(MENU_ENUM_SUBLABEL_RESUME, - "Resume the currently running content and leave the Quick Menu.") + "退出菜单,继续进行游戏。") MSG_HASH(MENU_ENUM_SUBLABEL_RESUME_CONTENT, - "Resume the currently running content and leave the Quick Menu.") + "退出菜单,继续进行游戏。") MSG_HASH(MENU_ENUM_SUBLABEL_STATE_SLOT, - "Changes the currently selected state slot.") + "更改即时存档使用的栏位序号。") MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE, - "If a state was loaded, content will go back to the state prior to loading.") + "如果你不慎读错了即时存档,使用此命令来撤销。") MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, - "If a state was overwritten, it will roll back to the previous save state.") + "如果你不慎覆盖了即时存档,使用此命令来撤销。") MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, "Retro Achievements service. For more information, visit http://retroachievements.org" @@ -2842,31 +2900,33 @@ MSG_HASH( "Manages currently configured accounts." ) MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_META_REWIND, - "Manages rewind settings.") + "调整游戏回溯功能设置。") MSG_HASH(MENU_ENUM_SUBLABEL_RESTART_CONTENT, - "Restarts the content from the beginning.") + "重新开始游戏。") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, - "Saves an override configuration file which will apply for all content loaded with this core. Will take precedence over the main configuration.") + "保存一个独立配置文件,该配置对此核心运行的所有游戏生效。") +MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + "保存一个独立配置文件,该配置对此游戏文件夹下的所有游戏生效。") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, - "Saves an override configuration file which will apply for the current content only. Will take precedence over the main configuration.") + "保存一个独立配置文件,该配置对此游戏生效。") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_CHEAT_OPTIONS, - "Set up cheat codes.") + "设置金手指。") MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_OPTIONS, - "Set up shaders to visually augment the image.") + "设置图像渲染器。") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS, - "Change the controls for the currently running content.") + "更改当前游戏的键位设置。") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_OPTIONS, - "Change the options for the currently running content.") + "更改当前游戏的核心选项设置。") MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, - "Show advanced settings for power users (hidden by default).") + "为高级用户显示更多设置项(默认关闭)。") MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Perform tasks on a separate thread.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Allow the user to remove entries from collections.") + "允许用户从收藏夹中删除游戏。") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, - "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc.") + "设置系统文件夹。固件和 BIOS 存放在这里。") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, - "Sets start directory for the filebrowser.") + "设置文件管理器的起始文件夹。") MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_DIR, "Usually set by developers who bundle libretro/RetroArch apps to point to assets." @@ -3021,7 +3081,7 @@ MSG_HASH( "Save current cheats as a save file." ) MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SETTINGS, - "Quickly access all relevant in-game settings.") + "快速配置游戏内设置。") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_INFORMATION, "View information pertaining to the application/core.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_ASPECT_RATIO, @@ -3081,7 +3141,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_DELETE, MSG_HASH(MENU_ENUM_SUBLABEL_CORE_DELETE, "Remove this core from disk.") MSG_HASH(MENU_ENUM_LABEL_VALUE_RENAME_ENTRY, - "Rename the title of the entry.") + "重命名此条目") MSG_HASH(MENU_ENUM_LABEL_RENAME_ENTRY, "Rename") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FRAMEBUFFER_OPACITY, @@ -3179,29 +3239,29 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_ADD_TO_FAVORITES, MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, "Show/hide the 'Add to Favorites' option.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_OPTIONS, - "Show Options") + "显示「核心选项」") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_OPTIONS, - "Show/hide the 'Options' option.") + "显示或隐藏「核心选项」选项。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CONTROLS, - "Show Controls") + "显示「键位设置」") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CONTROLS, - "Show/hide the 'Controls' option.") + "显示或隐藏「键位设置」选项。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CHEATS, - "Show Cheats") + "显示「金手指」") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CHEATS, - "Show/hide the 'Cheats' option.") + "显示或隐藏「金手指」选项。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SHADERS, - "Show Shaders") + "显示「渲染器」") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SHADERS, - "Show/hide the 'Shaders' option.") + "显示或隐藏「渲染器」选项。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Show Save Core Overrides") + "显示「保存核心独立配置」") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Show/hide the 'Save Core Overrides' option.") + "显示或隐藏「保存核心独立配置」选项。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Show Save Game Overrides") + "显示「保存游戏独立配置」") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Show/hide the 'Save Game Overrides' option.") + "显示或隐藏「保存游戏独立配置」选项。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, "Show Information") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, @@ -3211,29 +3271,35 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, "Disables kiosk mode. A restart is required for the change to take full effect.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE, - "Enable Kiosk Mode") + "开启懒人模式") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENABLE_KIOSK_MODE, - "Protects the setup by hiding all configuration related settings.") + "隐藏所有与配置文件相关的选项,以防止误改选项导致麻烦。") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, - "Set Password For Disabling Kiosk Mode") + "设置退出懒人模式的密码") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_KIOSK_MODE_PASSWORD, - "Supplying a password when enabling kiosk mode makes it possible to later disable it from the menu, by going to the Main Menu, selecting Disable Kiosk Mode and entering the password.") + "设置密码后,在主菜单选择「退出懒人模式」并输入密码才能退出懒人模式。") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD, - "Enter Password") + "请输入密码") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, - "Password correct.") + "密码正确。") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, - "Password incorrect.") + "密码错误。") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, "Automatically add content to playlist") MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, "Automatically scans loaded content so they appear inside playlists.") MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, - "Scanning of file finished") + "文件扫描完成") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_QUALITY, - "Audio Resampler Quality") + "音频重采样质量") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_QUALITY, "Lower this value to favor performance/lower latency over audio quality, increase if you want better audio quality at the expense of performance/lower latency.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_WATCH_FOR_CHANGES, + "Watch shader files for changes") +MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_WATCH_FOR_CHANGES, + "Auto-apply changes made to shader files on disk.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SHOW_DECORATIONS, + "显示视窗装饰") MSG_HASH(MENU_ENUM_LABEL_VALUE_STATISTICS_SHOW, "Display Statistics") MSG_HASH(MENU_ENUM_SUBLABEL_STATISTICS_SHOW, @@ -3245,7 +3311,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, "Enable background filler thickness") MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, "For CRT displays only. Attempts to use exact core/game resolution and refresh rate.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, "CRT SwitchRes") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, "CRT 原生输出") MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_SUPER, "Switch among native and ultrawide super resolutions." @@ -3264,17 +3330,17 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_OVERLAYS, MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_OVERLAYS, "Show Overlay Settings") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE_MENU, - "Enable menu audio") + "启用菜单声音") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_ENABLE_MENU, - "Enable or disable menu sound.") + "开启或关闭菜单声音。") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_SETTINGS, - "Mixer Settings") + "混音器设置") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MIXER_SETTINGS, - "View and/or modify audio mixer settings.") + "查看或调整混音器设置。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_OVERRIDE_OPTIONS, - "Overrides") + "独立配置") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_OVERRIDE_OPTIONS, - "Options for overriding the global configuration.") + "关于独立配置的选项。") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY, "Will start playback of the audio stream. Once finished, it will remove the current audio stream from memory.") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY_LOOPED, @@ -3317,18 +3383,26 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DISCORD_STATUS_PLAYING, "Playing") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISCORD_STATUS_PAUSED, "Paused") -MSG_HASH( - MENU_ENUM_LABEL_VALUE_DISCORD_ALLOW, - "Enable Discord" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_DISCORD_ALLOW, - "Enable or disable Discord support. Will not work with the browser version, only native desktop client." - ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_DISCORD_ALLOW, + "Enable Discord") +MSG_HASH(MENU_ENUM_SUBLABEL_DISCORD_ALLOW, + "Enable or disable Discord support. Will not work with the browser version, only native desktop client.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MIDI_INPUT, + "Input") +MSG_HASH(MENU_ENUM_SUBLABEL_MIDI_INPUT, + "Select input device.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MIDI_OUTPUT, + "Output") +MSG_HASH(MENU_ENUM_SUBLABEL_MIDI_OUTPUT, + "Select output device.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MIDI_VOLUME, + "Volume") +MSG_HASH(MENU_ENUM_SUBLABEL_MIDI_VOLUME, + "Set output volume (%).") MSG_HASH(MENU_ENUM_LABEL_VALUE_POWER_MANAGEMENT_SETTINGS, - "Power Management") + "电源管理") MSG_HASH(MENU_ENUM_SUBLABEL_POWER_MANAGEMENT_SETTINGS, - "Change power management settings.") + "更改电源管理设置。") MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSTAINED_PERFORMANCE_MODE, "Sustained Performance Mode") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_MPV_SUPPORT, @@ -3343,11 +3417,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CRT_SWITCHRES_SETTINGS, - "CRT SwitchRes" + "CRT 原生输出" ) MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCHRES_SETTINGS, - "Output native, low-resolution signals for use with CRT displays." + "在 CRT 显示器上输出原汁原味的低清晰度信号。" ) MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCH_X_AXIS_CENTERING, @@ -3443,13 +3517,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_STREAMING_TITLE, "Title of Stream") MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SPLIT_JOYCON, - "Split Joy-Con" + "拆下 Joy-Con" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RESET_TO_DEFAULT_CONFIG, - "Reset To Defaults" + "恢复默认设置" ) MSG_HASH( MENU_ENUM_SUBLABEL_RESET_TO_DEFAULT_CONFIG, - "Reset the current configuration to default values." + "将当前配置文件的所有设置恢复为默认。" ) diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 37e330beeb..41a56ad911 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -1,4 +1,4 @@ -MSG_HASH( +MSG_HASH( MSG_COMPILER, "編譯器" ) @@ -1209,8 +1209,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "啟動遊戲內容") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "TGDB 評分") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "重啟 (RCM)") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "重啟") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "錄影設定目錄") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index a93a7e7037..a9eccfa635 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -1,3 +1,29 @@ +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_GPU_PROFILE, + "GPU Übertakten" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_GPU_PROFILE, + "Über- oder Untertakten der Switch GPU" + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_BACKLIGHT_CONTROL, + "Bildschirmhelligkeit" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_BACKLIGHT_CONTROL, + "Anpassen der Switch Bildschirmhelligkeit" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_CPU_PROFILE, + "CPU Übertakten" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_CPU_PROFILE, + "Übertakten der Switch CPU" + ) +#endif MSG_HASH( MSG_COMPILER, "Compiler" @@ -1232,8 +1258,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "Starte Inhalt") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "TGDB-Bewertung") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "Neustart (RCM)") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "Neustart") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Aufnahme-Konfigurationen") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, @@ -3327,121 +3358,121 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE, MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, "Zeige die aktuelle Anzahl an Einzelbildern an") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, - "Automatically add content to playlist") + "Inhalt automatisch zur Playlist hinzufügen") MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, - "Automatically scans loaded content so they appear inside playlists.") + "Scant automatisch den geladenen Inhalt, so dass er in Playlisten angezeigt wird.") MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, - "Scanning of file finished") + "Scannen von Datei beendet") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_QUALITY, - "Audio Resampler Quality") + "Audio Resampler Qualität") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_QUALITY, - "Lower this value to favor performance/lower latency over audio quality, increase if you want better audio quality at the expense of performance/lower latency.") + "Verkleinere diesen Wert um Performance/kleinere Latenz gegenüber Audio Qualität zu bevorzugen, erhöhe ihn wenn du bessere Audioqualität bevorzugst auf kosten der Performance/kleinerer Latenz.") MSG_HASH(MENU_ENUM_LABEL_VALUE_STATISTICS_SHOW, - "Display Statistics") + "Statistiken anzeigen") MSG_HASH(MENU_ENUM_SUBLABEL_STATISTICS_SHOW, - "Show onscreen technical statistics.") + "Technische Onscreen-Statistiken anzeigen.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_ENABLE, - "Enable border filler") + "Rahmenfüller aktivieren.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, - "Enable border filler thickness") + "Rahmenfüllerdicke aktivieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, - "Enable background filler thickness") -MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, "For CRT displays only. Attempts to use exact core/game resolution and refresh rate.") + "Hintergrundfüllerdicke aktivieren") +MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, "Nur für CRT Bildschirme. Versuche die exakte Core-/Spielauflösung und refresh Rate zu verwenden.") MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, "CRT SwitchRes") MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_SUPER, - "Switch among native and ultrawide super resolutions." + "Umschalten zwischen Nativer- und ultraweiter Superauflösungen." ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER, "CRT Super Resolution") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER, "CRT Superauflösung") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_REWIND, - "Show Rewind Settings") + "Rückspuleinstellungen anzeigen") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_REWIND, - "Show/hide the Rewind options.") + "Rückspuleinstellungsoption anzeigen/verstecken ") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_LATENCY, - "Show/hide the Latency options.") + "Latenzoptionen anzeigen/verstecken") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_LATENCY, - "Show Latency Settings") + "Latenzeinstellungen anzeigen") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_OVERLAYS, - "Show/hide the Overlay options.") + "Overlayoptionen anzeigen/verstecken") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_OVERLAYS, - "Show Overlay Settings") + "Overlayeinstellungen anzeigen") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE_MENU, - "Enable menu audio") + "Menuaudio aktivieren") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_ENABLE_MENU, - "Enable or disable menu sound.") + "Menuton aktivieren oder deaktivieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_SETTINGS, - "Mixer Settings") + "Mixer-Einstellungen") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MIXER_SETTINGS, - "View and/or modify audio mixer settings.") + "Anzeigen und/oder anzeigen von Audiomixer-Einstellungen.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_OVERRIDE_OPTIONS, - "Overrides") + "Überschreibungen") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_OVERRIDE_OPTIONS, - "Options for overriding the global configuration.") + "Optionen zum überschreiben der globalen Konfiguration.") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY, - "Will start playback of the audio stream. Once finished, it will remove the current audio stream from memory.") + "Wird die Wiedergabe des Audiostreams starten. Sobald dieser fertig ist, wird der jetzige Audiostream aus dem Speicher entfernt werden.") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY_LOOPED, - "Will start playback of the audio stream. Once finished, it will loop and play the track again from the beginning.") + "Wird die Wiedergabe des Audiostreams starten. Sobald dieser fertig ist, wird dieser erneut von vorne gestartet") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY_SEQUENTIAL, - "Will start playback of the audio stream. Once finished, it will jump to the next audio stream in sequential order and repeat this behavior. Useful as an album playback mode.") + "Wird die Wiedergabe des Audiostreams starten. Sobald dieser fertig ist, springt er zum nächsten Audiostream in sequenzieller Reihenfolge und wiederholt dieses verhalten. Nützlich als Albumwiedergabemodus.") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_STOP, - "This will stop playback of the audio stream, but not remove it from memory. You can start playing it again by selecting 'Play'.") + "Dies wird die Wiedergabe des Audiostreams stoppen, aber ihn nicht aus dem Speicher entfernen. Du kannst die Wiedergabe fortsetzen in dem du erneut auf 'Abspielen' klickst.") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_REMOVE, - "This will stop playback of the audio stream and remove it entirely from memory.") + "Dies wird die Wiedergabe stoppen und den Audiostream komplett aus dem Speicher entfernen.") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_VOLUME, - "Adjust the volume of the audio stream.") + "Anpassen der Lautstärke des Audiostreams.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_MIXER, - "Add this audio track to an available audio stream slot. If no slots are currently available, it will be ignored.") + "Diese Audiospur einem verfügbaren Audiostreamslot hinzufügen. Wenn momentan kein Slot verfügbar ist, wird dies ignoriert.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_MIXER_AND_PLAY, - "Add this audio track to an available audio stream slot and play it. If no slots are currently available, it will be ignored.") + "Diese Audiospur einem verfügbaren Audiostreamslot hinzufügen und sie wiedergeben. Wenn momentan kein Slot verfügbar ist, wird dies ignoriert.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MIXER_ACTION_PLAY, - "Play") + "Abspielen") MSG_HASH(MENU_ENUM_LABEL_VALUE_MIXER_ACTION_PLAY_LOOPED, - "Play (Looped)") + "Abspielen (Schleife)") MSG_HASH(MENU_ENUM_LABEL_VALUE_MIXER_ACTION_PLAY_SEQUENTIAL, - "Play (Sequential)") + "Abspielen (Sequenziell)") MSG_HASH(MENU_ENUM_LABEL_VALUE_MIXER_ACTION_STOP, - "Stop") + "Stopp") MSG_HASH(MENU_ENUM_LABEL_VALUE_MIXER_ACTION_REMOVE, - "Remove") + "Entfernen") MSG_HASH(MENU_ENUM_LABEL_VALUE_MIXER_ACTION_VOLUME, - "Volume") + "Lautstärke") MSG_HASH(MENU_ENUM_LABEL_VALUE_DETECT_CORE_LIST_OK_CURRENT_CORE, - "Current core") + "Aktueller Core") MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_SEARCH_CLEAR, - "Clear") + "Leeren") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISCORD_IN_MENU, - "In-Menu") + "Im Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISCORD_IN_GAME, - "In-Game") + "Im Spiel") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISCORD_IN_GAME_PAUSED, - "In-Game (Paused)") + "Im Spiel (Pausiert)") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISCORD_STATUS_PLAYING, - "Playing") + "Wiedergebend") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISCORD_STATUS_PAUSED, - "Paused") + "Pausiert") MSG_HASH( MENU_ENUM_LABEL_VALUE_DISCORD_ALLOW, - "Enable Discord" + "Discord aktivieren" ) MSG_HASH( MENU_ENUM_SUBLABEL_DISCORD_ALLOW, - "Enable or disable Discord support. Will not work with the browser version, only native desktop client." + "Discordunterstützung aktivieren oder deaktivieren. Funktioniert nicht in der Browserversion, nur im nativen Desktop Client." ) MSG_HASH(MENU_ENUM_LABEL_VALUE_POWER_MANAGEMENT_SETTINGS, - "Power Management") + "Energieverwaltung") MSG_HASH(MENU_ENUM_SUBLABEL_POWER_MANAGEMENT_SETTINGS, - "Change power management settings.") + "Ändere die Energieverwaltungs-Einstellungen") MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSTAINED_PERFORMANCE_MODE, - "Sustained Performance Mode") + "Dauerleistungsmodus") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_MPV_SUPPORT, - "mpv support") + "mpv unterstützung") MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_ADAPTIVE_VSYNC, - "Adaptive Vsync" + "Adaptiver Vsync" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ADAPTIVE_VSYNC, - "V-Sync is enabled until performance falls below the target refresh rate. Can minimize stuttering when performance falls below realtime, and can be more energy efficient." + "V-Sync ist aktiviert bis die Leistung unter die Zielaktualisierungsrate fällt. Kann Ruckler vermeiden, wenn die Leistung unter realtime fällt, und kann energieeffizienter sein." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CRT_SWITCHRES_SETTINGS, @@ -3449,75 +3480,75 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCHRES_SETTINGS, - "Output native, low-resolution signals for use with CRT displays." + "Native Signale mit niedgriger Auflösung ausgeben, welche mit CRT Bildschirmen benutzt werden können." ) MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCH_X_AXIS_CENTERING, - "Cycle through these options if the image is not centered properly on the display." + "Versuche eine dieser Optionen, wenn das Bild nicht richtig zentriert auf dem Bildschirm erscheint." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CRT_SWITCH_X_AXIS_CENTERING, - "X-Axis Centering" + "X-Achsenzentrierung" ) MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_USE_CUSTOM_REFRESH_RATE, - "Use a custom refresh rate specified in the config file if needed.") + "Benutze eine, in der Konfiguration definierte, Aktualisierungsrate wenn notwendig.") MSG_HASH( MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_USE_CUSTOM_REFRESH_RATE, - "Use Custom Refresh Rate") + "Benutze eine benutzerdefinierte Aktualisierungsrate.") MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_OUTPUT_DISPLAY_ID, - "Select the output port connected to the CRT display.") + "Wähle den Ausgangsport aus, welcher mit dem CRT Bildschirm verbunden ist.") MSG_HASH( MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_OUTPUT_DISPLAY_ID, - "Output Display ID") + "Ausgangs Bildschirm ID") MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_START_RECORDING, - "Start Recording" + "Aufnahme starten" ) MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_START_RECORDING, - "Starts recording." + "Startet die Aufnahme" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_STOP_RECORDING, - "Stop Recording" + "Aufnahme beenden" ) MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_STOP_RECORDING, - "Stops recording." + "Beendet die Aufnahme" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_START_STREAMING, - "Start Streaming" + "Streamen starten" ) MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_START_STREAMING, - "Starts streaming." + "Startet das Streamen" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_STOP_STREAMING, - "Stop Streaming" + "Streamen beenden" ) MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_STOP_STREAMING, - "Stops streaming." + "Beendet das Streamen" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE, - "Recording toggle" + "Aufnahme starten/stoppen" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE, - "Streaming toggle" + "Streamen starten/stoppen" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_RECORD_QUALITY, - "Record Quality" + "Aufnahmequalität" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_STREAM_QUALITY, - "Stream Quality" + "Streamingqualität" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_STREAMING_URL, @@ -3540,18 +3571,18 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_TWITCH_STREAM_KEY, MSG_HASH(MENU_ENUM_LABEL_VALUE_YOUTUBE_STREAM_KEY, "YouTube Stream Key") MSG_HASH(MENU_ENUM_LABEL_VALUE_STREAMING_MODE, - "Streaming Mode") + "Streamingmodus") MSG_HASH(MENU_ENUM_LABEL_VALUE_STREAMING_TITLE, - "Title of Stream") + "Streamtitel") MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SPLIT_JOYCON, "Split Joy-Con" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RESET_TO_DEFAULT_CONFIG, - "Reset To Defaults" + "Auf Standardwerte zurücksetzen" ) MSG_HASH( MENU_ENUM_SUBLABEL_RESET_TO_DEFAULT_CONFIG, - "Reset the current configuration to default values." + "Setzt die momentane Konfiguration auf die Standardwerte zurück." ) diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index 936dfae9e4..763b4cf48e 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -1113,8 +1113,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "Start Content") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "TGDB Rating") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "Reboot into RCM") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "Reboot") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Recording Config") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index be712090e1..6c40ffa0c1 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -2133,10 +2133,17 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "TGDB Rating" ) +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REBOOT, + "Reiniciar (RCM)" + ) +#else MSG_HASH( MENU_ENUM_LABEL_VALUE_REBOOT, "Reiniciar" ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Carpeta de configuración de grabación" diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 2c178f0bd5..772a6a0c57 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -1220,8 +1220,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "Démarrer le contenu") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "Classification TGDB") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "Redémarrer en RCM") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "Redémarrer") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Configurations d'enregistrement vidéo") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 4a5ca08b81..6cad54ff30 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -1234,8 +1234,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "Avvia il contenuto") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "Valutazione TGDB ") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "Riavvia (RCM)") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "Riavvia") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Configurazione per la registrazione") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, @@ -3489,27 +3494,27 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE, - "Recording toggle" + "Attiva/Disattiva registrazione" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE, - "Streaming toggle" + "Attiva/disattiva streaming" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_RECORD_QUALITY, - "Record Quality" + "Qualità di registrazione" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_STREAM_QUALITY, - "Stream Quality" + "Qualità stream" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_STREAMING_URL, - "Streaming URL" + "URL dello Streaming" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UDP_STREAM_PORT, - "UDP Stream Port" + "Port UDP Stream" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_TWITCH, @@ -3520,22 +3525,22 @@ MSG_HASH( "YouTube" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_TWITCH_STREAM_KEY, - "Twitch Stream Key") + "Chiave per lo Stream su Twitch") MSG_HASH(MENU_ENUM_LABEL_VALUE_YOUTUBE_STREAM_KEY, - "YouTube Stream Key") + "Chiave per lo Stream su YouTube") MSG_HASH(MENU_ENUM_LABEL_VALUE_STREAMING_MODE, - "Streaming Mode") + "Modalità streaming") MSG_HASH(MENU_ENUM_LABEL_VALUE_STREAMING_TITLE, - "Title of Stream") + "Titolo dello Stream") MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SPLIT_JOYCON, - "Split Joy-Con" + "Splitta i Joy-Con" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RESET_TO_DEFAULT_CONFIG, - "Reset To Defaults" + "Ripristina impostazioni predefinite" ) MSG_HASH( MENU_ENUM_SUBLABEL_RESET_TO_DEFAULT_CONFIG, - "Reset the current configuration to default values." + "Reimposta la configurazione corrente ai valori predefiniti." ) diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index f5c35fd8d2..cd9030d9ce 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -1,4 +1,4 @@ -#if defined(_MSC_VER) && !defined(_XBOX) +#if defined(_MSC_VER) && !defined(_XBOX) /* https://support.microsoft.com/en-us/kb/980263 */ #pragma execution_character_set("utf-8") #endif @@ -96,11 +96,11 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_ENDIAN_DEPENDENT, - "This core does not support inter-architecture netplay between these systems" + "このコアはこれらのシステム間のアーキテクチャ間ネットプレイに対応していません" ) MSG_HASH( MSG_NETPLAY_PLATFORM_DEPENDENT, - "This core does not support inter-architecture netplay" + "このコアはアーキテクチャ間ネットプレイに対応していません" ) MSG_HASH( MSG_NETPLAY_ENTER_PASSWORD, @@ -154,6 +154,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "メニューの外観に関係する設定を変更する。" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LATENCY_SETTINGS, + "ビデオやオーディオ、入力の遅延に関係する設定を変更します。" + ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC, "CPUとGPUを強制に同期する。遅延が減る代わりに性能が低下する。" @@ -248,7 +252,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_TAB, - "ネットプレイのロビー一覧" + "ネットプレイのルーム一覧" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ASK_ARCHIVE, @@ -256,7 +260,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ASSETS_DIRECTORY, - "資産" + "アセット" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_BLOCK_FRAMES, @@ -332,7 +336,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_SH_BUFFER_LENGTH, - "WASAPIの共有バッファーサイズ" + "WASAPI共有バッファーサイズ" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, @@ -428,7 +432,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BUILDBOT_ASSETS_URL, - "Buildbotの資産URL" + "BuildbotのアセットURL" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY, @@ -570,13 +574,16 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, - "履歴一覧のサイズ" + "履歴の保存件数" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE, "エントリーの削除を許可") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS, "クイックメニュー" ) +MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SETTINGS, + "ゲーム中のすべての設定に素早くアクセスできます。" + ) MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIR, "ダウンロード" ) @@ -662,7 +669,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND, MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "ディレクトリ") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS, - "ディスクトレイの開閉") + "ディスクトレイを開閉") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND, "ディスクイメージを挿入") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_INDEX, @@ -708,9 +715,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB, MSG_HASH(MENU_ENUM_LABEL_VALUE_FPS_SHOW, "フレームレートを表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_ENABLE, - "フレームの減速度") + "フレーム制御") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS, - "フレームの減速度") + "フレーム制御") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRONTEND_COUNTERS, "Frontend Counters") MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS, @@ -736,7 +743,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT, MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "コアとは?") MSG_HASH(MENU_ENUM_LABEL_VALUE_HISTORY_LIST_ENABLE, - "履歴一覧を有効") + "履歴を有効") MSG_HASH(MENU_ENUM_LABEL_VALUE_HISTORY_TAB, "履歴") MSG_HASH(MENU_ENUM_LABEL_VALUE_HORIZONTAL_MENU, @@ -952,7 +959,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, "前のシェーダー") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_HOLD_KEY, - "ホルドでスローモーション") + "ホールドでスローモーション") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY, "スローモーションに切り替え") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, @@ -964,7 +971,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, "音量を上げる") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ENABLE, - "ディスプレイのオーバーレイ") + "オーバーレイを表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU, "メニュー表示中にオーバーレイを隠す") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, @@ -1096,7 +1103,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_HEADER_OPACITY, MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DRIVER, "メニューのドライバ") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENUM_THROTTLE_FRAMERATE, - "メニューのフレームレートを減速") + "メニューのフレームレートを制限") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, "設定") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, @@ -1128,7 +1135,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NEAREST, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY, "ネットプレイ") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ALLOW_SLAVES, - "スレーブモードのクライアントを許す") + "スレーブモードのクライアントを許可") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES, "ネットプレイのチェックフレーム") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_MIN, @@ -1257,8 +1264,12 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_DISPLAY_SETTINGS, "OSDディスプレイ") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_OVERLAY_SETTINGS, "OSDオーバーレイ") +MSG_HASH(MENU_ENUM_SUBLABEL_ONSCREEN_OVERLAY_SETTINGS, + "OSDコントロールとベゼルを調整します。") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_SETTINGS, "OSD通知") +MSG_HASH(MENU_ENUM_SUBLABEL_ONSCREEN_NOTIFICATIONS_SETTINGS, + "OSD通知を調整します。") MSG_HASH(MENU_ENUM_LABEL_VALUE_OPEN_ARCHIVE, "フォルダでアーカイブを開く") MSG_HASH(MENU_ENUM_LABEL_VALUE_OPTIONAL, @@ -1303,6 +1314,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS, "プライバシー") MSG_HASH(MENU_ENUM_LABEL_VALUE_MIDI_SETTINGS, "MIDI") +MSG_HASH(MENU_ENUM_SUBLABEL_MIDI_SETTINGS, + "MIDIの設定を変更します。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, "終了") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG, @@ -1361,8 +1374,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "コンテンツをスタート") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "TGDB評価") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "再起動 (RCM)") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "再起動") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "録画設定") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, @@ -1746,7 +1764,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_UNKNOWN, MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS, "アップデーター") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS, - "資産をアップデート") + "アセットをアップデート") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES, "自動設定プロファイルをアップデート") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS, @@ -1792,7 +1810,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "オーバースキャンをクロップ(再起動が必要)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, - "デスクトップのコンポジットを無効") + "デスクトップコンポジションを無効") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "ビデオのドライバ") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -1876,17 +1894,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_TAB, "ビデオ") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_THREADED, - "スレッドされているビデオ") + "ビデオをスレッド化") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VFILTER, "非フリッカー") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_HEIGHT, - "カスタムのビューポートの縦幅") + "カスタムビューポートの縦幅") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, - "カスタムのビューポートの横幅") + "カスタムビューポートの横幅") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, - "カスタムのビューポートのX") + "カスタムビューポートのX位置") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, - "カスタムのビューポートのY") + "カスタムビューポートのY位置") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VI_WIDTH, "Set VI Screen Width") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC, @@ -1894,13 +1912,21 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOWED_FULLSCREEN, "ウィンドウフルスクリーンモード") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_WIDTH, - "ウィンドウの幅") + "ウィンドウの横幅") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_HEIGHT, - "ウィンドウの縦") + "ウィンドウの縦幅") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_X, - "フルスクリーンの幅") + "フルスクリーンの横幅") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_Y, - "フルスクリーンの縦") + "フルスクリーンの縦幅") +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_X, + "非ウィンドウフルスクリーンモードの横幅サイズを指定します。0を指定すると、デスクトップ解像度を使用します。" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_Y, + "非ウィンドウフルスクリーンモードの縦幅サイズを指定します。0を指定すると、デスクトップ解像度を使用します。" + ) MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_DRIVER, "Wi-Fiのドライバ") MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS, @@ -1966,7 +1992,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SCALE_FACTOR, "メニューの倍率") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE, - "アイコンの影を有効") + "アイコンに影を表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "履歴タブを表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, @@ -1994,7 +2020,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_YES, MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO, "シェーダーのプリセット") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE, - "実績を有効または無効にする。詳細については、http://retroachievements.orgを参照。") + "実績を有効または無効にします。詳細については、http://retroachievements.orgを参照してください。") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, "非公式実績/ベータ機能をテスト目的で有効または無効にする。") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, @@ -2072,7 +2098,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SSH_ENABLE, MSG_HASH(MENU_ENUM_SUBLABEL_SUSPEND_SCREENSAVER_ENABLE, "システムのスクリーンセーバーをアクティブになることを予防する。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_SCALE, - "Sets the window size relative to the core viewport size. Alternatively you can set a window width and height below for a fixed window size") + "コアのビューポートサイズを基準にしたウィンドウサイズを指定します。横幅と縦幅が一定の固定ウィンドウサイズを指定することもできます(下の項目)。") MSG_HASH(MENU_ENUM_SUBLABEL_USER_LANGUAGE, "インタフェースの言語を変更する。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION, @@ -2122,7 +2148,7 @@ MSG_HASH(MSG_AUTOSAVE_FAILED, MSG_HASH(MSG_AUTO_SAVE_STATE_TO, "自動ステートセーブ to") MSG_HASH(MSG_BLOCKING_SRAM_OVERWRITE, - "Blocking SRAM Overwrite") + "SRAMの上書きをブロックしています") MSG_HASH(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT, "Bringing up command interface on port") MSG_HASH(MSG_BYTES, @@ -2148,9 +2174,9 @@ MSG_HASH(MSG_CORE_DOES_NOT_SUPPORT_SAVESTATES, MSG_HASH(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, "コア設定ファイルの作成に成功しました") MSG_HASH(MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, - "Could not find any next driver") + "次のドライバを見つけることができませんでした") MSG_HASH(MSG_COULD_NOT_FIND_COMPATIBLE_SYSTEM, - "Could not find compatible system.") + "対応システムを見つけることができませんでした") MSG_HASH(MSG_COULD_NOT_FIND_VALID_DATA_TRACK, "有効なデータトラックを見つけることができませんでした") MSG_HASH(MSG_COULD_NOT_OPEN_DATA_TRACK, @@ -2158,9 +2184,9 @@ MSG_HASH(MSG_COULD_NOT_OPEN_DATA_TRACK, MSG_HASH(MSG_COULD_NOT_READ_CONTENT_FILE, "コンテンツファイルを読み込むことができませんでした") MSG_HASH(MSG_COULD_NOT_READ_MOVIE_HEADER, - "Could not read movie header.") + "動画ヘッダーを読み込むことができませんでした") MSG_HASH(MSG_COULD_NOT_READ_STATE_FROM_MOVIE, - "Could not read state from movie.") + "動画から状態を読み込むことができませんでした") MSG_HASH(MSG_CRC32_CHECKSUM_MISMATCH, "CRC32 checksum mismatch between content file and saved content checksum in replay file header) replay highly likely to desync on playback.") MSG_HASH(MSG_CUSTOM_TIMING_GIVEN, @@ -2170,11 +2196,11 @@ MSG_HASH(MSG_DECOMPRESSION_ALREADY_IN_PROGRESS, MSG_HASH(MSG_DECOMPRESSION_FAILED, "解凍に失敗しました") MSG_HASH(MSG_DETECTED_VIEWPORT_OF, - "Detected viewport of") + "ビューポートを検出しました of") MSG_HASH(MSG_DID_NOT_FIND_A_VALID_CONTENT_PATCH, "有効なコンテンツパッチが見つかりませんでした") MSG_HASH(MSG_DISCONNECT_DEVICE_FROM_A_VALID_PORT, - "Disconnect device from a valid port.") + "デバイスを有効なポートから切断してください") MSG_HASH(MSG_DISK_CLOSED, "ディスクを挿入しました") MSG_HASH(MSG_DISK_EJECTED, @@ -2268,7 +2294,7 @@ MSG_HASH(MSG_FAILED_TO_SEND_SRAM_DATA_TO_CLIENT, MSG_HASH(MSG_FAILED_TO_START_AUDIO_DRIVER, "オーディオドライバーの開始に失敗しました。オーディオなしで続行します") MSG_HASH(MSG_FAILED_TO_START_MOVIE_RECORD, - "映像の録画の開始に失敗しました") + "動画の録画の開始に失敗しました") MSG_HASH(MSG_FAILED_TO_START_RECORDING, "録画の開始に失敗しました") MSG_HASH(MSG_FAILED_TO_TAKE_SCREENSHOT, @@ -2310,13 +2336,13 @@ MSG_HASH(MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING, MSG_HASH(MSG_INFLATED_CHECKSUM_DID_NOT_MATCH_CRC32, "Inflated checksum did not match CRC32.") MSG_HASH(MSG_INPUT_CHEAT, - "Input Cheat") + "チートを入力") MSG_HASH(MSG_INPUT_CHEAT_FILENAME, - "Input Cheat Filename") + "チートファイル名を入力") MSG_HASH(MSG_INPUT_PRESET_FILENAME, - "Input Preset Filename") + "プリセットファイル名を入力") MSG_HASH(MSG_INPUT_RENAME_ENTRY, - "Rename Title") + "タイトルを変更") MSG_HASH(MSG_INTERFACE, "インタフェース") MSG_HASH(MSG_INTERNAL_STORAGE, @@ -2356,9 +2382,9 @@ MSG_HASH(MSG_MOVIE_FILE_IS_NOT_A_VALID_BSV1_FILE, MSG_HASH(MSG_MOVIE_FORMAT_DIFFERENT_SERIALIZER_VERSION, "Movie format seems to have a different serializer version. Will most likely fail.") MSG_HASH(MSG_MOVIE_PLAYBACK_ENDED, - "Movie playback ended.") + "動画の再生を終了しました") MSG_HASH(MSG_MOVIE_RECORD_STOPPED, - "Stopping movie record.") + "動画の録画を停止しました") MSG_HASH(MSG_NETPLAY_FAILED, "ネットプレイの初期化に失敗しました") MSG_HASH(MSG_NO_CONTENT_STARTING_DUMMY_CORE, @@ -2368,7 +2394,7 @@ MSG_HASH(MSG_NO_SAVE_STATE_HAS_BEEN_OVERWRITTEN_YET, MSG_HASH(MSG_NO_STATE_HAS_BEEN_LOADED_YET, "ステートはまだロードされていません") MSG_HASH(MSG_OVERRIDES_ERROR_SAVING, - "Error saving overrides.") + "優先ファイルの保存でエラーが発生しました") MSG_HASH(MSG_OVERRIDES_SAVED_SUCCESSFULLY, "優先ファイルを保存しました") MSG_HASH(MSG_PAUSED, @@ -2376,7 +2402,7 @@ MSG_HASH(MSG_PAUSED, MSG_HASH(MSG_PROGRAM, "RetroArch") MSG_HASH(MSG_READING_FIRST_DATA_TRACK, - "Reading first data track...") + "最初のデータトラックを読み込んでいます...") MSG_HASH(MSG_RECEIVED, "received") MSG_HASH(MSG_RECORDING_TERMINATED_DUE_TO_RESIZE, @@ -2384,17 +2410,17 @@ MSG_HASH(MSG_RECORDING_TERMINATED_DUE_TO_RESIZE, MSG_HASH(MSG_RECORDING_TO, "Recording to") MSG_HASH(MSG_REDIRECTING_CHEATFILE_TO, - "Redirecting cheat file to") + "チートファイルの出力先を変更しています to") MSG_HASH(MSG_REDIRECTING_SAVEFILE_TO, - "Redirecting save file to") + "セーブファイルの出力先を変更しています to") MSG_HASH(MSG_REDIRECTING_SAVESTATE_TO, - "Redirecting savestate to") + "ステートセーブの出力先を変更しています to") MSG_HASH(MSG_REMAP_FILE_SAVED_SUCCESSFULLY, "リマップファイルを保存しました") MSG_HASH(MSG_REMAP_FILE_REMOVED_SUCCESSFULLY, "リマップファイルを削除しました") MSG_HASH(MSG_REMOVED_DISK_FROM_TRAY, - "ディスクをトレイから取り除きました") + "ディスクをトレイから取り出しました") MSG_HASH(MSG_REMOVING_TEMPORARY_CONTENT_FILE, "一時コンテンツファイルを削除中") MSG_HASH(MSG_RESET, @@ -2402,19 +2428,19 @@ MSG_HASH(MSG_RESET, MSG_HASH(MSG_RESTARTING_RECORDING_DUE_TO_DRIVER_REINIT, "Restarting recording due to driver reinit.") MSG_HASH(MSG_RESTORED_OLD_SAVE_STATE, - "Restored old save state.") + "以前のステートセーブを復元しました") MSG_HASH(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO, "Shaders: restoring default shader preset to") MSG_HASH(MSG_REVERTING_SAVEFILE_DIRECTORY_TO, - "Reverting savefile directory to") + "セーブフォルダを元に戻しています to") MSG_HASH(MSG_REVERTING_SAVESTATE_DIRECTORY_TO, - "Reverting savestate directory to") + "ステートセーブフォルダを元に戻しています to") MSG_HASH(MSG_REWINDING, "巻き戻しています") MSG_HASH(MSG_REWIND_INIT, "Initializing rewind buffer with size") MSG_HASH(MSG_REWIND_INIT_FAILED, - "Failed to initialize rewind buffer. Rewinding will be disabled.") + "巻き戻しバッファの初期化に失敗しました。巻き戻しが無効になります") MSG_HASH(MSG_REWIND_INIT_FAILED_THREADED_AUDIO, "Implementation uses threaded audio. Cannot use rewind.") MSG_HASH(MSG_REWIND_REACHED_END, @@ -2454,9 +2480,9 @@ MSG_HASH(MSG_SLOW_MOTION_REWIND, MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, "SRAMはセーブされません") MSG_HASH(MSG_STARTING_MOVIE_PLAYBACK, - "Starting movie playback.") + "動画の再生を開始しています") MSG_HASH(MSG_STARTING_MOVIE_RECORD_TO, - "Starting movie record to") + "動画の録画を開始しています to") MSG_HASH(MSG_STATE_SIZE, "ステートサイズ") MSG_HASH(MSG_STATE_SLOT, @@ -2480,9 +2506,9 @@ MSG_HASH(MSG_USING_CORE_NAME_FOR_NEW_CONFIG, MSG_HASH(MSG_USING_LIBRETRO_DUMMY_CORE_RECORDING_SKIPPED, "Using libretro dummy core. Skipping recording.") MSG_HASH(MSG_VALUE_CONNECT_DEVICE_FROM_A_VALID_PORT, - "Connect device from a valid port.") + "デバイスを有効なポートから接続してください") MSG_HASH(MSG_VALUE_DISCONNECTING_DEVICE_FROM_PORT, - "Disconnecting device from port") + "デバイスをポートから切断中") MSG_HASH(MSG_VALUE_REBOOTING, "再起動しています...") MSG_HASH(MSG_VALUE_SHUTTING_DOWN, @@ -2521,15 +2547,15 @@ MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_SYNC, "オーディオを同期する。推奨。") MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "How far an axis must be tilted to result in a button press." + "入力を確定するために要するスティックの傾き量です。" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, - "Amount of seconds to wait until proceeding to the next bind." + "次のバインドに移るまでの待機秒数です。" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_HOLD, - "Amount of seconds to hold an input to bind it." + "入力をバインドするために要するホールド秒数です。" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD, @@ -2541,19 +2567,19 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VSYNC, - "Synchronizes the output video of the graphics card to the refresh rate of the screen. Recommended." + "グラフィックカードから出力されるビデオと画面のリフレッシュレートを同期します(推奨)。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ALLOW_ROTATE, - "Allow cores to set rotation. When disabled, rotation requests are ignored. Useful for setups where one manually rotates the screen." + "コアに回転を許可します。無効にすると、回転リクエストは無視されます。手動で画面を回転したいときに便利です。" ) MSG_HASH( MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, - "Some cores might have a shutdown feature. If enabled, it will prevent the core from shutting RetroArch down. Instead, it loads a dummy core." + "一部のコアはシャットダウン機能を有している場合があります。有効にすると、コアがRetroArchをシャットダウンすることを防止し、代わりにダミーのコアをロードします。" ) MSG_HASH( MENU_ENUM_SUBLABEL_CHECK_FOR_MISSING_FIRMWARE, - "Check if all the required firmware is present before attempting to load content." + "コンテンツをロードする前に必要なファームウェアがすべて存在するかどうかを確認します。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE, @@ -2577,7 +2603,7 @@ MSG_HASH( ) MSG_HASH( MSG_DEVICE_NOT_CONFIGURED, - "設定されていない" + "設定されていません" ) MSG_HASH( MSG_DEVICE_NOT_CONFIGURED_FALLBACK, @@ -2647,13 +2673,13 @@ MSG_HASH(MENU_ENUM_SUBLABEL_PAUSE_NONACTIVE, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_DISABLE_COMPOSITION, "コンポジションを有効または無効にする。") MSG_HASH(MENU_ENUM_SUBLABEL_HISTORY_LIST_ENABLE, - "最近使ったファイルの履歴を有効または無効にする。") + "最近使ったファイル履歴を有効または無効にする。") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_HISTORY_SIZE, - "最近使ったファイルの履歴一覧の最大保存件数を設定する。") + "最近使ったファイル履歴の最大保存件数を設定する。") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_UNIFIED_MENU_CONTROLS, - "統一的なメニューコントロール") + "メニューコントロールを統一") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_UNIFIED_MENU_CONTROLS, - "Use the same controls for both the menu and the game. Applies to the keyboard.") + "メニューとゲームの両方に同じコントロールを使用します。キーボードに適用されます。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_ENABLE, "OSDメッセージを表示する。") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE, @@ -2689,7 +2715,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOWFLAKE, "スノーフレーク") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS, - "ロビー一覧を更新") + "ルーム一覧を更新") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, "ニックネーム: %s") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, @@ -2697,11 +2723,11 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_FOUND, "対応するコンテンツが見つかりました") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_CROP_OVERSCAN, - "Cuts off a few pixels around the edges of the image that were customarily left blank by developers and sometimes contain garbage pixels.") + "開発者によって慣例的に空白にされていたイメージの端にあるいくつかのピクセルを切り取ります。 不正確なピクセルを含むこともあります。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SMOOTH, - "Add a slight blur to the image to take the edge off of the hard pixel edges. This option has very little impact on performance.") + "画像にわずかなぼかしを加えて、ピクセルのエッジを柔らかくします。このオプションは、パフォーマンスにはほとんど影響しません。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FILTER, - "Apply a CPU-powered video filter. NOTE: Might come at a high performance cost. Some video filters might only work for cores that use 32bit or 16bit color.") + "CPUベースのビデオフィルターを適用します。備考: パフォーマンスを多く消費するかもしれません。一部のビデオフィルターは、32bitまたは16bitカラーを使用するコアでのみ動作する可能性があります。") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_USERNAME, "RetroAchievementsアカウントのユーザー名") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD, @@ -2721,9 +2747,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, "アプリを終了する。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, - "ディスプレイのカスタムビデオ横幅を設定する。ゼロを設定すると出来るだけウィンドーをスケールする。") + "ディスプレイのカスタムビデオ横幅を指定します。0を指定すると可能な限りウィンドウをスケールします。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, - "ディスプレイのカスタムビデオ縦幅を設定する。ゼロを設定すると出来るだけウィンドーをスケールする。") + "ディスプレイのカスタムビデオ縦幅を指定します。0を指定すると可能な限りウィンドウをスケールします。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_X, "OSDのカスタムX軸を指定する。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, @@ -2738,7 +2764,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, - "Only scales video in integer steps. The base size depends on system-reported geometry and aspect ratio. If 'Force Aspect' is not set, X/Y will be integer scaled independently." + "ビデオのスケールを整数に限定します。基礎サイズはシステムによって報告されたジオメトリとアスペクト比に依存します。「強制アスペクト比」が指定されていない場合、横幅と縦幅はそれぞれ独立して整数でスケールされます。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT, @@ -2746,11 +2772,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ROTATION, - "Forces a certain rotation of the screen. The rotation is added to rotations which the core sets." + "指定した角度で画面を強制的に回転させます。この回転はコアが指定する回転に追加されます。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FORCE_SRGB_DISABLE, - "Forcibly disable sRGB FBO support. Some Intel OpenGL drivers on Windows have video problems with sRGB FBO support if this is enabled. Enabling this can work around it." + "sRGB FBOの対応を強制的に無効にします。sRGB FBOの対応が有効になっている一部のWindows用Intel Open GLドライバはビデオ問題を有します。この機能を有効にすることで問題を回避できます。" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN, @@ -2774,11 +2800,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_FASTFORWARD_RATIO, - "The maximum rate at which content will be run when using fast forward (E.g. 5x for 60 fps content => 300 fps cap). If this is set at 0x, then fastforward ratio is unlimited (no FPS cap)." + "早送り中のコンテンツの最大フレームレートです。例えば、60FPSコンテンツに5xを指定すると、最大フレームレートは300FPSになります。0xを指定した場合は無制限になります(フレームレート制限なし)。" ) MSG_HASH( MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO, - "When slowmotion, content will slow down by a factor." + "スローモーション時、コンテンツは設定した比率に応じて減速します。" ) MSG_HASH( MENU_ENUM_SUBLABEL_REWIND_ENABLE, @@ -2790,11 +2816,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL, - "Sets log level for cores. If a log level issued by a core is below this value, it is ignored." + "コアのログレベルを設定します。コアによって発行されたログレベルがこの値を下回る場合、無視されます。" ) MSG_HASH( MENU_ENUM_SUBLABEL_PERFCNT_ENABLE, - "Enable performance counters for RetroArch (and cores)." + "RetroArch(およびコア)のパフォーマンスカウンターを有効にします。" ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE, @@ -2822,7 +2848,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_INPUT_SWAP_OK_CANCEL, - "Swap buttons for OK/Cancel. Disabled is the Japanese button orientation, enabled is the western orientation." + "OK/キャンセルボタンの扱いを入れ替えます。無効はマルをOKとする日本式配置、有効はバツをOKとする西洋式配置です。" ) MSG_HASH( MENU_ENUM_SUBLABEL_PAUSE_LIBRETRO, @@ -2868,6 +2894,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_WIFI_DRIVER, "使用するWi-Fiドライバ" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIDI_DRIVER, + "使用するMIDIドライバ" + ) MSG_HASH( MENU_ENUM_SUBLABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, "ファイルブラウザーに表示されるファイルを対応する拡張子で絞り込む。" @@ -2890,15 +2920,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_OUTPUT_RATE, - "Audio output samplerate." + "オーディオ出力のサンプルレート" ) MSG_HASH( MENU_ENUM_SUBLABEL_OVERLAY_OPACITY, - "Opacity of all UI elements of the overlay." + "オーバーレイUI要素の不透明度" ) MSG_HASH( MENU_ENUM_SUBLABEL_OVERLAY_SCALE, - "Scale of all UI elements of the overlay." + "オーバーレイUI要素の表示倍率" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ENABLE, @@ -2910,23 +2940,23 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_IP_ADDRESS, - "The address of the host to connect to." + "ホストのIPアドレス" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_TCP_UDP_PORT, - "The port of the host IP address. Can be either a TCP or UDP port." + "ホストのIPアドレスのポート番号(TCPまたはUDPポート)" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_PASSWORD, - "The password for connecting to the netplay host. Used only in host mode." + "ネットプレイのホストに接続するためのパスワードです。ホストモードでのみ使用されます。" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_PUBLIC_ANNOUNCE, - "ゲームのネットプレイを公開にアナウンスする。設定しないと、クライアントは手動で接続が必要です。" + "ゲームのネットプレイを一般公開します。設定しない場合、クライアントは手動接続が必要です。" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_SPECTATE_PASSWORD, - "The password for connecting to the netplay host with only spectator privileges. Used only in host mode." + "観戦者のみに適用されるネットプレイのホストに接続するためのパスワードです。ホストモードでのみ使用されます。" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_STATELESS_MODE, @@ -2970,34 +3000,34 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_HOST, - "ネットプレイをホスト(サーバー)モードで有効にする。" + "ネットプレイをホスト(サーバー)モードで有効にします。" ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, - "ネットプレイをクライアントモードで有効にする。") + "ネットプレイをクライアントモードで有効にします。") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "アクティブなネットプレイ接続を切断する。") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "フォルダの対応ファイルをスキャンしてコレクションに追加する。") + "対応ファイルをフォルダからスキャンしてコレクションに追加します。") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "対応ファイルをスキャンしてコレクションに追加する。") + "対応ファイルをスキャンしてコレクションに追加します。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." ) MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVEFILES_ENABLE, - "使用したコアの名前に基づいてフォルダーのステートセーブを分類する。" + "使用したコアの名前に基づいてセーブファイルをフォルダごとに分類します。" ) MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVESTATES_ENABLE, - "使用したコアの名前に基づいてフォルダーのステートセーブを分類する。" + "使用したコアの名前に基づいてステートセーブをフォルダごとに分類します。" ) MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_BUILDBOT_URL, "URL to core updater directory on the Libretro buildbot.") MSG_HASH(MENU_ENUM_SUBLABEL_BUILDBOT_ASSETS_URL, "URL to assets updater directory on the Libretro buildbot.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, - "After downloading, automatically extract archives that the downloads are contained inside." + "ダウンロード後、ダウンロードしたコンテンツが含まれるアーカイブを自動的に展開します。" ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, - "新しいネットプレイルームをスキャンする。") + "新しいネットプレイルームをスキャンします。") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, "このエントリーをコレクションから削除する。") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, @@ -3023,7 +3053,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_DATABASE_MANAGER, MSG_HASH(MENU_ENUM_SUBLABEL_CURSOR_MANAGER, "以前の検索を表示する。") MSG_HASH(MENU_ENUM_SUBLABEL_TAKE_SCREENSHOT, - "画面の画像をキャプチャーする。") + "画面をキャプチャーする。") MSG_HASH( MENU_ENUM_SUBLABEL_CLOSE_CONTENT, "現在動作中のゲームを終了する。すべての保存されていない変更は失われる可能性がある。" @@ -3044,7 +3074,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, "ステートが上書きされていた場合、以前のステートセーブにロールバックする。") MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, - "Retro Achievements service. For more information, visit http://retroachievements.org" + "RetroAchievementサービスです。詳細については、http://retroachievements.orgを参照してください。" ) MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_LIST, @@ -3073,7 +3103,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, "ユーザーがコレクションからエントリーを削除できるようにする。") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, - "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc.") + "システムフォルダを指定します。コアはBIOSや特定システムの設定などをロードするため、このフォルダを探索することができます。") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, "ファイルブラウザーの開始ディレクトリを指定する。") MSG_HASH( @@ -3081,18 +3111,18 @@ MSG_HASH( "Usually set by developers who bundle libretro/RetroArch apps to point to assets." ) MSG_HASH(MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPERS_DIRECTORY, - "The place to store the wallpapers dynamically loaded by the menu depending on context.") + "表示内容に応じて動的にロードされる壁紙が存在するフォルダを指定します。") MSG_HASH(MENU_ENUM_SUBLABEL_THUMBNAILS_DIRECTORY, - "To store thumbnail files." + "サムネイルファイルの保存フォルダ" ) MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_CONFIG_DIRECTORY, - "Sets start directory for menu configuration browser.") + "設定ファイルブラウザーの初期ディレクトリを指定する。") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN, "The number of frames of input latency for netplay to use to hide network latency. This reduces jitter and makes netplay less CPU-intensive, at the expense of noticeable input lag.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, "The range of frames of input latency that may be used to hide network latency. Reduces jitter and makes netplay less CPU-intensive, at the expense of unpredictable input lag.") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_CYCLE_TRAY_STATUS, - "Cycle the current disk. If the disk is inserted, it will eject the disk. If the disk has not been inserted, it will be inserted. ") + "ディスクトレイの状態を変更します。ディスクが挿入されていればそのディスクを排出し、未挿入であればディスクを挿入します。") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_INDEX, "ディスクのインデックスを変更する。") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_OPTIONS, @@ -3106,7 +3136,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_LAYOUT, MSG_HASH(MENU_ENUM_SUBLABEL_XMB_THEME, "アイコンに異なるテーマを選択する。変更はプログラムの再起動後に反映される。") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHADOWS_ENABLE, - "すべてのアイコンにドロップシャドウを有効にする。この設定はわずかにパフォーマンスに影響を及ぼす。") + "すべてのアイコンにドロップシャドウを適用します。この設定はわずかにパフォーマンスに影響を及ぼします。") MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_COLOR_THEME, "異なる背景色グラデーションテーマを選択する。") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY, @@ -3114,7 +3144,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY, MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MENU_COLOR_THEME, "異なる背景色グラデーションテーマを選択する。") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_RIBBON_ENABLE, - "Select an animated background effect. Can be GPU-intensive depending on the effect. If performance is unsatisfactory, either turn this off or revert to a simpler effect.") + "背景アニメーション効果を選択します。効果によってはGPUに大きな負荷をかけます。パフォーマンスが不足する場合、効果をオフにするか、より単純な効果を選択してください。") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_FONT, "メニューの使用するフォントを選択する。") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, @@ -3138,9 +3168,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_HEADER_OPACITY, MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_FOOTER_OPACITY, "フッターの不透明度を調整する。") MSG_HASH(MENU_ENUM_SUBLABEL_DPI_OVERRIDE_ENABLE, - "The menu normally scales itself dynamically. If you want to set a specific scaling size instead, enable this.") + "通常、メニューは動的にスケールされます。特定のスケールサイズを指定したい場合に有効にしてください。") MSG_HASH(MENU_ENUM_SUBLABEL_DPI_OVERRIDE_VALUE, - "Set the custom scaling size here. NOTE: You have to enable 'DPI Override' for this scaling size to take effect.") + "カスタムスケールサイズを指定します。備考: このスケールサイズを反映するには、「優先DPI」を有効にする必要があります。") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_ASSETS_DIRECTORY, "すべてのダウンロードしたファイルをこのフォルダに保存する。") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_REMAPPING_DIRECTORY, @@ -3150,12 +3180,12 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_DIR_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, "コアやアプリの情報ファイルをこのフォルダに存在する。") MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, - "If a joypad is plugged in, that joypad will be autoconfigured if a config file corresponding to it is present inside this directory.") + "ジョイパッドを接続したとき、そのジョイパッドに対応した設定ファイルが指定したフォルダに存在していれば、そのジョイパッドは自動的に設定されます。") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, "すべてのプレイリストをこのフォルダに保存する。") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, - "If set to a directory, content which is temporarily extracted (e.g. from archives) will be extracted to this directory." + "フォルダを指定すると、アーカイブなどから一時的に展開されるコンテンツが指定先に展開されるようになります。" ) MSG_HASH(MENU_ENUM_SUBLABEL_CURSOR_DIRECTORY, "保存したクエリをこのフォルダに保存する。") @@ -3196,15 +3226,15 @@ MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_CONFIG_DIRECTORY, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_PATH, "OSDの使用するフォントを選択する。") MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_APPLY_CHANGES, - "Changes to the shader configuration will take effect immediately. Use this if you changed the amount of shader passes, filtering, FBO scale, etc.") + "シェーダーの設定の変更を直ちに反映します。シェーダーのパス数やフィルタリング、FBOスケールなどを変更したときに使用します。") MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHADER_NUM_PASSES, - "Increase or decrease the amount of shader pipeline passes. You can bind a separate shader to each pipeline pass and configure its scale and filtering." + "シェーダーパイプラインのパス数を増加または減少させます。各パイプラインに別々のシェーダーをバインドし、フィルタリングとスケールを設定することができます。" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_USE_MITM_SERVER, - "MITMサーバーを使用") + "中継サーバーを使用") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_MITM_SERVER, - "MITMサーバーの設置場所") + "中継サーバーの設置場所") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_USE_MITM_SERVER, "中継サーバーにネットプレイ接続を転送する。ファイアウォールやNAT/UPnPに問題がある時に効果的。") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER, @@ -3234,7 +3264,7 @@ MSG_HASH( "オーディオミキサーを消音" ) MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MIXER_MUTE, - "Mute/unmute mixer audio.") + "ミキサーオーディオを消音/消音解除にする。") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_ONLINE_UPDATER, "オンラインアップデーターを表示") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_ONLINE_UPDATER, @@ -3248,7 +3278,7 @@ MSG_HASH( MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_CORE_UPDATER, "コアのアップデーターを表示") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_CORE_UPDATER, - "Show/hide the ability to update cores (and core info files).") + "コア(とコアの情報ファイル)をアップデートする機能を表示/非表示にする。") MSG_HASH(MSG_PREPARING_FOR_CONTENT_SCAN, "コンテンツをスキャンするための準備中") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_DELETE, @@ -3257,6 +3287,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_DELETE, "コアをハードディスクから削除する。") MSG_HASH(MENU_ENUM_LABEL_VALUE_RENAME_ENTRY, "エントリーの名前を変更する") +MSG_HASH(MENU_ENUM_SUBLABEL_RENAME_ENTRY, + "このエントリーのタイトルを変更します。") MSG_HASH(MENU_ENUM_LABEL_RENAME_ENTRY, "Rename") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FRAMEBUFFER_OPACITY, @@ -3286,7 +3318,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_ICONS_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MAIN_MENU_ENABLE_SETTINGS, "設定タブを有効") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, - "設定タブを有効するパスワード") + "設定タブを有効にするパスワード") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD, "パスワードを入力してください") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_OK, @@ -3294,13 +3326,13 @@ MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_OK, MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_NOK, "パスワードが違います") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Enables the Settings tab. A restart is required for the tab to appear.") + "設定タブを有効にする。タブを表示するには再起動が必要。") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, - "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password.") + "設定タブを隠す際にあらかじめパスワードを設定しておくことで、そのパスワードを使用してメニューから設定タブを復元することができます。") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, "コレクションのエントリーの名前変更をユーザーに許可する。") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, - "エントリーの名前変更を許す") + "エントリーの名前変更を許可") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, "「コアをロード」を表示") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CORE, @@ -3395,6 +3427,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "お気に入りに追加") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, "お気に入りに追加") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, + "このエントリーをお気に入りに追加します。") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "このエントリーをお気に入りに追加します。") MSG_HASH(MENU_ENUM_LABEL_VALUE_RESET_CORE_ASSOCIATION, "コアの関連付けをリセット") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, @@ -3404,17 +3440,17 @@ MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE, "キオスクモードを有効") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENABLE_KIOSK_MODE, - "Protects the setup by hiding all configuration related settings.") + "コンフィグに関係するあらゆる設定を隠すことでセットアップを保護します。") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, - "キオスクモードを無効するパスワードを設定") + "キオスクモードを無効にするパスワードを設定") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_KIOSK_MODE_PASSWORD, - "Supplying a password when enabling kiosk mode makes it possible to later disable it from the menu, by going to the Main Menu, selecting Disable Kiosk Mode and entering the password.") + "キオスクモードを有効にする際にあらかじめパスワードを設定しておくことで、そのパスワードを使用してメニューからキオスクモードを無効にすることができます。") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD, - "パスワードを入力して下さい") + "パスワードを入力してください") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, - "パスワード正解。") + "パスワードが一致しました") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, - "パスワード不正解。") + "パスワードが一致しません") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED, "OSDメッセージの赤色値") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN, @@ -3426,9 +3462,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, MSG_HASH(MSG_CONFIG_OVERRIDE_LOADED, "優先ファイルをロードしました。") MSG_HASH(MSG_GAME_REMAP_FILE_LOADED, - "ゲームの優先ファイルをロードしました。") + "ゲームのリマップファイルをロードしました。") MSG_HASH(MSG_CORE_REMAP_FILE_LOADED, - "コアの優先ファイルをロードしました。") + "コアのリマップファイルをロードしました。") MSG_HASH(MSG_RUNAHEAD_CORE_DOES_NOT_SUPPORT_SAVESTATES, "このコアはステートセーブを対応されていないために先読みが無効になりました。") MSG_HASH(MSG_RUNAHEAD_FAILED_TO_SAVE_STATE, @@ -3448,7 +3484,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_OPACITY, MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_QUALITY, "オーディオリサンプラーの音質") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_QUALITY, - "Lower this value to favor performance/lower latency over audio quality, increase if you want better audio quality at the expense of performance/lower latency.") + "オーディオ品質よりもパフォーマンス/遅延を優先する場合は低い設定を、パフォーマンス/遅延よりもオーディオ品質を優先する場合は高い設定を選択します。") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_WATCH_FOR_CHANGES, "シェーダーファイルの変更を監視") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SHOW_DECORATIONS, @@ -3463,13 +3499,14 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, "Enable border filler thickness") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, "Enable background filler thickness") -MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, "For CRT displays only. Attempts to use exact core/game resolution and refresh rate.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, "CRT SwitchRes") -MSG_HASH( - MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_SUPER, - "Switch among native and ultrawide super resolutions." - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER, "CRT Super Resolution") +MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, + "For CRT displays only. Attempts to use exact core/game resolution and refresh rate.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, + "CRT SwitchRes") +MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_SUPER, + "Switch among native and ultrawide super resolutions.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER, + "CRT Super Resolution") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_REWIND, "「巻き戻し」を表示") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_REWIND, @@ -3592,6 +3629,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SCAN_FINISHED, "
  • 上記タスクの後にRetroArchを再起動してください。
  • \n" "コンテンツが存在データベースの一致が必要です。まだちゃんと動けないとバグを報告できます。") #endif +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_WIMP, + "デスクトップメニューを表示") +MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_WIMP, + "デスクトップメニューを開きます。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_DONT_SHOW_AGAIN, "今後表示しない") MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_STOP, @@ -3635,23 +3676,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_LIST, MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_OVERRIDE_OPTIONS, "オーバーライド") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_OVERRIDE_OPTIONS, - "Options for overriding the global configuration.") + "グローバル設定をオーバーライドするための設定です。") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY, - "Will start playback of the audio stream. Once finished, it will remove the current audio stream from memory.") + "オーディオストリームの再生を開始します。再生が終わると、現在のオーディオストリームはメモリから取り除かれます。") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY_LOOPED, - "Will start playback of the audio stream. Once finished, it will loop and play the track again from the beginning.") + "オーディオストリームの再生を開始します。再生が終わると、トラックは最初から繰り返して再生されます。") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY_SEQUENTIAL, - "Will start playback of the audio stream. Once finished, it will jump to the next audio stream in sequential order and repeat this behavior. Useful as an album playback mode.") + "オーディオストリームの再生を開始します。再生が終わると、順番に次のオーディオストリームに\n移り、それを繰り返します。アルバム再生モードとして便利です。") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_STOP, - "This will stop playback of the audio stream, but not remove it from memory. You can start playing it again by selecting 'Play'.") + "オーディオストリームの再生を停止します。メモリからは取り除かれず、「再生」を選択することで再び再生を開始できます。") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_REMOVE, - "This will stop playback of the audio stream and remove it entirely from memory.") + "オーディオストリームの再生を停止してメモリから完全に取り除きます。") MSG_HASH(MENU_ENUM_SUBLABEL_MIXER_ACTION_VOLUME, - "Adjust the volume of the audio stream.") + "オーディオストリームの音量を調整します。") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_MIXER, - "Add this audio track to an available audio stream slot. If no slots are currently available, it will be ignored.") + "このオーディオトラックを使用可能なオーディオストリームスロットに追加します。空きスロットが存在しない場合は無視されます。") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_MIXER_AND_PLAY, - "Add this audio track to an available audio stream slot and play it. If no slots are currently available, it will be ignored.") + "このオーディオトラックを使用可能なオーディオストリームスロットに追加して再生します。空きスロットが存在しない場合は無視されます。") MSG_HASH(MENU_ENUM_LABEL_VALUE_MIXER_ACTION_PLAY, "再生") MSG_HASH(MENU_ENUM_LABEL_VALUE_MIXER_ACTION_PLAY_LOOPED, @@ -3684,7 +3725,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_DISCORD_ALLOW, - "Enable or disable Discord support. Will not work with the browser version, only native desktop client." + "Discord連携を有効または無効にします。デスクトップクライアントでのみ動作し、ブラウザーバージョンでは動作しません。" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_MIDI_INPUT, "入力") @@ -3721,7 +3762,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CONFIRM_DELETE_PLAYLIST, MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_QUESTION, "質問") MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_COULD_NOT_DELETE_FILE, - "ファイル削除に失敗しました。") + "ファイルの削除に失敗しました。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_COULD_NOT_RENAME_FILE, "ファイルの名前変更に失敗しました。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_GATHERING_LIST_OF_FILES, @@ -3848,10 +3889,10 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_USE_CUSTOM_REFRESH_RATE, - "Use a custom refresh rate specified in the config file if needed.") + "設定ファイルで指定されたカスタムリフレッシュレートを使用します。") MSG_HASH( MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_USE_CUSTOM_REFRESH_RATE, - "Use Custom Refresh Rate") + "カスタムリフレッシュレートを使用") MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_OUTPUT_DISPLAY_ID, "Select the output port connected to the CRT display.") @@ -3900,19 +3941,19 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_RECORD_QUALITY, - "Record Quality" + "録画の品質" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_STREAM_QUALITY, - "Stream Quality" + "配信の品質" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_STREAMING_URL, - "Streaming URL" + "配信URL" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UDP_STREAM_PORT, - "UDP Stream Port" + "UDP配信ポート" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_TWITCH, @@ -3923,22 +3964,22 @@ MSG_HASH( "YouTube" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_TWITCH_STREAM_KEY, - "Twitch Stream Key") + "Twitch配信キー") MSG_HASH(MENU_ENUM_LABEL_VALUE_YOUTUBE_STREAM_KEY, - "YouTube Stream Key") + "YouTubeストリームキー") MSG_HASH(MENU_ENUM_LABEL_VALUE_STREAMING_MODE, - "Streaming Mode") + "配信モード") MSG_HASH(MENU_ENUM_LABEL_VALUE_STREAMING_TITLE, - "Title of Stream") + "配信タイトル") MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SPLIT_JOYCON, "Split Joy-Con" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RESET_TO_DEFAULT_CONFIG, - "Reset To Defaults" + "デフォルトに戻す" ) MSG_HASH( MENU_ENUM_SUBLABEL_RESET_TO_DEFAULT_CONFIG, - "Reset the current configuration to default values." + "現在の設定をデフォルトの値に戻します。" ) diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index abcd7f1c0b..dab570bc6b 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -1,4 +1,4 @@ -MSG_HASH( +MSG_HASH( MSG_COMPILER, "컴파일러" ) @@ -1206,8 +1206,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "컨텐츠 시작") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "TGDB 등급") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "재시작 (RCM)") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "재시작") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "녹화 설정") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index f4cba8bbb1..1be69e735f 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1,3 +1,11 @@ +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_SWITCH_GPU_PROFILE, + "switch_gpu_profile") +MSG_HASH(MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL, + "switch_backlight_control") +MSG_HASH(MENU_ENUM_LABEL_SWITCH_CPU_PROFILE, + "switch_cpu_profile") +#endif MSG_HASH(MENU_ENUM_LABEL_ACCOUNTS_CHEEVOS_USERNAME, "accounts_cheevos_username") MSG_HASH(MENU_ENUM_LABEL_ACCOUNTS_LIST, @@ -1103,6 +1111,8 @@ MSG_HASH(MENU_ENUM_LABEL_THUMBNAILS_UPDATER_LIST, "thumbnails_updater_list") MSG_HASH(MENU_ENUM_LABEL_TIMEDATE_ENABLE, "menu_timedate_enable") +MSG_HASH(MENU_ENUM_LABEL_TIMEDATE_STYLE, + "menu_timedate_style") MSG_HASH(MENU_ENUM_LABEL_TITLE_COLOR, "menu_title_color") MSG_HASH(MENU_ENUM_LABEL_UI_COMPANION_ENABLE, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index ccb61b3e60..d33ee6965c 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -1111,8 +1111,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "Content Opstarten") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "TGDB Rating") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "Herstart (RCM)") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "Herstart") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Opname Config Map") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index aa786ee33c..26ed0fd143 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -1,4 +1,4 @@ -MSG_HASH( +MSG_HASH( MSG_COMPILER, "Kompilator" ) @@ -1314,8 +1314,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "Rozpocznij zawartość") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "Ocena TGDB") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "Restart (RCM)") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "Restart") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Konfig. Nagrywania") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index bc0fc9e36e..ec0cb6b929 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -2133,10 +2133,17 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "Classificação TGDB" ) +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REBOOT, + "Reiniciar (RCM)" + ) +#else MSG_HASH( MENU_ENUM_LABEL_VALUE_REBOOT, "Reiniciar" ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Configuração de Gravação" diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index df756e59bc..63b4a10704 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -1200,8 +1200,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "Iniciar conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "Classificação TGDB") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "Reinicializar (RCM)") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "Reinicializar") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Pasta de armazenamento das configuração de gravação") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 2174e4627a..40e25890a3 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -1,4 +1,4 @@ -#if defined(_MSC_VER) && !defined(_XBOX) +#if defined(_MSC_VER) && !defined(_XBOX) /* https://support.microsoft.com/en-us/kb/980263 */ #pragma execution_character_set("utf-8") #endif @@ -1229,8 +1229,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "Запустить игру") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "Рейтинг TGDB") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "Перезагрузка (RCM)") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "Перезагрузка") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Конфигурация записи") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index a3799a3a80..83db0a6a8e 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -1738,6 +1738,10 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Shows current date and/or time inside menu."); break; + case MENU_ENUM_LABEL_TIMEDATE_STYLE: + snprintf(s, len, + "Style to show the current date and/or time in."); + break; case MENU_ENUM_LABEL_BATTERY_LEVEL_ENABLE: snprintf(s, len, "Shows current battery level inside menu."); diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 5e67a80758..a3a118a1d1 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1,3 +1,29 @@ +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_GPU_PROFILE, + "GPU Overclock" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_GPU_PROFILE, + "Overclock or underclock the Switch GPU" + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_BACKLIGHT_CONTROL, + "Screen brightness" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_BACKLIGHT_CONTROL, + "Increase or decrease the Switch screen brightness" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_CPU_PROFILE, + "CPU Overclock" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_CPU_PROFILE, + "Overclock the Switch CPU" + ) +#endif MSG_HASH( MSG_COMPILER, "Compiler" @@ -2133,10 +2159,17 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "TGDB Rating" ) +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REBOOT, + "Reboot into RCM" + ) +#else MSG_HASH( MENU_ENUM_LABEL_VALUE_REBOOT, "Reboot" ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Recording Config" @@ -2873,6 +2906,46 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_TIMEDATE_ENABLE, "Show date / time" ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE, + "Style of date / time" + ) + MSG_HASH( + MENU_ENUM_SUBLABEL_TIMEDATE_STYLE, + "Changes the style current date and/or time is shown inside the menu." + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_YMD_HMS, + "YYYY-MM-DD HH:MM:SS" + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_YMD_HM, + "YYYY-MM-DD HH:MM" + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_MDYYYY, + "MM-DD-YYYY HH:MM" + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_HMS, + "HH:MM:SS" + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_HM, + "HH:MM" + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_DM_HM, + "DD/MM HH:MM" + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_MD_HM, + "MM/DD HH:MM" + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_AM_PM, + "HH:MM:SS (AM/PM)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_TITLE_COLOR, "Menu title color" @@ -5246,7 +5319,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, - "Enables netplay in client mode." + "Enter netplay server address and connect in client mode." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index bfb8c8b93b..d03dd162d4 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -1,4 +1,4 @@ -MSG_HASH( +MSG_HASH( MSG_COMPILER, "Compiler" ) @@ -1222,8 +1222,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "Start Content") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, "TGDB Rating") +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "Khởi động lại (RCM)") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, "Khởi động lại") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Recording Config") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, diff --git a/lakka.h b/lakka.h index 60d117cbdb..0447aa6ed5 100644 --- a/lakka.h +++ b/lakka.h @@ -24,4 +24,67 @@ #define LAKKA_UPDATE_DIR "/storage/.update/" #define LAKKA_CONNMAN_DIR "/storage/.cache/connman/" +#ifdef HAVE_LAKKA_SWITCH +static char* SWITCH_GPU_PROFILES[] = { + "docked-overclock-3", + "docked-overclock-2", + "docked-overclock-1", + "docked", + "non-docked-overclock-5", + "non-docked-overclock-4", + "non-docked-overclock-3", + "non-docked-overclock-2", + "non-docked-overclock-1", + "non-docked", + "non-docked-underclock-1", + "non-docked-underclock-2", + "non-docked-underclock-3", +}; + +static char* SWITCH_GPU_SPEEDS[] = { + "998 Mhz", + "921 Mhz", + "844 Mhz", + "768 Mhz", + "691 Mhz", + "614 Mhz", + "537 Mhz", + "460 Mhz", + "384 Mhz", + "307 Mhz", + "230 Mhz", + "153 Mhz", + "76 Mhz" +}; + +static int SWITCH_BRIGHTNESS[] = { + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100 +}; + +static char* SWITCH_CPU_PROFILES[] = { + "overclock-4", + "overclock-3", + "overclock-2", + "overclock-1", + "default", +}; + +static char* SWITCH_CPU_SPEEDS[] = { + "1912 MHz", + "1734 MHz", + "1530 MHz", + "1224 MHz", + "1020 MHz" +}; +#endif + #endif diff --git a/libretro-common/glsm/glsm.c b/libretro-common/glsm/glsm.c index ee7d1af7a7..70fed4ba3f 100644 --- a/libretro-common/glsm/glsm.c +++ b/libretro-common/glsm/glsm.c @@ -200,6 +200,7 @@ struct gl_cached_state int cap_translate[SGL_CAP_MAX]; }; +static GLuint default_framebuffer; static GLint glsm_max_textures; struct retro_hw_render_callback hw_render; static struct gl_cached_state gl_state; @@ -216,6 +217,20 @@ GLenum rglGetError(void) return glGetError(); } +/* + * + * Core in: + * OpenGL : 3.2 + * OpenGLES : N/A + */ + +void rglProvokingVertex( GLenum provokeMode) +{ +#if defined(HAVE_OPENGL) + glProvokingVertex(provokeMode); +#endif +} + /* * * Core in: @@ -2080,6 +2095,18 @@ void rglTexStorage2D(GLenum target, GLsizei levels, GLenum internalFormat, glTexStorage2D(target, levels, internalFormat, width, height); #endif } +/* + * + * Core in: + * OpenGL : 3.2 + * OpenGLES : 3.2 + */ +void rglDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLvoid *indices, GLint basevertex) +{ +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) && defined(HAVE_OPENGLES_3_2) + glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); +#endif +} /* * @@ -2571,7 +2598,8 @@ static void glsm_state_setup(void) gl_state.bind_textures.ids = (GLuint*)calloc(glsm_max_textures, sizeof(GLuint)); - gl_state.framebuf = hw_render.get_current_framebuffer(); + default_framebuffer = glsm_get_current_framebuffer(); + gl_state.framebuf = default_framebuffer; gl_state.cullface.mode = GL_BACK; gl_state.frontface.mode = GL_CCW; @@ -2629,7 +2657,7 @@ static void glsm_state_bind(void) } } - glBindFramebuffer(RARCH_GL_FRAMEBUFFER, hw_render.get_current_framebuffer()); + glBindFramebuffer(RARCH_GL_FRAMEBUFFER, default_framebuffer); if (gl_state.blendfunc.used) glBlendFunc( @@ -2786,10 +2814,8 @@ static bool glsm_state_ctx_destroy(void *data) return true; } -static bool glsm_state_ctx_init(void *data) +static bool glsm_state_ctx_init(glsm_ctx_params_t *params) { - glsm_ctx_params_t *params = (glsm_ctx_params_t*)data; - if (!params || !params->environ_cb) return false; @@ -2803,15 +2829,16 @@ static bool glsm_state_ctx_init(void *data) #else hw_render.context_type = RETRO_HW_CONTEXT_OPENGLES2; #endif -#else -#ifdef CORE - hw_render.context_type = RETRO_HW_CONTEXT_OPENGL_CORE; - hw_render.version_major = 3; - hw_render.version_minor = 3; #else hw_render.context_type = RETRO_HW_CONTEXT_OPENGL; + if (params->context_type != RETRO_HW_CONTEXT_NONE) + hw_render.context_type = params->context_type; + if (params->major != 0) + hw_render.version_major = params->major; + if (params->minor != 0) + hw_render.version_minor = params->minor; #endif -#endif + hw_render.context_reset = params->context_reset; hw_render.context_destroy = params->context_destroy; hw_render.stencil = params->stencil; @@ -2859,7 +2886,7 @@ bool glsm_ctl(enum glsm_state_ctl state, void *data) glsm_state_ctx_destroy(data); break; case GLSM_CTL_STATE_CONTEXT_INIT: - return glsm_state_ctx_init(data); + return glsm_state_ctx_init((glsm_ctx_params_t*)data); case GLSM_CTL_STATE_SETUP: glsm_state_setup(); break; diff --git a/libretro-common/include/glsm/glsm.h b/libretro-common/include/glsm/glsm.h index d422267d11..9113bdc9a1 100644 --- a/libretro-common/include/glsm/glsm.h +++ b/libretro-common/include/glsm/glsm.h @@ -146,6 +146,7 @@ typedef struct glsm_ctx_params bool stencil; unsigned major; unsigned minor; + enum retro_hw_context_type context_type; } glsm_ctx_params_t; GLuint glsm_get_current_framebuffer(void); diff --git a/libretro-common/include/glsm/glsmsym.h b/libretro-common/include/glsm/glsmsym.h index 137f3cb5e4..d32cab28d8 100644 --- a/libretro-common/include/glsm/glsmsym.h +++ b/libretro-common/include/glsm/glsmsym.h @@ -33,6 +33,8 @@ RETRO_BEGIN_DECLS #define glTexCoord2f rglTexCoord2f /* more forward-compatible GL subset symbols */ +#define glDrawRangeElementsBaseVertex rglDrawRangeElementsBaseVertex +#define glProvokingVertex rglProvokingVertex #define glGetInteger64v rglGetInteger64v #define glGenSamplers rglGenSamplers #define glBindSampler rglBindSampler @@ -469,6 +471,8 @@ void rglGetInteger64v( GLenum pname, void rglUniform2iv( GLint location, GLsizei count, const GLint *value); +void rglProvokingVertex( GLenum provokeMode); +void rglDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLvoid *indices, GLint basevertex); RETRO_END_DECLS diff --git a/libretro-common/include/rthreads/rthreads.h b/libretro-common/include/rthreads/rthreads.h index 6e248f3d94..93fc16195d 100644 --- a/libretro-common/include/rthreads/rthreads.h +++ b/libretro-common/include/rthreads/rthreads.h @@ -52,6 +52,23 @@ typedef unsigned sthread_tls_t; */ sthread_t *sthread_create(void (*thread_func)(void*), void *userdata); +/** + * sthread_create_with_priority: + * @start_routine : thread entry callback function + * @userdata : pointer to userdata that will be made + * available in thread entry callback function + * @thread_priority : thread priority hint value from [1-100] + * + * Create a new thread. It is possible for the caller to give a hint + * for the thread's priority from [1-100]. Any passed in @thread_priority + * values that are outside of this range will cause sthread_create() to + * create a new thread using the operating system's default thread + * priority. + * + * Returns: pointer to new thread if successful, otherwise NULL. + */ +sthread_t *sthread_create_with_priority(void (*thread_func)(void*), void *userdata, int thread_priority); + /** * sthread_detach: * @thread : pointer to thread object diff --git a/libretro-common/rthreads/rthreads.c b/libretro-common/rthreads/rthreads.c index b8f04f106c..b5db30d788 100644 --- a/libretro-common/rthreads/rthreads.c +++ b/libretro-common/rthreads/rthreads.c @@ -27,6 +27,7 @@ #endif #include +#include #include #include @@ -161,6 +162,35 @@ static void *thread_wrap(void *data_) */ sthread_t *sthread_create(void (*thread_func)(void*), void *userdata) { + return sthread_create_with_priority(thread_func, userdata, 0); +} + +/* TODO/FIXME - this needs to be implemented for Switch/3DS */ +#if !defined(SWITCH) && !defined(USE_WIN32_THREADS) && !defined(_3DS) && !defined(GEKKO) +#define HAVE_THREAD_ATTR +#endif + +/** + * sthread_create_with_priority: + * @start_routine : thread entry callback function + * @userdata : pointer to userdata that will be made + * available in thread entry callback function + * @thread_priority : thread priority hint value from [1-100] + * + * Create a new thread. It is possible for the caller to give a hint + * for the thread's priority from [1-100]. Any passed in @thread_priority + * values that are outside of this range will cause sthread_create() to + * create a new thread using the operating system's default thread + * priority. + * + * Returns: pointer to new thread if successful, otherwise NULL. + */ +sthread_t *sthread_create_with_priority(void (*thread_func)(void*), void *userdata, int thread_priority) +{ +#ifdef HAVE_THREAD_ATTR + pthread_attr_t thread_attr; + bool thread_attr_needed = false; +#endif bool thread_created = false; struct thread_data *data = NULL; sthread_t *thread = (sthread_t*)calloc(1, sizeof(*thread)); @@ -172,27 +202,48 @@ sthread_t *sthread_create(void (*thread_func)(void*), void *userdata) if (!data) goto error; - data->func = thread_func; - data->userdata = userdata; + data->func = thread_func; + data->userdata = userdata; #ifdef USE_WIN32_THREADS - thread->thread = CreateThread(NULL, 0, thread_wrap, data, 0, &thread->id); - thread_created = !!thread->thread; + thread->thread = CreateThread(NULL, 0, thread_wrap, data, 0, &thread->id); + thread_created = !!thread->thread; #else -#if defined(VITA) - pthread_attr_t thread_attr; + +#ifdef HAVE_THREAD_ATTR pthread_attr_init(&thread_attr); + + if ( (thread_priority >= 1) && (thread_priority <= 100) ) + { + struct sched_param sp; + memset(&sp, 0, sizeof(struct sched_param)); + sp.sched_priority = thread_priority; + pthread_attr_setschedpolicy(&thread_attr, SCHED_RR); + pthread_attr_setschedparam(&thread_attr, &sp); + + thread_attr_needed = true; + } +#endif + +#if defined(VITA) pthread_attr_setstacksize(&thread_attr , 0x10000 ); - thread_created = pthread_create(&thread->id, &thread_attr, thread_wrap, data) == 0; -#else - thread_created = pthread_create(&thread->id, NULL, thread_wrap, data) == 0; + thread_attr_needed = true; +#endif + +#ifdef HAVE_THREAD_ATTR + if (thread_attr_needed) + thread_created = pthread_create(&thread->id, &thread_attr, thread_wrap, data) == 0; + else +#endif + thread_created = pthread_create(&thread->id, NULL, thread_wrap, data) == 0; + +#ifdef HAVE_THREAD_ATTR + pthread_attr_destroy(&thread_attr); #endif #endif - if (!thread_created) - goto error; - - return thread; + if (thread_created) + return thread; error: if (data) diff --git a/libretro-common/rthreads/switch_pthread.h b/libretro-common/rthreads/switch_pthread.h index a9ea9be1a3..0fa582b299 100644 --- a/libretro-common/rthreads/switch_pthread.h +++ b/libretro-common/rthreads/switch_pthread.h @@ -28,30 +28,29 @@ #include #include -#include "../include/retro_inline.h" -#include "../../verbosity.h" +#include -#define THREADVARS_MAGIC 0x21545624 // !TV$ +#define THREADVARS_MAGIC 0x21545624 /* !TV$ */ int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); void pthread_exit(void *retval); -// This structure is exactly 0x20 bytes, if more is needed modify getThreadVars() below +/* This structure is exactly 0x20 bytes, if more is needed modify getThreadVars() below */ typedef struct { - // Magic value used to check if the struct is initialized + /* Magic value used to check if the struct is initialized */ u32 magic; - // Thread handle, for mutexes + /* Thread handle, for mutexes */ Handle handle; - // Pointer to the current thread (if exists) + /* Pointer to the current thread (if exists) */ Thread *thread_ptr; - // Pointer to this thread's newlib state + /* Pointer to this thread's newlib state */ struct _reent *reent; - // Pointer to this thread's thread-local segment - void *tls_tp; // !! Offset needs to be TLS+0x1F8 for __aarch64_read_tp !! + /* Pointer to this thread's thread-local segment */ + void *tls_tp; /* !! Offset needs to be TLS+0x1F8 for __aarch64_read_tp !! */ } ThreadVars; static INLINE ThreadVars *getThreadVars(void) @@ -77,9 +76,9 @@ static INLINE int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex return 0; } -INLINE int pthread_mutex_destroy(pthread_mutex_t *mutex) +static INLINE int pthread_mutex_destroy(pthread_mutex_t *mutex) { - // Nothing + /* Nothing */ *mutex = 0; return 0; @@ -101,7 +100,7 @@ static INLINE int pthread_mutex_unlock(pthread_mutex_t *mutex) INLINE int pthread_detach(pthread_t thread) { (void)thread; - // Nothing for now + /* Nothing for now */ return 0; } @@ -154,7 +153,7 @@ static INLINE int pthread_cond_broadcast(pthread_cond_t *cond) INLINE int pthread_cond_destroy(pthread_cond_t *cond) { - // Nothing + /* Nothing */ return 0; } diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 9b76a19b6f..c7258c52cf 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -187,6 +187,12 @@ generic_deferred_push(deferred_push_core_content_dirs_subdir_list, DISPLAYLIST_ generic_deferred_push(deferred_push_lakka_list, DISPLAYLIST_LAKKA) #endif +#ifdef HAVE_LAKKA_SWITCH +generic_deferred_push(deferred_push_switch_gpu_profile, DISPLAYLIST_SWITCH_GPU_PROFILE) +generic_deferred_push(deferred_push_switch_backlight_control, DISPLAYLIST_SWITCH_BACKLIGHT_CONTROL) +generic_deferred_push(deferred_push_switch_cpu_profile, DISPLAYLIST_SWITCH_CPU_PROFILE) +#endif + static int deferred_push_cursor_manager_list_deferred( menu_displaylist_info_t *info) { @@ -875,6 +881,23 @@ static int menu_cbs_init_bind_deferred_push_compare_label( { BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_information); } +#ifdef HAVE_LAKKA_SWITCH + else if (strstr(label, + msg_hash_to_str(MENU_ENUM_LABEL_SWITCH_GPU_PROFILE))) + { + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_switch_gpu_profile); + } + else if (strstr(label, + msg_hash_to_str(MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL))) + { + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_switch_backlight_control); + } + else if (strstr(label, + msg_hash_to_str(MENU_ENUM_LABEL_SWITCH_CPU_PROFILE))) + { + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_switch_cpu_profile); + } +#endif else if (strstr(label, msg_hash_to_str(MENU_ENUM_LABEL_SYSTEM_INFORMATION))) { diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 97c5885fcb..d6fe477c11 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -2503,6 +2503,64 @@ static int action_ok_deferred_list_stub(const char *path, return 0; } +#ifdef HAVE_LAKKA_SWITCH + +static int action_ok_set_switch_cpu_profile(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + char* profile_name = SWITCH_CPU_PROFILES[entry_idx]; + + char command[PATH_MAX_LENGTH] = {0}; + + snprintf(command, sizeof(command), "cpu-profile set %s", profile_name); + + system(command); + + snprintf(command, sizeof(command), "Current profile set to %s", profile_name); + + runloop_msg_queue_push(command, 1, 90, true); + + return menu_cbs_exit(); +} + +static int action_ok_set_switch_gpu_profile(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + char* profile_name = SWITCH_GPU_PROFILES[entry_idx]; + + char command[PATH_MAX_LENGTH] = {0}; + + snprintf(command, sizeof(command), "gpu-profile set %s", profile_name); + + system(command); + + snprintf(command, sizeof(command), "Current profile set to %s", profile_name); + + runloop_msg_queue_push(command, 1, 90, true); + + return menu_cbs_exit(); +} + +static int action_ok_set_switch_backlight(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + int brightness = SWITCH_BRIGHTNESS[entry_idx]; + + char command[PATH_MAX_LENGTH] = {0}; + + snprintf(command, sizeof(command), "echo %d > /sys/class/backlight/backlight/brightness", brightness); + + system(command); + + snprintf(command, sizeof(command), "Brightness set to %d%%", brightness); + + runloop_msg_queue_push(command, 1, 90, true); + + return 0; +} + +#endif + static int action_ok_load_core_deferred(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -3869,8 +3927,11 @@ int lan_room_count; void netplay_refresh_rooms_menu(file_list_t *list) { - char s[4115]; + char s[8300]; int i = 0; + int room_type = 0; + + s[0] = '\0'; menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, list); @@ -3948,14 +4009,16 @@ void netplay_refresh_rooms_menu(file_list_t *list) snprintf(s, sizeof(s), "%s: %s%s", netplay_room_list[i].lan ? "Local" : (netplay_room_list[i].host_method == NETPLAY_HOST_METHOD_MITM ? - "Internet (relay)" : "Internet (direct)"), + "Internet (Relay)" : "Internet"), netplay_room_list[i].nickname, country); + room_type = netplay_room_list[i].lan ? MENU_ROOM_LAN : (netplay_room_list[i].host_method == NETPLAY_HOST_METHOD_MITM ? MENU_ROOM_RELAY : MENU_ROOM); + menu_entries_append_enum(list, s, msg_hash_to_str(MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM), MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM, - MENU_SETTINGS_NETPLAY_ROOMS_START + i, 0, 0); + room_type, 0, 0); } netplay_rooms_free(); @@ -4959,6 +5022,11 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_HELP_LIST: case MENU_ENUM_LABEL_INFORMATION_LIST: case MENU_ENUM_LABEL_CONTENT_SETTINGS: +#ifdef HAVE_LAKKA_SWITCH + case MENU_ENUM_LABEL_SWITCH_GPU_PROFILE: + case MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL: + case MENU_ENUM_LABEL_SWITCH_CPU_PROFILE: +#endif BIND_ACTION_OK(cbs, action_ok_push_default); break; case MENU_ENUM_LABEL_LOAD_CONTENT_SPECIAL: @@ -5382,6 +5450,17 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs, BIND_ACTION_OK(cbs, action_ok_playlist_entry); } break; +#ifdef HAVE_LAKKA_SWITCH + case MENU_SET_SWITCH_GPU_PROFILE: + BIND_ACTION_OK(cbs, action_ok_set_switch_gpu_profile); + break; + case MENU_SET_SWITCH_BRIGHTNESS: + BIND_ACTION_OK(cbs, action_ok_set_switch_backlight); + break; + case MENU_SET_SWITCH_CPU_PROFILE: + BIND_ACTION_OK(cbs, action_ok_set_switch_cpu_profile); + break; +#endif case FILE_TYPE_RPL_ENTRY: BIND_ACTION_OK(cbs, action_ok_rpl_entry); break; diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 21235de14e..8953602cbd 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -296,6 +296,7 @@ default_sublabel_macro(action_bind_sublabel_pointer_enable, MENU_ default_sublabel_macro(action_bind_sublabel_thumbnails, MENU_ENUM_SUBLABEL_THUMBNAILS) default_sublabel_macro(action_bind_sublabel_left_thumbnails, MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS) default_sublabel_macro(action_bind_sublabel_timedate_enable, MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE) +default_sublabel_macro(action_bind_sublabel_timedate_style, MENU_ENUM_SUBLABEL_TIMEDATE_STYLE) default_sublabel_macro(action_bind_sublabel_battery_level_enable, MENU_ENUM_SUBLABEL_BATTERY_LEVEL_ENABLE) default_sublabel_macro(action_bind_sublabel_navigation_wraparound, MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND) default_sublabel_macro(action_bind_sublabel_audio_resampler_quality, MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_QUALITY) @@ -478,6 +479,12 @@ default_sublabel_macro(action_bind_sublabel_show_wimp, #endif default_sublabel_macro(action_bind_sublabel_discord_allow, MENU_ENUM_SUBLABEL_DISCORD_ALLOW) +#ifdef HAVE_LAKKA_SWITCH +default_sublabel_macro(action_bind_sublabel_switch_gpu_profile, MENU_ENUM_SUBLABEL_SWITCH_GPU_PROFILE) +default_sublabel_macro(action_bind_sublabel_switch_cpu_profile, MENU_ENUM_SUBLABEL_SWITCH_CPU_PROFILE) +default_sublabel_macro(action_bind_sublabel_switch_backlight_control, MENU_ENUM_SUBLABEL_SWITCH_BACKLIGHT_CONTROL) +#endif + static int action_bind_sublabel_cheevos_entry( file_list_t *list, unsigned type, unsigned i, @@ -524,11 +531,14 @@ static int action_bind_sublabel_remap_kbd_sublabel( { unsigned user_idx = (type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) / RARCH_FIRST_CUSTOM_BIND; - snprintf(s, len, "User #%d: %s", user_idx + 1, - input_config_get_device_display_name(user_idx) ? - input_config_get_device_display_name(user_idx) : - (input_config_get_device_name(user_idx) ? - input_config_get_device_name(user_idx) : "N/A")); + snprintf(s, len, "%s #%d: %s", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_USER), + user_idx + 1, + input_config_get_device_display_name(user_idx) ? + input_config_get_device_display_name(user_idx) : + (input_config_get_device_name(user_idx) ? + input_config_get_device_name(user_idx) : + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE))); return 0; } @@ -548,7 +558,9 @@ static int action_bind_sublabel_audio_mixer_stream( switch (stream->state) { case AUDIO_STREAM_STATE_NONE: - strlcpy(msg, "N/A", sizeof(msg)); + strlcpy(msg, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), + sizeof(msg)); break; case AUDIO_STREAM_STATE_STOPPED: strlcpy(msg, "Stopped", sizeof(msg)); @@ -564,7 +576,8 @@ static int action_bind_sublabel_audio_mixer_stream( break; } - snprintf(s, len, "State : %s | Volume: %.2f dB", msg, + snprintf(s, len, "State : %s | %s: %.2f dB", msg, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MIXER_ACTION_VOLUME), stream->volume); return 0; } @@ -578,11 +591,14 @@ static int action_bind_sublabel_remap_sublabel( unsigned offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); - snprintf(s, len, "User #%d: %s", offset + 1, - input_config_get_device_display_name(offset) ? - input_config_get_device_display_name(offset) : - (input_config_get_device_name(offset) ? - input_config_get_device_name(offset) : "N/A")); + snprintf(s, len, "%s #%d: %s", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_USER), + offset + 1, + input_config_get_device_display_name(offset) ? + input_config_get_device_display_name(offset) : + (input_config_get_device_name(offset) ? + input_config_get_device_name(offset) : + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE))); return 0; } @@ -618,6 +634,7 @@ static int action_bind_sublabel_netplay_room( const char *gamename = NULL; const char *core_ver = NULL; const char *frontend = NULL; + const char *na = NULL; /* This offset may cause issues if any entries are added to this menu */ unsigned offset = i - 3; @@ -631,13 +648,14 @@ static int action_bind_sublabel_netplay_room( core_ver = netplay_room_list[offset].coreversion; gamecrc = netplay_room_list[offset].gamecrc; frontend = netplay_room_list[offset].frontend; + na = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE); snprintf(s, len, "RetroArch: %s (%s)\nCore: %s (%s)\nGame: %s (%08x)", - string_is_empty(ra_version) ? "n/a" : ra_version, - string_is_empty(frontend) ? "n/a" : frontend, + string_is_empty(ra_version) ? na : ra_version, + string_is_empty(frontend) ? na : frontend, corename, core_ver, - !string_is_equal(gamename, "N/A") ? gamename : "n/a", + !string_is_equal(gamename, na) ? gamename : na, gamecrc); #if 0 strlcpy(s, corename, len); @@ -1277,6 +1295,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_TIMEDATE_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_timedate_enable); break; + case MENU_ENUM_LABEL_TIMEDATE_STYLE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_timedate_style); + break; case MENU_ENUM_LABEL_THUMBNAILS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_thumbnails); break; @@ -1993,6 +2014,17 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_SHOW_WIMP: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_show_wimp); break; +#endif +#ifdef HAVE_LAKKA_SWITCH + case MENU_ENUM_LABEL_SWITCH_CPU_PROFILE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_switch_cpu_profile); + break; + case MENU_ENUM_LABEL_SWITCH_GPU_PROFILE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_switch_gpu_profile); + break; + case MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_switch_backlight_control); + break; #endif case MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_LOAD: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheat_apply_after_load); diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index cf974172f4..e9d53a9b41 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -210,6 +210,12 @@ default_title_copy_macro(action_get_title_cheevos_list, MENU_ENUM_LABE default_title_copy_macro(action_get_title_video_shader_parameters,MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS) default_title_copy_macro(action_get_title_video_shader_preset_parameters,MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS) +#ifdef HAVE_LAKKA_SWITCH +default_title_macro(action_get_title_switch_gpu_profile, MENU_ENUM_LABEL_VALUE_SWITCH_GPU_PROFILE) +default_title_macro(action_get_title_switch_cpu_profile, MENU_ENUM_LABEL_VALUE_SWITCH_CPU_PROFILE) +default_title_macro(action_get_title_switch_backlight_control, MENU_ENUM_LABEL_VALUE_SWITCH_BACKLIGHT_CONTROL) +#endif + static int action_get_title_generic(char *s, size_t len, const char *path, const char *text) { @@ -873,6 +879,17 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_LIBRETRO_INFO_PATH: BIND_ACTION_GET_TITLE(cbs, action_get_title_core_info_directory); break; +#ifdef HAVE_LAKKA_SWITCH + case MENU_ENUM_LABEL_SWITCH_GPU_PROFILE: + BIND_ACTION_GET_TITLE(cbs, action_get_title_switch_gpu_profile); + break; + case MENU_ENUM_LABEL_SWITCH_CPU_PROFILE: + BIND_ACTION_GET_TITLE(cbs, action_get_title_switch_cpu_profile); + break; + case MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL: + BIND_ACTION_GET_TITLE(cbs, action_get_title_switch_backlight_control); + break; +#endif default: return -1; } @@ -1159,6 +1176,17 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_LABEL_LIBRETRO_INFO_PATH: BIND_ACTION_GET_TITLE(cbs, action_get_title_core_info_directory); break; +#ifdef HAVE_LAKKA_SWITCH + case MENU_ENUM_LABEL_SWITCH_GPU_PROFILE: + BIND_ACTION_GET_TITLE(cbs, action_get_title_switch_gpu_profile); + break; + case MENU_ENUM_LABEL_SWITCH_CPU_PROFILE: + BIND_ACTION_GET_TITLE(cbs, action_get_title_switch_cpu_profile); + break; + case MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL: + BIND_ACTION_GET_TITLE(cbs, action_get_title_switch_backlight_control); + break; +#endif default: return -1; } diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index c6eb0a901e..5d09674ade 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -1558,11 +1558,11 @@ static void materialui_frame(void *data, video_frame_info_t *video_info) { int ticker_limit, value_len; char title_buf_msg_tmp[255]; - char title_buf_msg[255]; + char title_buf_msg[640]; title_buf_msg_tmp[0] = title_buf_msg[0] = '\0'; - snprintf(title_buf_msg, sizeof(title_buf), "%s (%s)", + snprintf(title_buf_msg, sizeof(title_buf_msg), "%s (%s)", title_buf, title_msg); value_len = (int)utf8len(title_buf); ticker_limit = (int)((usable_width / mui->glyph_width) - (value_len + 2)); diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index e7d4d982de..346be1ab5d 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -596,7 +596,7 @@ static void rgui_render(void *data, bool is_idle) datetime.s = timedate; datetime.len = sizeof(timedate); - datetime.time_mode = 3; + datetime.time_mode = 4; menu_display_timedate(&datetime); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 6977578495..1f0b9a92d3 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -105,13 +105,8 @@ enum #ifdef HAVE_NETWORKING XMB_TEXTURE_NETPLAY, XMB_TEXTURE_ROOM, - XMB_TEXTURE_IROOM, - XMB_TEXTURE_LANROOM, -#if 0 - /* stub these out until we have the icons */ XMB_TEXTURE_ROOM_LAN, - XMB_TEXTURE_ROOM_MITM, -#endif + XMB_TEXTURE_ROOM_RELAY, #endif #ifdef HAVE_IMAGEVIEWER XMB_TEXTURE_IMAGES, @@ -1086,8 +1081,8 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i) || (string_is_equal(entry.label, "loadstate")) || (string_is_equal(entry.label, "savestate")))) { - size_t path_size = 8024 * sizeof(char); - char *path = (char*)malloc(8204 * sizeof(char)); + size_t path_size = 8204 * sizeof(char); + char *path = (char*)malloc(path_size); global_t *global = global_get_ptr(); path[0] = '\0'; @@ -2391,6 +2386,10 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_SHOW_WIMP: case MENU_ENUM_LABEL_USER_INTERFACE_SETTINGS: return xmb->textures.list[XMB_TEXTURE_UI]; +#ifdef HAVE_LAKKA_SWITCH + case MENU_ENUM_LABEL_SWITCH_GPU_PROFILE: + case MENU_ENUM_LABEL_SWITCH_CPU_PROFILE: +#endif case MENU_ENUM_LABEL_POWER_MANAGEMENT_SETTINGS: return xmb->textures.list[XMB_TEXTURE_POWER]; case MENU_ENUM_LABEL_RETRO_ACHIEVEMENTS_SETTINGS: @@ -2422,9 +2421,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_NETPLAY_ENABLE_CLIENT: return xmb->textures.list[XMB_TEXTURE_ROOM]; case MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS: - return xmb->textures.list[XMB_TEXTURE_IROOM]; - case MENU_ENUM_LABEL_NETPLAY_LAN_SCAN_SETTINGS: - return xmb->textures.list[XMB_TEXTURE_LANROOM]; + return xmb->textures.list[XMB_TEXTURE_RELOAD]; #endif default: break; @@ -2515,11 +2512,11 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, return xmb->textures.list[XMB_TEXTURE_RESUME]; case MENU_SETTING_ACTION_RESUME_ACHIEVEMENTS: return xmb->textures.list[XMB_TEXTURE_RUN]; - case MENU_SETTING_ACTION: - if (xmb->depth == 3) - return xmb->textures.list[XMB_TEXTURE_SUBSETTING]; - return xmb->textures.list[XMB_TEXTURE_SETTING]; + case MENU_SETTING_GROUP: +#ifdef HAVE_LAKKA_SWITCH + case MENU_SET_SWITCH_BRIGHTNESS: +#endif return xmb->textures.list[XMB_TEXTURE_SETTING]; case MENU_INFO_MESSAGE: return xmb->textures.list[XMB_TEXTURE_CORE_INFO]; @@ -2528,14 +2525,16 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, #ifdef HAVE_NETWORKING case MENU_ROOM: return xmb->textures.list[XMB_TEXTURE_ROOM]; -#if 0 - /* stub these out until we have the icons */ case MENU_ROOM_LAN: return xmb->textures.list[XMB_TEXTURE_ROOM_LAN]; - case MENU_ROOM_MITM: - return xmb->textures.list[XMB_TEXTURE_ROOM_MITM]; -#endif + case MENU_ROOM_RELAY: + return xmb->textures.list[XMB_TEXTURE_ROOM_RELAY]; #endif + case MENU_SETTING_ACTION: + if (xmb->depth <= 3) + return xmb->textures.list[XMB_TEXTURE_SETTING]; + default: + return xmb->textures.list[XMB_TEXTURE_SUBSETTING]; } #ifdef HAVE_CHEEVOS @@ -2741,7 +2740,7 @@ static int xmb_draw_item( if (i == current && width > 320 && height > 240 && !string_is_empty(entry->sublabel)) { - char entry_sublabel[255] = {0}; + char entry_sublabel[512] = {0}; label_offset = - xmb->margins_label_top; @@ -3629,7 +3628,7 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) datetime.s = timedate; datetime.len = sizeof(timedate); - datetime.time_mode = 4; + datetime.time_mode = settings->uints.menu_timedate_style; menu_display_timedate(&datetime); @@ -4436,188 +4435,285 @@ static bool xmb_load_image(void *userdata, void *data, enum menu_image_type type static const char *xmb_texture_path(unsigned id) { + char *iconpath = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); + char *icon_name = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); + char *icon_fullpath = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); + + iconpath[0] = icon_name[0] = icon_fullpath[0] = '\0'; + switch (id) { case XMB_TEXTURE_MAIN_MENU: #if defined(HAVE_LAKKA) - return "lakka.png"; + icon_name = "lakka.png"; + break; #else - return "retroarch.png"; + icon_name = "retroarch.png"; + break; #endif case XMB_TEXTURE_SETTINGS: - return "settings.png"; + icon_name = "settings.png"; + break; case XMB_TEXTURE_HISTORY: - return "history.png"; + icon_name = "history.png"; + break; case XMB_TEXTURE_FAVORITES: - return "favorites.png"; + icon_name = "favorites.png"; + break; case XMB_TEXTURE_ADD_FAVORITE: - return "add-favorite.png"; + icon_name = "add-favorite.png"; + break; case XMB_TEXTURE_MUSICS: - return "musics.png"; + icon_name = "musics.png"; + break; #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) case XMB_TEXTURE_MOVIES: - return "movies.png"; + icon_name = "movies.png"; + break; #endif #ifdef HAVE_IMAGEVIEWER case XMB_TEXTURE_IMAGES: - return "images.png"; + icon_name = "images.png"; + break; #endif case XMB_TEXTURE_SETTING: - return "setting.png"; + icon_name = "setting.png"; + break; case XMB_TEXTURE_SUBSETTING: - return "subsetting.png"; + icon_name = "subsetting.png"; + break; case XMB_TEXTURE_ARROW: - return "arrow.png"; + icon_name = "arrow.png"; + break; case XMB_TEXTURE_RUN: - return "run.png"; + icon_name = "run.png"; + break; case XMB_TEXTURE_CLOSE: - return "close.png"; + icon_name = "close.png"; + break; case XMB_TEXTURE_RESUME: - return "resume.png"; + icon_name = "resume.png"; + break; case XMB_TEXTURE_CLOCK: - return "clock.png"; + icon_name = "clock.png"; + break; case XMB_TEXTURE_BATTERY_FULL: - return "battery-full.png"; + icon_name = "battery-full.png"; + break; case XMB_TEXTURE_BATTERY_CHARGING: - return "battery-charging.png"; + icon_name = "battery-charging.png"; + break; case XMB_TEXTURE_POINTER: - return "pointer.png"; + icon_name = "pointer.png"; + break; case XMB_TEXTURE_SAVESTATE: - return "savestate.png"; + icon_name = "savestate.png"; + break; case XMB_TEXTURE_LOADSTATE: - return "loadstate.png"; + icon_name = "loadstate.png"; + break; case XMB_TEXTURE_UNDO: - return "undo.png"; + icon_name = "undo.png"; + break; case XMB_TEXTURE_CORE_INFO: - return "core-infos.png"; + icon_name = "core-infos.png"; + break; case XMB_TEXTURE_WIFI: - return "wifi.png"; + icon_name = "wifi.png"; + break; case XMB_TEXTURE_CORE_OPTIONS: - return "core-options.png"; + icon_name = "core-options.png"; + break; case XMB_TEXTURE_INPUT_REMAPPING_OPTIONS: - return "core-input-remapping-options.png"; + icon_name = "core-input-remapping-options.png"; + break; case XMB_TEXTURE_CHEAT_OPTIONS: - return "core-cheat-options.png"; + icon_name = "core-cheat-options.png"; + break; case XMB_TEXTURE_DISK_OPTIONS: - return "core-disk-options.png"; + icon_name = "core-disk-options.png"; + break; case XMB_TEXTURE_SHADER_OPTIONS: - return "core-shader-options.png"; + icon_name = "core-shader-options.png"; + break; case XMB_TEXTURE_ACHIEVEMENT_LIST: - return "achievement-list.png"; + icon_name = "achievement-list.png"; + break; case XMB_TEXTURE_SCREENSHOT: - return "screenshot.png"; + icon_name = "screenshot.png"; + break; case XMB_TEXTURE_RELOAD: - return "reload.png"; + icon_name = "reload.png"; + break; case XMB_TEXTURE_RENAME: - return "rename.png"; + icon_name = "rename.png"; + break; case XMB_TEXTURE_FILE: - return "file.png"; + icon_name = "file.png"; + break; case XMB_TEXTURE_FOLDER: - return "folder.png"; + icon_name = "folder.png"; + break; case XMB_TEXTURE_ZIP: - return "zip.png"; + icon_name = "zip.png"; + break; case XMB_TEXTURE_MUSIC: - return "music.png"; + icon_name = "music.png"; + break; case XMB_TEXTURE_FAVORITE: - return "favorites-content.png"; + icon_name = "favorites-content.png"; + break; case XMB_TEXTURE_IMAGE: - return "image.png"; + icon_name = "image.png"; + break; case XMB_TEXTURE_MOVIE: - return "movie.png"; + icon_name = "movie.png"; + break; case XMB_TEXTURE_CORE: - return "core.png"; + icon_name = "core.png"; + break; case XMB_TEXTURE_RDB: - return "database.png"; + icon_name = "database.png"; + break; case XMB_TEXTURE_CURSOR: - return "cursor.png"; + icon_name = "cursor.png"; + break; case XMB_TEXTURE_SWITCH_ON: - return "on.png"; + icon_name = "on.png"; + break; case XMB_TEXTURE_SWITCH_OFF: - return "off.png"; + icon_name = "off.png"; + break; case XMB_TEXTURE_ADD: - return "add.png"; + icon_name = "add.png"; + break; #ifdef HAVE_NETWORKING case XMB_TEXTURE_NETPLAY: - return "netplay.png"; + icon_name = "netplay.png"; + break; case XMB_TEXTURE_ROOM: - return "room.png"; - case XMB_TEXTURE_LANROOM: - return "netplay - LAN Room.png"; - case XMB_TEXTURE_IROOM: - return "netplay - iRoom.png"; -#if 0 - /* stub these out until we have the icons */ + icon_name = "menu_room.png"; + break; case XMB_TEXTURE_ROOM_LAN: - return "room_lan.png"; - case XMB_TEXTURE_ROOM_MITM: - return "room_mitm.png"; -#endif + icon_name = "menu_room_lan.png"; + break; + case XMB_TEXTURE_ROOM_RELAY: + icon_name = "menu_room_relay.png"; + break; #endif case XMB_TEXTURE_KEY: - return "key.png"; + icon_name = "key.png"; + break; case XMB_TEXTURE_KEY_HOVER: - return "key-hover.png"; + icon_name = "key-hover.png"; + break; case XMB_TEXTURE_DIALOG_SLICE: - return "dialog-slice.png"; + icon_name = "dialog-slice.png"; + break; case XMB_TEXTURE_ACHIEVEMENTS: - return "menu_achievements.png"; + icon_name = "menu_achievements.png"; + break; case XMB_TEXTURE_AUDIO: - return "menu_audio.png"; + icon_name = "menu_audio.png"; + break; case XMB_TEXTURE_DRIVERS: - return "menu_drivers.png"; + icon_name = "menu_drivers.png"; + break; case XMB_TEXTURE_EXIT: - return "menu_exit.png"; + icon_name = "menu_exit.png"; + break; case XMB_TEXTURE_FRAMESKIP: - return "menu_frameskip.png"; + icon_name = "menu_frameskip.png"; + break; case XMB_TEXTURE_HELP: - return "menu_help.png"; + icon_name = "menu_help.png"; + break; case XMB_TEXTURE_INFO: - return "menu_info.png"; + icon_name = "menu_info.png"; + break; case XMB_TEXTURE_INPUT: - return "Libretro - Pad.png"; + icon_name = "Libretro - Pad.png"; + break; case XMB_TEXTURE_LATENCY: - return "menu_latency.png"; + icon_name = "menu_latency.png"; + break; case XMB_TEXTURE_NETWORK: - return "menu_network.png"; + icon_name = "menu_network.png"; + break; case XMB_TEXTURE_POWER: - return "menu_power.png"; + icon_name = "menu_power.png"; + break; case XMB_TEXTURE_RECORD: - return "menu_record.png"; + icon_name = "menu_record.png"; + break; case XMB_TEXTURE_SAVING: - return "menu_saving.png"; + icon_name = "menu_saving.png"; + break; case XMB_TEXTURE_UPDATER: - return "menu_updater.png"; + icon_name = "menu_updater.png"; + break; case XMB_TEXTURE_VIDEO: - return "menu_video.png"; + icon_name = "menu_video.png"; + break; case XMB_TEXTURE_MIXER: - return "menu_mixer.png"; + icon_name = "menu_mixer.png"; + break; case XMB_TEXTURE_LOG: - return "menu_log.png"; + icon_name = "menu_log.png"; + break; case XMB_TEXTURE_OSD: - return "menu_osd.png"; + icon_name = "menu_osd.png"; + break; case XMB_TEXTURE_UI: - return "menu_ui.png"; + icon_name = "menu_ui.png"; + break; case XMB_TEXTURE_USER: - return "menu_user.png"; + icon_name = "menu_user.png"; + break; case XMB_TEXTURE_PRIVACY: - return "menu_privacy.png"; + icon_name = "menu_privacy.png"; + break; case XMB_TEXTURE_PLAYLIST: - return "menu_playlist.png"; + icon_name = "menu_playlist.png"; + break; case XMB_TEXTURE_QUICKMENU: - return "menu_quickmenu.png"; + icon_name = "menu_quickmenu.png"; + break; case XMB_TEXTURE_REWIND: - return "menu_rewind.png"; + icon_name = "menu_rewind.png"; + break; case XMB_TEXTURE_OVERLAY: - return "menu_overlay.png"; + icon_name = "menu_overlay.png"; + break; case XMB_TEXTURE_OVERRIDE: - return "menu_override.png"; + icon_name = "menu_override.png"; + break; case XMB_TEXTURE_NOTIFICATIONS: - return "menu_notifications.png"; + icon_name = "menu_notifications.png"; + break; case XMB_TEXTURE_STREAM: - return "menu_stream.png"; + icon_name = "menu_stream.png"; + break; } - return NULL; + fill_pathname_application_special(iconpath, + PATH_MAX_LENGTH * sizeof(char), + APPLICATION_SPECIAL_DIRECTORY_ASSETS_XMB_ICONS); + + icon_fullpath = iconpath; + strlcat(icon_fullpath, icon_name, PATH_MAX_LENGTH * sizeof(char)); + + if (!filestream_exists(icon_fullpath)) + { + /* If the icon doesn't exist at least try to return the subsetting icon*/ + if (id == XMB_TEXTURE_DIALOG_SLICE || id == XMB_TEXTURE_KEY_HOVER || id == XMB_TEXTURE_KEY_HOVER) + return NULL; + else + return "subsetting.png"; + } + else + return icon_name; + } static void xmb_context_reset_textures( @@ -5327,6 +5423,17 @@ static int xmb_list_push(void *data, void *userdata, menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); } +#ifdef HAVE_LAKKA_SWITCH + entry.enum_idx = MENU_ENUM_LABEL_SWITCH_CPU_PROFILE; + menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); + + entry.enum_idx = MENU_ENUM_LABEL_SWITCH_GPU_PROFILE; + menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); + + entry.enum_idx = MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL; + menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); +#endif + #ifndef HAVE_DYNAMIC entry.enum_idx = MENU_ENUM_LABEL_RESTART_RETROARCH; menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); @@ -5343,6 +5450,7 @@ static int xmb_list_push(void *data, void *userdata, entry.enum_idx = MENU_ENUM_LABEL_HELP_LIST; menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); } + #if !defined(IOS) if (settings->bools.menu_show_quit_retroarch) { diff --git a/menu/drivers_display/menu_display_caca.c b/menu/drivers_display/menu_display_caca.c index c880c34b33..f70047878b 100644 --- a/menu/drivers_display/menu_display_caca.c +++ b/menu/drivers_display/menu_display_caca.c @@ -100,7 +100,7 @@ menu_display_ctx_driver_t menu_display_ctx_caca = { menu_display_caca_get_default_tex_coords, menu_display_caca_font_init_first, MENU_VIDEO_DRIVER_CACA, - "menu_display_caca", + "caca", false, NULL, NULL diff --git a/menu/drivers_display/menu_display_ctr.c b/menu/drivers_display/menu_display_ctr.c index 693706e0f7..4ce9adc381 100644 --- a/menu/drivers_display/menu_display_ctr.c +++ b/menu/drivers_display/menu_display_ctr.c @@ -210,7 +210,7 @@ menu_display_ctx_driver_t menu_display_ctx_ctr = { menu_display_ctr_get_default_tex_coords, menu_display_ctr_font_init_first, MENU_VIDEO_DRIVER_CTR, - "menu_display_ctr", + "ctr", true, NULL, NULL diff --git a/menu/drivers_display/menu_display_d3d10.c b/menu/drivers_display/menu_display_d3d10.c index 03a18eecc2..1fcf63f0ca 100644 --- a/menu/drivers_display/menu_display_d3d10.c +++ b/menu/drivers_display/menu_display_d3d10.c @@ -288,7 +288,7 @@ menu_display_ctx_driver_t menu_display_ctx_d3d10 = { menu_display_d3d10_get_default_tex_coords, menu_display_d3d10_font_init_first, MENU_VIDEO_DRIVER_DIRECT3D10, - "menu_display_d3d10", + "d3d10", true, NULL, NULL diff --git a/menu/drivers_display/menu_display_d3d11.c b/menu/drivers_display/menu_display_d3d11.c index 95369fe9cb..8d8ceb5f2d 100644 --- a/menu/drivers_display/menu_display_d3d11.c +++ b/menu/drivers_display/menu_display_d3d11.c @@ -287,7 +287,7 @@ menu_display_ctx_driver_t menu_display_ctx_d3d11 = { menu_display_d3d11_get_default_tex_coords, menu_display_d3d11_font_init_first, MENU_VIDEO_DRIVER_DIRECT3D11, - "menu_display_d3d11", + "d3d11", true, NULL, NULL diff --git a/menu/drivers_display/menu_display_d3d12.c b/menu/drivers_display/menu_display_d3d12.c index 7225089c56..75c0650e75 100644 --- a/menu/drivers_display/menu_display_d3d12.c +++ b/menu/drivers_display/menu_display_d3d12.c @@ -308,7 +308,7 @@ menu_display_ctx_driver_t menu_display_ctx_d3d12 = { menu_display_d3d12_get_default_tex_coords, menu_display_d3d12_font_init_first, MENU_VIDEO_DRIVER_DIRECT3D12, - "menu_display_d3d12", + "d3d12", true, NULL, NULL diff --git a/menu/drivers_display/menu_display_d3d8.c b/menu/drivers_display/menu_display_d3d8.c index a18907f443..c2268c5111 100644 --- a/menu/drivers_display/menu_display_d3d8.c +++ b/menu/drivers_display/menu_display_d3d8.c @@ -285,7 +285,7 @@ menu_display_ctx_driver_t menu_display_ctx_d3d8 = { menu_display_d3d8_get_default_tex_coords, menu_display_d3d8_font_init_first, MENU_VIDEO_DRIVER_DIRECT3D8, - "menu_display_d3d8", + "d3d8", false, NULL, NULL diff --git a/menu/drivers_display/menu_display_d3d9.c b/menu/drivers_display/menu_display_d3d9.c index e6e3aa7b76..4fe2155e61 100644 --- a/menu/drivers_display/menu_display_d3d9.c +++ b/menu/drivers_display/menu_display_d3d9.c @@ -322,7 +322,7 @@ menu_display_ctx_driver_t menu_display_ctx_d3d9 = { menu_display_d3d9_get_default_tex_coords, menu_display_d3d9_font_init_first, MENU_VIDEO_DRIVER_DIRECT3D9, - "menu_display_d3d9", + "d3d9", false, NULL, NULL diff --git a/menu/drivers_display/menu_display_gdi.c b/menu/drivers_display/menu_display_gdi.c index 95e41b7b28..5fa746fb06 100644 --- a/menu/drivers_display/menu_display_gdi.c +++ b/menu/drivers_display/menu_display_gdi.c @@ -109,7 +109,7 @@ menu_display_ctx_driver_t menu_display_ctx_gdi = { menu_display_gdi_get_default_tex_coords, menu_display_gdi_font_init_first, MENU_VIDEO_DRIVER_GDI, - "menu_display_gdi", + "gdi", false, NULL, NULL diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index 6cf546f5e1..3c5664bae6 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -275,7 +275,7 @@ menu_display_ctx_driver_t menu_display_ctx_gl = { menu_display_gl_get_default_tex_coords, menu_display_gl_font_init_first, MENU_VIDEO_DRIVER_OPENGL, - "menu_display_gl", + "gl", false, menu_display_gl_scissor_begin, menu_display_gl_scissor_end diff --git a/menu/drivers_display/menu_display_null.c b/menu/drivers_display/menu_display_null.c index 8bda4a3eef..e8e3ad8faa 100644 --- a/menu/drivers_display/menu_display_null.c +++ b/menu/drivers_display/menu_display_null.c @@ -95,7 +95,7 @@ menu_display_ctx_driver_t menu_display_ctx_null = { menu_display_null_get_default_tex_coords, menu_display_null_font_init_first, MENU_VIDEO_DRIVER_GENERIC, - "menu_display_null", + "null", false, NULL, NULL diff --git a/menu/drivers_display/menu_display_sixel.c b/menu/drivers_display/menu_display_sixel.c index 734b36e972..023365b048 100644 --- a/menu/drivers_display/menu_display_sixel.c +++ b/menu/drivers_display/menu_display_sixel.c @@ -102,7 +102,7 @@ menu_display_ctx_driver_t menu_display_ctx_sixel = { menu_display_sixel_get_default_tex_coords, menu_display_sixel_font_init_first, MENU_VIDEO_DRIVER_SIXEL, - "menu_display_sixel", + "sixel", false, NULL, NULL diff --git a/menu/drivers_display/menu_display_switch.c b/menu/drivers_display/menu_display_switch.c index b2fb6ca805..8c21577eac 100644 --- a/menu/drivers_display/menu_display_switch.c +++ b/menu/drivers_display/menu_display_switch.c @@ -99,7 +99,7 @@ menu_display_ctx_driver_t menu_display_ctx_switch = { menu_display_switch_get_default_tex_coords, menu_display_switch_font_init_first, MENU_VIDEO_DRIVER_SWITCH, - "menu_display_switch", + "switch", false, NULL, NULL diff --git a/menu/drivers_display/menu_display_vulkan.c b/menu/drivers_display/menu_display_vulkan.c index dd060dd2a1..261037aa2c 100644 --- a/menu/drivers_display/menu_display_vulkan.c +++ b/menu/drivers_display/menu_display_vulkan.c @@ -386,7 +386,7 @@ menu_display_ctx_driver_t menu_display_ctx_vulkan = { menu_display_vk_get_default_tex_coords, menu_display_vk_font_init_first, MENU_VIDEO_DRIVER_VULKAN, - "menu_display_vulkan", + "vulkan", false, menu_display_vk_scissor_begin, menu_display_vk_scissor_end diff --git a/menu/drivers_display/menu_display_wiiu.c b/menu/drivers_display/menu_display_wiiu.c index 9d6ce0794b..42f0c300cf 100644 --- a/menu/drivers_display/menu_display_wiiu.c +++ b/menu/drivers_display/menu_display_wiiu.c @@ -352,7 +352,7 @@ menu_display_ctx_driver_t menu_display_ctx_wiiu = { menu_display_wiiu_get_default_tex_coords, menu_display_wiiu_font_init_first, MENU_VIDEO_DRIVER_WIIU, - "menu_display_wiiu", + "gx2", true, menu_display_wiiu_scissor_begin, menu_display_wiiu_scissor_end diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index f684739444..96b64a43a2 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -47,6 +47,10 @@ #include "../network/netplay/netplay_discovery.h" #endif +#ifdef HAVE_LAKKA_SWITCH +#include "../../lakka.h" +#endif + #if defined(__linux__) || (defined(BSD) && !defined(__MACH__)) #include "../frontend/drivers/platform_unix.h" #endif @@ -291,7 +295,6 @@ static int menu_displaylist_parse_core_info(menu_displaylist_info_t *info) core_info_ctx_firmware_t firmware_info; bool update_missing_firmware = false; bool set_missing_firmware = false; - settings_t *settings = config_get_ptr(); firmware_info.path = core_info->path; firmware_info.directory.system = settings->paths.directory_system; @@ -1286,7 +1289,7 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, if (!string_is_empty(info->path)) { size_t lpl_basename_size = PATH_MAX_LENGTH * sizeof(char); - char *lpl_basename = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + char *lpl_basename = (char*)malloc(lpl_basename_size); lpl_basename[0] = '\0'; fill_pathname_base_noext(lpl_basename, info->path, lpl_basename_size); @@ -1299,9 +1302,9 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, for (i = 0; i < list_size; i++) { - char *path_copy = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - char *fill_buf = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); size_t path_size = PATH_MAX_LENGTH * sizeof(char); + char *path_copy = (char*)malloc(path_size); + char *fill_buf = (char*)malloc(path_size); const char *core_name = NULL; const char *path = NULL; const char *label = NULL; @@ -1334,9 +1337,10 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, if (path) { - char *path_short = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + size_t path_size = PATH_MAX_LENGTH * sizeof(char); + char *path_short = (char*)malloc(path_size); - path_short[0] = '\0'; + path_short[0] = '\0'; fill_short_pathname_representation(path_short, path, path_size); @@ -1349,10 +1353,9 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, if (!string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) { - char *tmp = (char*) - malloc(PATH_MAX_LENGTH * sizeof(char)); + char *tmp = (char*)malloc(path_size); - tmp[0] = '\0'; + tmp[0] = '\0'; snprintf(tmp, path_size, " (%s)", core_name); strlcat(fill_buf, tmp, path_size); @@ -1483,12 +1486,13 @@ static int create_string_list_rdb_entry_string( char *output_label = NULL; int str_len = 0; struct string_list *str_list = string_list_new(); + size_t path_size = PATH_MAX_LENGTH * sizeof(char); if (!str_list) return -1; attr.i = 0; - tmp = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + tmp = (char*)malloc(path_size); tmp[0] = '\0'; str_len += strlen(label) + 1; @@ -1512,8 +1516,7 @@ static int create_string_list_rdb_entry_string( string_list_join_concat(output_label, str_len, str_list, "|"); fill_pathname_join_concat_noext(tmp, desc, ": ", - actual_string, - PATH_MAX_LENGTH * sizeof(char)); + actual_string, path_size); menu_entries_append_enum(list, tmp, output_label, enum_idx, 0, 0, 0); @@ -1544,8 +1547,8 @@ static int create_string_list_rdb_entry_int( goto error; attr.i = 0; - tmp = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - str = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + tmp = (char*)malloc(path_size); + str = (char*)malloc(path_size); tmp[0] = str[0] = '\0'; str_len += strlen(label) + 1; @@ -1651,10 +1654,12 @@ static int menu_displaylist_parse_database_entry(menu_handle_t *menu, snprintf(crc_str, sizeof(crc_str), "%08X", db_info_entry->crc32); if (!string_is_empty(db_info_entry->name)) - strlcpy(thumbnail_content, db_info_entry->name, sizeof(thumbnail_content)); + strlcpy(thumbnail_content, db_info_entry->name, + sizeof(thumbnail_content)); if (!string_is_empty(thumbnail_content)) - menu_driver_set_thumbnail_content(thumbnail_content, sizeof(thumbnail_content)); + menu_driver_set_thumbnail_content(thumbnail_content, + sizeof(thumbnail_content)); menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_PATH, NULL); menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE, NULL); @@ -3741,19 +3746,16 @@ static unsigned menu_displaylist_parse_cores( if (type == FILE_TYPE_CORE) { - char *core_path = (char*) - malloc(PATH_MAX_LENGTH * sizeof(char)); - char *display_name = (char*) - malloc(PATH_MAX_LENGTH * sizeof(char)); + size_t path_size = PATH_MAX_LENGTH * sizeof(char); + char *core_path = (char*)malloc(path_size); + char *display_name = (char*)malloc(path_size); core_path[0] = display_name[0] = '\0'; - fill_pathname_join(core_path, dir, path, - PATH_MAX_LENGTH * sizeof(char)); + fill_pathname_join(core_path, dir, path, path_size); if (core_info_list_get_display_name(list, - core_path, display_name, - PATH_MAX_LENGTH * sizeof(char))) + core_path, display_name, path_size)) file_list_set_alt_at_offset(info->list, i, display_name); free(core_path); @@ -4274,6 +4276,125 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) switch (type) { +#ifdef HAVE_LAKKA_SWITCH + case DISPLAYLIST_SWITCH_CPU_PROFILE: + { + unsigned i; + char text[PATH_MAX_LENGTH]; + char current_profile[PATH_MAX_LENGTH]; + FILE *profile = NULL; + const size_t profiles_count = sizeof(SWITCH_CPU_PROFILES)/sizeof(SWITCH_CPU_PROFILES[1]); + + runloop_msg_queue_push("Warning : extented overclocking can damage the Switch", 1, 90, true); + + profile = popen("cpu-profile get", "r"); + fgets(current_profile, PATH_MAX_LENGTH, profile); + pclose(profile); + + menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); + + snprintf(text, sizeof(text), + "Current profile : %s", current_profile); + + menu_entries_append_enum(info->list, + text, + "", + 0, + MENU_INFO_MESSAGE, 0, 0); + + for (i = 0; i < profiles_count; i++) + { + char* profile = SWITCH_CPU_PROFILES[i]; + char* speed = SWITCH_CPU_SPEEDS[i]; + + char title[PATH_MAX_LENGTH] = {0}; + + snprintf(title, sizeof(title), "%s (%s)", profile, speed); + + menu_entries_append_enum(info->list, + title, + "", + 0, MENU_SET_SWITCH_CPU_PROFILE, 0, i); + + } + + info->need_push = true; + info->need_refresh = true; + info->need_clear = true; + + break; + } + case DISPLAYLIST_SWITCH_GPU_PROFILE: + { + unsigned i; + char text[PATH_MAX_LENGTH]; + char current_profile[PATH_MAX_LENGTH]; + FILE *profile = NULL; + const size_t profiles_count = sizeof(SWITCH_GPU_PROFILES)/sizeof(SWITCH_GPU_PROFILES[1]); + + runloop_msg_queue_push("Warning : extented overclocking can damage the Switch", 1, 90, true); + + profile = popen("gpu-profile get", "r"); + fgets(current_profile, PATH_MAX_LENGTH, profile); + pclose(profile); + + menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); + + snprintf(text, sizeof(text), "Current profile : %s", current_profile); + + menu_entries_append_enum(info->list, + text, + "", + 0, + MENU_INFO_MESSAGE, 0, 0); + + + for (i = 0; i < profiles_count; i++) + { + char* profile = SWITCH_GPU_PROFILES[i]; + char* speed = SWITCH_GPU_SPEEDS[i]; + char title[PATH_MAX_LENGTH] = {0}; + + snprintf(title, sizeof(title), "%s (%s)", profile, speed); + + menu_entries_append_enum(info->list, + title, + "", + 0, MENU_SET_SWITCH_GPU_PROFILE, 0, i); + } + + info->need_push = true; + info->need_refresh = true; + info->need_clear = true; + + break; + } + case DISPLAYLIST_SWITCH_BACKLIGHT_CONTROL: + { + unsigned i; + const size_t brightness_count = sizeof(SWITCH_BRIGHTNESS)/sizeof(SWITCH_BRIGHTNESS[1]); + + menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); + + for (i = 0; i < brightness_count; i++) + { + char title[PATH_MAX_LENGTH] = {0}; + + snprintf(title, sizeof(title), "Set to %d%%", SWITCH_BRIGHTNESS[i]); + + menu_entries_append_enum(info->list, + title, + "", + 0, MENU_SET_SWITCH_BRIGHTNESS, 0, i); + } + + info->need_push = true; + info->need_refresh = true; + info->need_clear = true; + + break; + } +#endif case DISPLAYLIST_MUSIC_LIST: { char combined_path[PATH_MAX_LENGTH]; @@ -5658,6 +5779,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_TIMEDATE_ENABLE, PARSE_ONLY_BOOL, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_TIMEDATE_STYLE, + PARSE_ONLY_UINT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_BATTERY_LEVEL_ENABLE, PARSE_ONLY_BOOL, false); @@ -7186,9 +7310,10 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) if (!string_is_empty(system->info.library_name) && !string_is_equal(system->info.library_name, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_CORE))) - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CONTENT_SETTINGS, - PARSE_ACTION, false); + if (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_CONTENT_SETTINGS, + PARSE_ACTION, false); if (system->load_no_content) menu_displaylist_parse_settings_enum(menu, info, @@ -7245,6 +7370,15 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_QUIT_RETROARCH, PARSE_ACTION, false); +#ifdef HAVE_LAKKA_SWITCH + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_SWITCH_GPU_PROFILE, + PARSE_ACTION, false); + + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL, + PARSE_ACTION, false); +#endif if (settings->bools.menu_show_reboot) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_REBOOT, diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index d87c804527..5c1ff8abaa 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -179,6 +179,11 @@ enum menu_displaylist_ctl_state DISPLAYLIST_CORE_CONTENT, DISPLAYLIST_CORE_CONTENT_DIRS, DISPLAYLIST_CORE_CONTENT_DIRS_SUBDIR, +#ifdef HAVE_LAKKA_SWITCH + DISPLAYLIST_SWITCH_GPU_PROFILE, + DISPLAYLIST_SWITCH_BACKLIGHT_CONTROL, + DISPLAYLIST_SWITCH_CPU_PROFILE, +#endif DISPLAYLIST_PENDING_CLEAR }; diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 4bae4f41b1..0ec43c8325 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -17,13 +17,14 @@ #include #include - +#include #include #include #include #include #include #include +#include #ifdef WIIU #include @@ -346,28 +347,58 @@ void menu_display_timedate(menu_display_ctx_datetime_t *datetime) time(&time_); + setlocale(LC_TIME, ""); + switch (datetime->time_mode) { case 0: /* Date and time */ strftime(datetime->s, datetime->len, "%Y-%m-%d %H:%M:%S", localtime(&time_)); break; - case 1: /* Date */ + case 1: /* YY-MM-DD HH:MM */ strftime(datetime->s, datetime->len, - "%Y-%m-%d", localtime(&time_)); + "%Y-%m-%d %H:%M", localtime(&time_)); break; - case 2: /* Time */ + case 2: /* MM-DD-YYYY HH:MM */ + strftime(datetime->s, datetime->len, + "%m-%d-%Y %H:%M", localtime(&time_)); + break; + case 3: /* Time */ strftime(datetime->s, datetime->len, "%H:%M:%S", localtime(&time_)); break; - case 3: /* Time (hours-minutes) */ + case 4: /* Time (hours-minutes) */ strftime(datetime->s, datetime->len, "%H:%M", localtime(&time_)); break; - case 4: /* Date and time, without year and seconds */ + case 5: /* Date and time, without year and seconds */ strftime(datetime->s, datetime->len, "%d/%m %H:%M", localtime(&time_)); break; + case 6: + strftime(datetime->s, datetime->len, + "%m/%d %H:%M", localtime(&time_)); + break; + case 7: /* Time (hours-minutes), in 12 hour AM-PM designation */ +#if defined(__linux__) && !defined(ANDROID) + strftime(datetime->s, datetime->len, + "%r", localtime(&time_)); +#else + { + char *local; + + strftime(datetime->s, datetime->len, + + "%I:%M:%S %p", localtime(&time_)); + local = local_to_utf8_string_alloc(datetime->s); + + if (local) + { + strlcpy(datetime->s, local, datetime->len); + free(local); + } + } +#endif } } @@ -634,6 +665,18 @@ float menu_display_get_dpi(void) return dpi; } +bool menu_display_driver_exists(const char *s) +{ + unsigned i; + for (i = 0; i < ARRAY_SIZE(menu_display_ctx_drivers); i++) + { + if (string_is_equal(s, menu_display_ctx_drivers[i]->ident)) + return true; + } + + return false; +} + bool menu_display_init_first_driver(bool video_is_threaded) { unsigned i; diff --git a/menu/menu_driver.h b/menu/menu_driver.h index d103367302..0110f9ef21 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -171,10 +171,8 @@ enum menu_settings_type MENU_SETTING_ACTION_RESUME_ACHIEVEMENTS, MENU_WIFI, MENU_ROOM, -/* MENU_ROOM_LAN, - MENU_ROOM_MITM, -*/ + MENU_ROOM_RELAY, MENU_NETPLAY_LAN_SCAN, MENU_INFO_MESSAGE, MENU_SETTINGS_SHADER_PARAMETER_0, @@ -233,6 +231,13 @@ enum menu_settings_type MENU_SETTINGS_SUBSYSTEM_ADD, MENU_SETTINGS_SUBSYSTEM_LAST = MENU_SETTINGS_SUBSYSTEM_ADD + RARCH_MAX_SUBSYSTEMS, MENU_SETTINGS_CHEAT_MATCH, + +#ifdef HAVE_LAKKA_SWITCH + MENU_SET_SWITCH_GPU_PROFILE, + MENU_SET_SWITCH_BRIGHTNESS, + MENU_SET_SWITCH_CPU_PROFILE, +#endif + MENU_SETTINGS_LAST }; @@ -817,6 +822,8 @@ void menu_display_reset_textures_list( int menu_display_osk_ptr_at_pos(void *data, int x, int y, unsigned width, unsigned height); +bool menu_display_driver_exists(const char *s); + void menu_driver_destroy(void); extern uintptr_t menu_display_white_texture; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 7c5dff5bf6..fbf57eab1b 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -505,6 +505,56 @@ static void setting_get_string_representation_uint_menu_left_thumbnails( } } +static void setting_get_string_representation_uint_menu_timedate_style( + rarch_setting_t *setting, + char *s, size_t len) +{ + if (!setting) + return; + + switch (*setting->value.target.unsigned_integer) + { + case 0: + strlcpy(s, msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_YMD_HMS), len); + break; + case 1: + strlcpy(s, msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_YMD_HM), len); + break; + case 2: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_MDYYYY), len); + break; + case 3: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_HMS), len); + break; + case 4: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_HM), len); + break; + case 5: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_DM_HM), len); + break; + case 6: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_MD_HM), len); + break; + case 7: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_AM_PM), len); + break; + } +} + static void setting_get_string_representation_uint_xmb_icon_theme( rarch_setting_t *setting, char *s, size_t len) @@ -3641,6 +3691,31 @@ static bool setting_append_list( #endif #if defined(HAVE_LAKKA) +#ifdef HAVE_LAKKA_SWITCH + CONFIG_ACTION( + list, list_info, + MENU_ENUM_LABEL_SWITCH_CPU_PROFILE, + MENU_ENUM_LABEL_VALUE_SWITCH_CPU_PROFILE, + &group_info, + &subgroup_info, + parent_group); + + CONFIG_ACTION( + list, list_info, + MENU_ENUM_LABEL_SWITCH_GPU_PROFILE, + MENU_ENUM_LABEL_VALUE_SWITCH_GPU_PROFILE, + &group_info, + &subgroup_info, + parent_group); + + CONFIG_ACTION( + list, list_info, + MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL, + MENU_ENUM_LABEL_VALUE_SWITCH_BACKLIGHT_CONTROL, + &group_info, + &subgroup_info, + parent_group); +#endif CONFIG_ACTION( list, list_info, MENU_ENUM_LABEL_REBOOT, @@ -8292,6 +8367,21 @@ static bool setting_append_list( general_read_handler, SD_FLAG_ADVANCED); + CONFIG_UINT(list, list_info, + &settings->uints.menu_timedate_style, + MENU_ENUM_LABEL_TIMEDATE_STYLE, + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE, + menu_timedate_style, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_uint_menu_timedate_style; + menu_settings_list_current_add_range(list, list_info, 0, 7, 1, true, true); + CONFIG_BOOL( list, list_info, &settings->bools.menu_battery_level_enable, diff --git a/menu/menu_shader.c b/menu/menu_shader.c index 379be3709e..1dbb2aaf71 100644 --- a/menu/menu_shader.c +++ b/menu/menu_shader.c @@ -80,7 +80,6 @@ bool menu_shader_manager_init(void) { bool is_preset = false; config_file_t *conf = NULL; - settings_t *settings = config_get_ptr(); char *new_path = NULL; const char *path_shader = retroarch_get_shader_preset(); enum rarch_shader_type type = RARCH_SHADER_NONE; @@ -112,6 +111,7 @@ bool menu_shader_manager_init(void) else { char preset_path[PATH_MAX_LENGTH]; + settings_t *settings = config_get_ptr(); const char *shader_dir = *settings->paths.directory_video_shader ? settings->paths.directory_video_shader : diff --git a/menu/widgets/menu_dialog.c b/menu/widgets/menu_dialog.c index 4157e31502..6b52a313f8 100644 --- a/menu/widgets/menu_dialog.c +++ b/menu/widgets/menu_dialog.c @@ -48,7 +48,6 @@ int menu_dialog_iterate(char *s, size_t len, const char *label) cheevos_ctx_desc_t desc_info; #endif bool do_exit = false; - settings_t *settings = config_get_ptr(); switch (menu_dialog_current_type) { @@ -204,13 +203,16 @@ int menu_dialog_iterate(char *s, size_t len, const char *label) s, len); break; case MENU_DIALOG_HELP_EXTRACT: - menu_hash_get_help_enum(MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT, - s, len); - - if (settings->bools.bundle_finished) { - settings->bools.bundle_finished = false; - do_exit = true; + settings_t *settings = config_get_ptr(); + menu_hash_get_help_enum(MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT, + s, len); + + if (settings->bools.bundle_finished) + { + settings->bools.bundle_finished = false; + do_exit = true; + } } break; case MENU_DIALOG_QUIT_CONFIRM: diff --git a/menu/widgets/menu_entry.c b/menu/widgets/menu_entry.c index a5e83ab32f..276c37139e 100644 --- a/menu/widgets/menu_entry.c +++ b/menu/widgets/menu_entry.c @@ -364,7 +364,7 @@ void menu_entry_get(menu_entry_t *entry, size_t stack_idx, if (cbs->action_sublabel) { - char tmp[255]; + char tmp[512]; tmp[0] = '\0'; cbs->action_sublabel(list, diff --git a/midi/drivers/alsa_midi.c b/midi/drivers/alsa_midi.c new file mode 100644 index 0000000000..671434967e --- /dev/null +++ b/midi/drivers/alsa_midi.c @@ -0,0 +1,484 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2018 The RetroArch team + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include + +#include +#include +#include +#include + +#include "../midi_driver.h" + +typedef struct +{ + snd_seq_t *seq; + snd_seq_addr_t in; + snd_seq_addr_t in_dest; + snd_seq_addr_t out; + snd_seq_addr_t out_src; + int out_queue; + snd_seq_real_time_t out_ev_time; /* time of the last output event */ +} alsa_midi_t; + +static const snd_seq_event_type_t alsa_midi_ev_map[8] = +{ + SND_SEQ_EVENT_NOTEOFF, + SND_SEQ_EVENT_NOTEON, + SND_SEQ_EVENT_KEYPRESS, + SND_SEQ_EVENT_CONTROLLER, + SND_SEQ_EVENT_PGMCHANGE, + SND_SEQ_EVENT_CHANPRESS, + SND_SEQ_EVENT_PITCHBEND, + SND_SEQ_EVENT_SYSEX +}; + +static bool alsa_midi_get_avail_ports(struct string_list *ports, unsigned caps) +{ + int r; + snd_seq_t *seq; + snd_seq_client_info_t *client_info; + snd_seq_port_info_t *port_info; + union string_list_elem_attr attr = {0}; + + snd_seq_client_info_alloca(&client_info); + snd_seq_port_info_alloca(&port_info); + + r = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK); + if (r < 0) + { + RARCH_ERR("[MIDI]: snd_seq_open failed with error %d.\n", r); + return false; + } + + snd_seq_client_info_set_client(client_info, -1); + + while (snd_seq_query_next_client(seq, client_info) == 0) + { + int client = snd_seq_client_info_get_client(client_info); + + snd_seq_port_info_set_client(port_info, client); + snd_seq_port_info_set_port(port_info, -1); + + while (snd_seq_query_next_port(seq, port_info) == 0) + { + unsigned port_caps = snd_seq_port_info_get_capability(port_info); + unsigned port_type = snd_seq_port_info_get_type(port_info); + + if ((port_type & SND_SEQ_PORT_TYPE_MIDI_GENERIC) && + (port_caps & caps) == caps) + { + const char *port_name = snd_seq_port_info_get_name(port_info); + + if (!string_list_append(ports, port_name, attr)) + { + RARCH_ERR("[MIDI]: string_list_append failed.\n"); + snd_seq_close(seq); + + return false; + } + } + } + } + + snd_seq_close(seq); + + return true; +} + +static bool alsa_midi_get_port(snd_seq_t *seq, const char *name, unsigned caps, + snd_seq_addr_t *addr) +{ + snd_seq_client_info_t *client_info; + snd_seq_port_info_t *port_info; + + snd_seq_client_info_alloca(&client_info); + snd_seq_port_info_alloca(&port_info); + + snd_seq_client_info_set_client(client_info, -1); + while (snd_seq_query_next_client(seq, client_info) == 0) + { + int client_id = snd_seq_client_info_get_client(client_info); + + snd_seq_port_info_set_client(port_info, client_id); + snd_seq_port_info_set_port(port_info, -1); + + while (snd_seq_query_next_port(seq, port_info) == 0) + { + unsigned port_caps = snd_seq_port_info_get_capability(port_info); + unsigned type = snd_seq_port_info_get_type(port_info); + + if ((type & SND_SEQ_PORT_TYPE_MIDI_GENERIC) && (port_caps & caps) == caps) + { + const char *port_name = snd_seq_port_info_get_name(port_info); + + if (string_is_equal(port_name, name)) + { + addr->client = client_id; + addr->port = snd_seq_port_info_get_port(port_info); + + return true; + } + } + } + } + + return false; +} + +static bool alsa_midi_get_avail_inputs(struct string_list *inputs) +{ + return alsa_midi_get_avail_ports(inputs, SND_SEQ_PORT_CAP_READ | + SND_SEQ_PORT_CAP_SUBS_READ); +} + +static bool alsa_midi_get_avail_outputs(struct string_list *outputs) +{ + return alsa_midi_get_avail_ports(outputs, SND_SEQ_PORT_CAP_WRITE | + SND_SEQ_PORT_CAP_SUBS_WRITE); +} + +static void alsa_midi_free(void *p) +{ + alsa_midi_t *d = (alsa_midi_t*)p; + + if (d) + { + if (d->seq) + snd_seq_close(d->seq); + free(d); + } +} + +static bool alsa_midi_set_input(void *p, const char *input) +{ + int r; + snd_seq_port_subscribe_t *sub; + alsa_midi_t *d = (alsa_midi_t*)p; + + if (!input) + { + if (d->in_dest.port >= 0) + { + snd_seq_delete_simple_port(d->seq, d->in_dest.port); + d->in_dest.port = -1; + } + + return true; + } + + if (!alsa_midi_get_port(d->seq, input, SND_SEQ_PORT_CAP_READ | + SND_SEQ_PORT_CAP_SUBS_READ, &d->in)) + return false; + + r = snd_seq_create_simple_port(d->seq, "in", SND_SEQ_PORT_CAP_WRITE | + SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_APPLICATION); + if (r < 0) + { + RARCH_ERR("[MIDI]: snd_seq_create_simple_port failed with error %d.\n", r); + return false; + } + + d->in_dest.client = snd_seq_client_id(d->seq); + d->in_dest.port = r; + + snd_seq_port_subscribe_alloca(&sub); + snd_seq_port_subscribe_set_sender(sub, &d->in); + snd_seq_port_subscribe_set_dest(sub, &d->in_dest); + r = snd_seq_subscribe_port(d->seq, sub); + if (r < 0) + RARCH_ERR("[MIDI]: snd_seq_subscribe_port failed with error %d.\n", r); + + return r >= 0; +} + +static bool alsa_midi_set_output(void *p, const char *output) +{ + int r; + alsa_midi_t *d = (alsa_midi_t*)p; + + if (!output) + { + if (d->out_queue >= 0) + { + snd_seq_stop_queue(d->seq, d->out_queue, NULL); + snd_seq_free_queue(d->seq, d->out_queue); + d->out_queue = -1; + } + if (d->out_src.port >= 0) + { + snd_seq_delete_simple_port(d->seq, d->out_src.port); + d->out_src.port = -1; + } + + return true; + } + + if (!alsa_midi_get_port(d->seq, output, SND_SEQ_PORT_CAP_WRITE | + SND_SEQ_PORT_CAP_SUBS_WRITE, &d->out)) + return false; + + r = snd_seq_create_simple_port(d->seq, "out", SND_SEQ_PORT_CAP_READ | + SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_APPLICATION); + if (r < 0) + { + RARCH_ERR("[MIDI]: snd_seq_create_simple_port failed with error %d.\n", r); + return false; + } + + d->out_src.client = snd_seq_client_id(d->seq); + d->out_src.port = r; + + r = snd_seq_connect_to(d->seq, d->out_src.port, d->out.client, d->out.port); + if (r < 0) + { + RARCH_ERR("[MIDI]: snd_seq_connect_to failed with error %d.\n", r); + return false; + } + + d->out_queue = snd_seq_alloc_queue(d->seq); + if (d->out_queue < 0) + { + RARCH_ERR("[MIDI]: snd_seq_alloc_queue failed with error %d.\n", d->out_queue); + return false; + } + + r = snd_seq_start_queue(d->seq, d->out_queue, NULL); + if (r < 0) + { + RARCH_ERR("[MIDI]: snd_seq_start_queue failed with error %d.\n", r); + return false; + } + + return true; +} + +static void *alsa_midi_init(const char *input, const char *output) +{ + int r; + bool err = false; + alsa_midi_t *d = (alsa_midi_t*)calloc(sizeof(alsa_midi_t), 1); + + if (!d) + { + RARCH_ERR("[MIDI]: Out of memory.\n"); + return NULL; + } + + d->in_dest.port = -1; + d->out_src.port = -1; + d->out_queue = -1; + + r = snd_seq_open(&d->seq, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK); + if (r < 0) + { + RARCH_ERR("[MIDI]: snd_seq_open failed with error %d.\n", r); + err = true; + } + else if (!alsa_midi_set_input(d, input)) + err = true; + else if (!alsa_midi_set_output(d, output)) + err = true; + + if (err) + { + alsa_midi_free(d); + d = NULL; + } + + return d; +} + +static bool alsa_midi_read(void *p, midi_event_t *event) +{ + int r; + snd_seq_event_t *ev; + alsa_midi_t *d = (alsa_midi_t*)p; + + r = snd_seq_event_input(d->seq, &ev); + if (r < 0) + { +#ifdef DEBUG + if (r != -EAGAIN) + RARCH_ERR("[MIDI]: snd_seq_event_input failed with error %d.\n", r); +#endif + return false; + } + + if (ev->type == SND_SEQ_EVENT_NOTEOFF) + { + event->data[0] = 0x80 | ev->data.note.channel; + event->data[1] = ev->data.note.note; + event->data[2] = ev->data.note.velocity; + event->data_size = 3; + } + else if (ev->type == SND_SEQ_EVENT_NOTEON) + { + event->data[0] = 0x90 | ev->data.note.channel; + event->data[1] = ev->data.note.note; + event->data[2] = ev->data.note.velocity; + event->data_size = 3; + } + else if (ev->type == SND_SEQ_EVENT_KEYPRESS) + { + event->data[0] = 0xA0 | ev->data.note.channel; + event->data[1] = ev->data.note.note; + event->data[2] = ev->data.note.velocity; + event->data_size = 3; + } + else if (ev->type == SND_SEQ_EVENT_CONTROLLER) + { + event->data[0] = 0xB0 | ev->data.control.channel; + event->data[1] = ev->data.control.param; + event->data[2] = ev->data.control.value; + event->data_size = 3; + } + else if (ev->type == SND_SEQ_EVENT_PGMCHANGE) + { + event->data[0] = 0xC0 | ev->data.control.channel; + event->data[1] = ev->data.control.value; + event->data_size = 2; + } + else if (ev->type == SND_SEQ_EVENT_CHANPRESS) + { + event->data[0] = 0xD0 | ev->data.control.channel; + event->data[1] = ev->data.control.value; + event->data_size = 2; + } + else if (ev->type == SND_SEQ_EVENT_PITCHBEND) + { + event->data[0] = 0xE0 | ev->data.control.channel; + event->data[1] = ev->data.control.value & 127; + event->data[2] = ev->data.control.value >> 7; + event->data_size = 3; + } + else if (ev->type == SND_SEQ_EVENT_SYSEX) + { + if (ev->data.ext.len <= event->data_size) + { + size_t i; + uint8_t *ev_data = (uint8_t*)ev->data.ext.ptr; + + for (i = 0; i < ev->data.ext.len; ++i) + event->data[i] = ev_data[i]; + + event->data_size = ev->data.ext.len; + } +#ifdef DEBUG + else + { + RARCH_ERR("[MIDI]: SysEx event too big.\n"); + r = -1; + } +#endif + } + else + r = -1; + + event->delta_time = 0; + snd_seq_free_event(ev); + + return r >= 0; +} + +static bool alsa_midi_write(void *p, const midi_event_t *event) +{ + int r; + snd_seq_event_t ev; + alsa_midi_t *d = (alsa_midi_t*)p; + + ev.type = alsa_midi_ev_map[(event->data[0] >> 4) & 7]; + ev.flags = SND_SEQ_TIME_STAMP_REAL | SND_SEQ_TIME_MODE_ABS; + ev.queue = d->out_queue; + ev.time.time.tv_sec = d->out_ev_time.tv_sec + event->delta_time / 1000000; + ev.time.time.tv_nsec = d->out_ev_time.tv_nsec + + (event->delta_time % 1000000) * 1000; + if(ev.time.time.tv_nsec >= 1000000000) + { + ev.time.time.tv_sec += 1; + ev.time.time.tv_nsec -= 1000000000; + } + ev.source.port = d->out_src.port; + ev.dest.client = SND_SEQ_ADDRESS_SUBSCRIBERS; + + if (ev.type == SND_SEQ_EVENT_NOTEOFF || ev.type == SND_SEQ_EVENT_NOTEON || + ev.type == SND_SEQ_EVENT_KEYPRESS) + { + ev.data.note.channel = event->data[0] & 0x0F; + ev.data.note.note = event->data[1]; + ev.data.note.velocity = event->data[2]; + } + else if (ev.type == SND_SEQ_EVENT_CONTROLLER) + { + ev.data.control.channel = event->data[0] & 0x0F; + ev.data.control.param = event->data[1]; + ev.data.control.value = event->data[2]; + } + else if (ev.type == SND_SEQ_EVENT_PGMCHANGE || + ev.type == SND_SEQ_EVENT_CHANPRESS) + { + ev.data.control.channel = event->data[0] & 0x0F; + ev.data.control.value = event->data[1]; + } + else if (ev.type == SND_SEQ_EVENT_PITCHBEND) + { + ev.data.control.channel = event->data[0] & 0x0F; + ev.data.control.value = event->data[1] | (event->data[2] << 7); + } + else if (ev.type == SND_SEQ_EVENT_SYSEX) + { + ev.flags |= SND_SEQ_EVENT_LENGTH_VARIABLE; + ev.data.ext.ptr = event->data; + ev.data.ext.len = event->data_size; + } + + r = snd_seq_event_output(d->seq, &ev); +#ifdef DEBUG + if (r < 0) + RARCH_ERR("[MIDI]: snd_seq_event_output failed with error %d.\n", r); +#endif + + d->out_ev_time.tv_sec = ev.time.time.tv_sec; + d->out_ev_time.tv_nsec = ev.time.time.tv_nsec; + + return r >= 0; +} + +static bool alsa_midi_flush(void *p) +{ + int r; + alsa_midi_t *d = (alsa_midi_t*)p; + + r = snd_seq_drain_output(d->seq); +#ifdef DEBUG + if (r < 0) + RARCH_ERR("[MIDI]: snd_seq_drain_output failed with error %d.\n", r); +#endif + + return r == 0; +} + +midi_driver_t midi_alsa = { + "alsa", + alsa_midi_get_avail_inputs, + alsa_midi_get_avail_outputs, + alsa_midi_init, + alsa_midi_free, + alsa_midi_set_input, + alsa_midi_set_output, + alsa_midi_read, + alsa_midi_write, + alsa_midi_flush +}; diff --git a/midi/midi_driver.c b/midi/midi_driver.c index d4f651f810..012a62d39a 100644 --- a/midi/midi_driver.c +++ b/midi/midi_driver.c @@ -27,8 +27,12 @@ extern midi_driver_t midi_null; extern midi_driver_t midi_winmm; +extern midi_driver_t midi_alsa; static midi_driver_t *midi_drivers[] = { +#ifdef HAVE_ALSA + &midi_alsa, +#endif #ifdef HAVE_WINMM &midi_winmm, #endif diff --git a/movie.c b/movie.c index 691e5e4d74..acc0e7554c 100644 --- a/movie.c +++ b/movie.c @@ -531,7 +531,7 @@ static bool runloop_check_movie_record(void) static bool runloop_check_movie_init(void) { - char msg[8192], path[8192]; + char msg[16384], path[8192]; settings_t *settings = config_get_ptr(); msg[0] = path[0] = '\0'; diff --git a/msg_hash.h b/msg_hash.h index 7cfc71ca35..bce6ce1de8 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -833,6 +833,7 @@ enum msg_hash_enums MENU_LABEL(LEFT_THUMBNAILS), MENU_LABEL(XMB_VERTICAL_THUMBNAILS), MENU_LABEL(TIMEDATE_ENABLE), + MENU_LABEL(TIMEDATE_STYLE), MENU_LABEL(BATTERY_LEVEL_ENABLE), MENU_LABEL(MATERIALUI_MENU_COLOR_THEME), MENU_LABEL(QUICK_MENU_OVERRIDE_OPTIONS), @@ -2129,6 +2130,28 @@ enum msg_hash_enums MSG_CHEAT_SEARCH_ADD_MATCH_FAIL, MSG_CHEAT_SEARCH_DELETE_MATCH_SUCCESS, MSG_CHEEVOS_HARDCORE_MODE_DISABLED, + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_YMD_HMS, + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_YMD_HM, + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_MDYYYY, + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_HMS, + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_HM, + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_DM_HM, + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_MD_HM, + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_AM_PM, + +#ifdef HAVE_LAKKA_SWITCH + MENU_ENUM_LABEL_SWITCH_GPU_PROFILE, + MENU_ENUM_LABEL_VALUE_SWITCH_GPU_PROFILE, + MENU_ENUM_SUBLABEL_SWITCH_GPU_PROFILE, + + MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL, + MENU_ENUM_LABEL_VALUE_SWITCH_BACKLIGHT_CONTROL, + MENU_ENUM_SUBLABEL_SWITCH_BACKLIGHT_CONTROL, + + MENU_ENUM_LABEL_SWITCH_CPU_PROFILE, + MENU_ENUM_LABEL_VALUE_SWITCH_CPU_PROFILE, + MENU_ENUM_SUBLABEL_SWITCH_CPU_PROFILE, +#endif MSG_LAST }; diff --git a/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj index 2122da3cc2..2cfc05036c 100644 --- a/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj @@ -142,7 +142,7 @@ 053FC25521433F1700D98D46 /* QtConcurrent.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QtConcurrent.framework; path = /usr/local/opt/qt/lib/QtConcurrent.framework; sourceTree = ""; }; 053FC25621433F1800D98D46 /* QtNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QtNetwork.framework; path = /usr/local/opt/qt/lib/QtNetwork.framework; sourceTree = ""; }; 053FC25721433F1800D98D46 /* QtWidgets.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QtWidgets.framework; path = /usr/local/opt/qt/lib/QtWidgets.framework; sourceTree = ""; }; - 05422E592140C8DB00F09961 /* RetroArchQT.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RetroArchQT.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 05422E592140C8DB00F09961 /* RetroArch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RetroArch.app; sourceTree = BUILT_PRODUCTS_DIR; }; 05422E5B2140CE3500F09961 /* VulkanConfig.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = VulkanConfig.xcconfig; sourceTree = ""; }; 05422E5C2140CFC500F09961 /* Metal.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Metal.xcconfig; sourceTree = ""; }; 0548E2B220F976E10094A083 /* driver.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = driver.c; path = ../../driver.c; sourceTree = ""; }; @@ -1426,7 +1426,7 @@ isa = PBXGroup; children = ( 8D1107320486CEB800E47090 /* RetroArch.app */, - 05422E592140C8DB00F09961 /* RetroArchQT.app */, + 05422E592140C8DB00F09961 /* RetroArch.app */, ); name = Products; sourceTree = ""; @@ -1502,9 +1502,9 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 05422E3C2140C8DB00F09961 /* RetroArchQT */ = { + 05422E3C2140C8DB00F09961 /* RetroArchQt */ = { isa = PBXNativeTarget; - buildConfigurationList = 05422E562140C8DB00F09961 /* Build configuration list for PBXNativeTarget "RetroArchQT" */; + buildConfigurationList = 05422E562140C8DB00F09961 /* Build configuration list for PBXNativeTarget "RetroArchQt" */; buildPhases = ( 053FC2782143764B00D98D46 /* ShellScript */, 05422E3D2140C8DB00F09961 /* Resources */, @@ -1518,10 +1518,10 @@ ); dependencies = ( ); - name = RetroArchQT; + name = RetroArchQt; productInstallPath = "$(HOME)/Applications"; productName = RetroArch; - productReference = 05422E592140C8DB00F09961 /* RetroArchQT.app */; + productReference = 05422E592140C8DB00F09961 /* RetroArch.app */; productType = "com.apple.product-type.application"; }; 8D1107260486CEB800E47090 /* RetroArch */ = { @@ -1563,7 +1563,7 @@ projectRoot = ""; targets = ( 8D1107260486CEB800E47090 /* RetroArch */, - 05422E3C2140C8DB00F09961 /* RetroArchQT */, + 05422E3C2140C8DB00F09961 /* RetroArchQt */, ); }; /* End PBXProject section */ @@ -1690,7 +1690,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES; PRODUCT_BUNDLE_IDENTIFIER = libretro.RetroArch; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = RetroArch; }; name = Debug; }; @@ -1711,7 +1711,7 @@ ); PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES; PRODUCT_BUNDLE_IDENTIFIER = libretro.RetroArch; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = RetroArch; }; name = Release; }; @@ -1986,7 +1986,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 05422E562140C8DB00F09961 /* Build configuration list for PBXNativeTarget "RetroArchQT" */ = { + 05422E562140C8DB00F09961 /* Build configuration list for PBXNativeTarget "RetroArchQt" */ = { isa = XCConfigurationList; buildConfigurations = ( 05422E572140C8DB00F09961 /* Debug */, diff --git a/pkg/ps3/SSNE10000/ICON0.PNG b/pkg/ps3/SSNE10000/ICON0.PNG index 56a1bf7855..4a1fc52964 100644 Binary files a/pkg/ps3/SSNE10000/ICON0.PNG and b/pkg/ps3/SSNE10000/ICON0.PNG differ diff --git a/tasks/task_content.c b/tasks/task_content.c index 18d4aee449..c2df099419 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -147,7 +147,9 @@ static int pending_subsystem_id = 0; static unsigned pending_subsystem_rom_id = 0; static char pending_subsystem_ident[255]; +#if 0 static char pending_subsystem_extensions[PATH_MAX_LENGTH]; +#endif static char *pending_subsystem_roms[RARCH_MAX_SUBSYSTEM_ROMS]; diff --git a/tasks/task_save.c b/tasks/task_save.c index bf0783ff32..66bc264055 100644 --- a/tasks/task_save.c +++ b/tasks/task_save.c @@ -597,7 +597,8 @@ static void task_save_handler(retro_task_t *task) if (!state->file) { - state->file = intfstream_open_file(state->path, RETRO_VFS_FILE_ACCESS_WRITE, + state->file = intfstream_open_file( + state->path, RETRO_VFS_FILE_ACCESS_WRITE, RETRO_VFS_FILE_ACCESS_HINT_NONE); if (!state->file) @@ -605,21 +606,15 @@ static void task_save_handler(retro_task_t *task) } if (!state->data) - { - state->data = get_serialized_data(state->path, state->size) ; - } + state->data = get_serialized_data(state->path, state->size) ; remaining = MIN(state->size - state->written, SAVE_STATE_CHUNK); if ( state->data ) - { written = (int)intfstream_write(state->file, (uint8_t*)state->data + state->written, remaining); - } else - { - written = 0 ; - } + written = 0; state->written += written; @@ -627,7 +622,7 @@ static void task_save_handler(retro_task_t *task) if (task_get_cancelled(task) || written != remaining) { - char err[256]; + char err[8192]; err[0] = '\0'; @@ -642,7 +637,9 @@ static void task_save_handler(retro_task_t *task) "RAM"); } else - snprintf(err, sizeof(err), "%s %s", msg_hash_to_str(MSG_FAILED_TO_SAVE_STATE_TO), state->path); + snprintf(err, sizeof(err), + "%s %s", + msg_hash_to_str(MSG_FAILED_TO_SAVE_STATE_TO), state->path); task_set_error(task, strdup(err)); task_save_handler_finished(task, state); @@ -845,30 +842,26 @@ static void task_load_handler(retro_task_t *task) if (state->bytes_read == state->size) { - char *msg = (char*)malloc(1024 * sizeof(char)); + size_t sizeof_msg = 8192; + char *msg = (char*)malloc(sizeof_msg * sizeof(char)); - msg[0] = '\0'; + msg[0] = '\0'; task_free_title(task); if (state->autoload) - { - snprintf(msg, - 1024 * sizeof(char), + snprintf(msg, sizeof_msg, "%s \"%s\" %s.", msg_hash_to_str(MSG_AUTOLOADING_SAVESTATE_FROM), state->path, msg_hash_to_str(MSG_SUCCEEDED)); - } else { if (state->state_slot < 0) strlcpy(msg, msg_hash_to_str(MSG_LOADED_STATE_FROM_SLOT_AUTO), - 1024 * sizeof(char) - ); + sizeof_msg); else - snprintf(msg, - 1024 * sizeof(char), + snprintf(msg, sizeof_msg, msg_hash_to_str(MSG_LOADED_STATE_FROM_SLOT), state->state_slot); diff --git a/ui/drivers/ui_cocoatouch.m b/ui/drivers/ui_cocoatouch.m index 19f676dea1..4e637feb21 100644 --- a/ui/drivers/ui_cocoatouch.m +++ b/ui/drivers/ui_cocoatouch.m @@ -79,7 +79,6 @@ static void ui_companion_cocoatouch_event_command( void *data, enum event_command cmd) { (void)data; - command_event(cmd, NULL); } static void rarch_draw_observer(CFRunLoopObserverRef observer,