mirror of
https://github.com/libretro/RetroArch
synced 2025-01-30 12:32:52 +00:00
Add core options v2 template in 'libretro-common/samples/core_options/example_categories'
This commit is contained in:
parent
fe1f311a35
commit
1f7532bf52
@ -51,3 +51,9 @@ if (strcmp(key, "mycore_show_speedhacks") == 0)
|
||||
```
|
||||
|
||||
For any cores that require this functionality, `example_hide_option/libretro_core_options.h` should be used as a template in place of `example_default/libretro_core_options.h`
|
||||
|
||||
## Adding core option categories
|
||||
|
||||
Core options v2 adds a mechanism for assigning categories to options. On supported fontends, options of a particular category will be displayed in a submenu/subsection of the main core options menu. This functionality may be used to reduce visual clutter, or to effectively 'hide' advanced settings without requiring a dedicated 'toggle display' option.
|
||||
|
||||
A template for enabling categories via the core options v2 interface is provided in `example_categories`. The usage of this code is identical to that described in the `Adding 'enhanced' core options to a core` section, with one addition: the `libretro_set_core_options()` function here includes an additional argument identifying whether the frontend has option category support (a core may wish to selectively hide or reorganise options based upon this variable).
|
||||
|
@ -0,0 +1,456 @@
|
||||
#ifndef LIBRETRO_CORE_OPTIONS_H__
|
||||
#define LIBRETRO_CORE_OPTIONS_H__
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <libretro.h>
|
||||
#include <retro_inline.h>
|
||||
|
||||
#ifndef HAVE_NO_LANGEXTRA
|
||||
#include "libretro_core_options_intl.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
********************************
|
||||
* VERSION: 2.0
|
||||
********************************
|
||||
*
|
||||
* - 2.0: Add support for core options v2 interface
|
||||
* - 1.3: Move translations to libretro_core_options_intl.h
|
||||
* - libretro_core_options_intl.h includes BOM and utf-8
|
||||
* fix for MSVC 2010-2013
|
||||
* - Added HAVE_NO_LANGEXTRA flag to disable translations
|
||||
* on platforms/compilers without BOM support
|
||||
* - 1.2: Use core options v1 interface when
|
||||
* RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1
|
||||
* (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1)
|
||||
* - 1.1: Support generation of core options v0 retro_core_option_value
|
||||
* arrays containing options with a single value
|
||||
* - 1.0: First commit
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
********************************
|
||||
* Core Option Definitions
|
||||
********************************
|
||||
*/
|
||||
|
||||
/* RETRO_LANGUAGE_ENGLISH */
|
||||
|
||||
/* Default language:
|
||||
* - All other languages must include the same keys and values
|
||||
* - Will be used as a fallback in the event that frontend language
|
||||
* is not available
|
||||
* - Will be used as a fallback for any missing entries in
|
||||
* frontend language definition */
|
||||
|
||||
struct retro_core_option_v2_category option_cats_us[] = {
|
||||
{
|
||||
"video", /* key (category name) */
|
||||
"Video", /* category description (label) */
|
||||
"Configure display options." /* category sublabel */
|
||||
},
|
||||
{
|
||||
"hacks",
|
||||
"Advanced",
|
||||
"Options affecting low-level emulation performance and accuracy."
|
||||
},
|
||||
{ NULL, NULL, NULL },
|
||||
};
|
||||
|
||||
struct retro_core_option_v2_definition option_defs_us[] = {
|
||||
{
|
||||
"mycore_region", /* key (option name) */
|
||||
"Console Region", /* description (label) */
|
||||
NULL, /* 'categorised' description (used instead of
|
||||
* 'description' if frontend has category
|
||||
* support; if NULL or empty, regular
|
||||
* description is always used */
|
||||
"Specify which region the system is from.", /* sublabel */
|
||||
NULL, /* 'categorised' sublabel (used instead of
|
||||
* 'sublabel' if frontend has category
|
||||
* support; if NULL or empty, regular
|
||||
* sublabel is always used */
|
||||
NULL, /* category key (must match an entry in
|
||||
* option_cats_us; if NULL or empty,
|
||||
* option is uncategorised */
|
||||
{
|
||||
{ "auto", "Auto" }, /* value_1, value_1_label */
|
||||
{ "ntsc-j", "Japan" }, /* value_2, value_2_label */
|
||||
{ "ntsc-u", "America" }, /* value_3, value_3_label */
|
||||
{ "pal", "Europe" }, /* value_4, value_4_label */
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"auto" /* default_value */
|
||||
},
|
||||
{
|
||||
"mycore_video_scale",
|
||||
"Video > Scale", /* description: here a 'Video >' prefix is used to
|
||||
* signify a category on frontends without explicit
|
||||
* category support */
|
||||
"Scale", /* 'categorised' description: will be displayed inside
|
||||
* the 'Video' submenu */
|
||||
"Set internal video scale factor.",
|
||||
NULL,
|
||||
"video", /* category key */
|
||||
{
|
||||
{ "1x", NULL }, /* If value itself is human-readable (e.g. a number) */
|
||||
{ "2x", NULL }, /* and can displayed directly, the value_label should */
|
||||
{ "3x", NULL }, /* be set to NULL */
|
||||
{ "4x", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"3x"
|
||||
},
|
||||
{
|
||||
"mycore_overclock",
|
||||
"Advanced > Reduce Slowdown",
|
||||
"Reduce Slowdown",
|
||||
"Enabling 'Advanced > Reduce Slowdown' will reduce accuracy.", /* sublabel */
|
||||
"Enabling 'Reduce Slowdown' will reduce accuracy.", /* 'categorised' sublabel:
|
||||
* will be displayed inside the 'Advanced' submenu; note that
|
||||
* 'Advanced > Reduce Slowdown' is replaced with 'Reduce Slowdown' */
|
||||
"hacks",
|
||||
{
|
||||
{ "enabled", NULL }, /* If value is equal to 'enabled' or 'disabled', */
|
||||
{ "disabled", NULL }, /* value_label should be set to NULL */
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{ NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL },
|
||||
};
|
||||
|
||||
struct retro_core_options_v2 options_us = {
|
||||
option_cats_us,
|
||||
option_defs_us
|
||||
};
|
||||
|
||||
/*
|
||||
********************************
|
||||
* Language Mapping
|
||||
********************************
|
||||
*/
|
||||
|
||||
#ifndef HAVE_NO_LANGEXTRA
|
||||
struct retro_core_options_v2 *options_intl[RETRO_LANGUAGE_LAST] = {
|
||||
&options_us, /* RETRO_LANGUAGE_ENGLISH */
|
||||
NULL, /* RETRO_LANGUAGE_JAPANESE */
|
||||
&options_fr, /* RETRO_LANGUAGE_FRENCH */
|
||||
NULL, /* RETRO_LANGUAGE_SPANISH */
|
||||
NULL, /* RETRO_LANGUAGE_GERMAN */
|
||||
NULL, /* RETRO_LANGUAGE_ITALIAN */
|
||||
NULL, /* RETRO_LANGUAGE_DUTCH */
|
||||
NULL, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */
|
||||
NULL, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */
|
||||
NULL, /* RETRO_LANGUAGE_RUSSIAN */
|
||||
NULL, /* RETRO_LANGUAGE_KOREAN */
|
||||
NULL, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */
|
||||
NULL, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */
|
||||
NULL, /* RETRO_LANGUAGE_ESPERANTO */
|
||||
NULL, /* RETRO_LANGUAGE_POLISH */
|
||||
NULL, /* RETRO_LANGUAGE_VIETNAMESE */
|
||||
NULL, /* RETRO_LANGUAGE_ARABIC */
|
||||
NULL, /* RETRO_LANGUAGE_GREEK */
|
||||
NULL, /* RETRO_LANGUAGE_TURKISH */
|
||||
NULL, /* RETRO_LANGUAGE_SLOVAK */
|
||||
NULL, /* RETRO_LANGUAGE_PERSIAN */
|
||||
NULL, /* RETRO_LANGUAGE_HEBREW */
|
||||
NULL, /* RETRO_LANGUAGE_ASTURIAN */
|
||||
NULL, /* RETRO_LANGUAGE_FINNISH */
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
********************************
|
||||
* Functions
|
||||
********************************
|
||||
*/
|
||||
|
||||
/* Handles configuration/setting of core options.
|
||||
* Should be called as early as possible - ideally inside
|
||||
* retro_set_environment(), and no later than retro_load_game()
|
||||
* > We place the function body in the header to avoid the
|
||||
* necessity of adding more .c files (i.e. want this to
|
||||
* be as painless as possible for core devs)
|
||||
*/
|
||||
|
||||
static INLINE void libretro_set_core_options(retro_environment_t environ_cb,
|
||||
bool *categories_supported)
|
||||
{
|
||||
unsigned version = 0;
|
||||
#ifndef HAVE_NO_LANGEXTRA
|
||||
unsigned language = 0;
|
||||
#endif
|
||||
|
||||
if (!environ_cb || !categories_supported)
|
||||
return;
|
||||
|
||||
*categories_supported = false;
|
||||
|
||||
if (!environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version))
|
||||
version = 0;
|
||||
|
||||
if (version >= 2)
|
||||
{
|
||||
#ifndef HAVE_NO_LANGEXTRA
|
||||
struct retro_core_options_v2_intl core_options_intl;
|
||||
|
||||
core_options_intl.us = &options_us;
|
||||
core_options_intl.local = NULL;
|
||||
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) &&
|
||||
(language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH))
|
||||
core_options_intl.local = options_intl[language];
|
||||
|
||||
*categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL,
|
||||
&core_options_intl);
|
||||
#else
|
||||
*categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2,
|
||||
&options_us);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t i, j;
|
||||
size_t option_index = 0;
|
||||
size_t num_options = 0;
|
||||
struct retro_core_option_definition
|
||||
*option_v1_defs_us = NULL;
|
||||
#ifndef HAVE_NO_LANGEXTRA
|
||||
size_t num_options_intl = 0;
|
||||
struct retro_core_option_v2_definition
|
||||
*option_defs_intl = NULL;
|
||||
struct retro_core_option_definition
|
||||
*option_v1_defs_intl = NULL;
|
||||
struct retro_core_options_intl
|
||||
core_options_v1_intl;
|
||||
#endif
|
||||
struct retro_variable *variables = NULL;
|
||||
char **values_buf = NULL;
|
||||
|
||||
/* Determine total number of options */
|
||||
while (true)
|
||||
{
|
||||
if (option_defs_us[num_options].key)
|
||||
num_options++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (version >= 1)
|
||||
{
|
||||
/* Allocate US array */
|
||||
option_v1_defs_us = (struct retro_core_option_definition *)
|
||||
calloc(num_options + 1, sizeof(struct retro_core_option_definition));
|
||||
|
||||
/* Copy parameters from option_defs_us array */
|
||||
for (i = 0; i < num_options; i++)
|
||||
{
|
||||
struct retro_core_option_v2_definition *option_def_us = &option_defs_us[i];
|
||||
struct retro_core_option_value *option_values = option_def_us->values;
|
||||
struct retro_core_option_definition *option_v1_def_us = &option_v1_defs_us[i];
|
||||
struct retro_core_option_value *option_v1_values = option_v1_def_us->values;
|
||||
|
||||
option_v1_def_us->key = option_def_us->key;
|
||||
option_v1_def_us->desc = option_def_us->desc;
|
||||
option_v1_def_us->info = option_def_us->info;
|
||||
option_v1_def_us->default_value = option_def_us->default_value;
|
||||
|
||||
/* Values must be copied individually... */
|
||||
while (option_values->value)
|
||||
{
|
||||
option_v1_values->value = option_values->value;
|
||||
option_v1_values->label = option_values->label;
|
||||
|
||||
option_values++;
|
||||
option_v1_values++;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef HAVE_NO_LANGEXTRA
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) &&
|
||||
(language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH) &&
|
||||
options_intl[language])
|
||||
option_defs_intl = options_intl[language]->definitions;
|
||||
|
||||
if (option_defs_intl)
|
||||
{
|
||||
/* Determine number of intl options */
|
||||
while (true)
|
||||
{
|
||||
if (option_defs_intl[num_options_intl].key)
|
||||
num_options_intl++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/* Allocate intl array */
|
||||
option_v1_defs_intl = (struct retro_core_option_definition *)
|
||||
calloc(num_options_intl + 1, sizeof(struct retro_core_option_definition));
|
||||
|
||||
/* Copy parameters from option_defs_intl array */
|
||||
for (i = 0; i < num_options_intl; i++)
|
||||
{
|
||||
struct retro_core_option_v2_definition *option_def_intl = &option_defs_intl[i];
|
||||
struct retro_core_option_value *option_values = option_def_intl->values;
|
||||
struct retro_core_option_definition *option_v1_def_intl = &option_v1_defs_intl[i];
|
||||
struct retro_core_option_value *option_v1_values = option_v1_def_intl->values;
|
||||
|
||||
option_v1_def_intl->key = option_def_intl->key;
|
||||
option_v1_def_intl->desc = option_def_intl->desc;
|
||||
option_v1_def_intl->info = option_def_intl->info;
|
||||
option_v1_def_intl->default_value = option_def_intl->default_value;
|
||||
|
||||
/* Values must be copied individually... */
|
||||
while (option_values->value)
|
||||
{
|
||||
option_v1_values->value = option_values->value;
|
||||
option_v1_values->label = option_values->label;
|
||||
|
||||
option_values++;
|
||||
option_v1_values++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
core_options_v1_intl.us = option_v1_defs_us;
|
||||
core_options_v1_intl.local = option_v1_defs_intl;
|
||||
|
||||
environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_v1_intl);
|
||||
#else
|
||||
environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, option_v1_defs_us);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Allocate arrays */
|
||||
variables = (struct retro_variable *)calloc(num_options + 1,
|
||||
sizeof(struct retro_variable));
|
||||
values_buf = (char **)calloc(num_options, sizeof(char *));
|
||||
|
||||
if (!variables || !values_buf)
|
||||
goto error;
|
||||
|
||||
/* Copy parameters from option_defs_us array */
|
||||
for (i = 0; i < num_options; i++)
|
||||
{
|
||||
const char *key = option_defs_us[i].key;
|
||||
const char *desc = option_defs_us[i].desc;
|
||||
const char *default_value = option_defs_us[i].default_value;
|
||||
struct retro_core_option_value *values = option_defs_us[i].values;
|
||||
size_t buf_len = 3;
|
||||
size_t default_index = 0;
|
||||
|
||||
values_buf[i] = NULL;
|
||||
|
||||
if (desc)
|
||||
{
|
||||
size_t num_values = 0;
|
||||
|
||||
/* Determine number of values */
|
||||
while (true)
|
||||
{
|
||||
if (values[num_values].value)
|
||||
{
|
||||
/* Check if this is the default value */
|
||||
if (default_value)
|
||||
if (strcmp(values[num_values].value, default_value) == 0)
|
||||
default_index = num_values;
|
||||
|
||||
buf_len += strlen(values[num_values].value);
|
||||
num_values++;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/* Build values string */
|
||||
if (num_values > 0)
|
||||
{
|
||||
size_t j;
|
||||
|
||||
buf_len += num_values - 1;
|
||||
buf_len += strlen(desc);
|
||||
|
||||
values_buf[i] = (char *)calloc(buf_len, sizeof(char));
|
||||
if (!values_buf[i])
|
||||
goto error;
|
||||
|
||||
strcpy(values_buf[i], desc);
|
||||
strcat(values_buf[i], "; ");
|
||||
|
||||
/* Default value goes first */
|
||||
strcat(values_buf[i], values[default_index].value);
|
||||
|
||||
/* Add remaining values */
|
||||
for (j = 0; j < num_values; j++)
|
||||
{
|
||||
if (j != default_index)
|
||||
{
|
||||
strcat(values_buf[i], "|");
|
||||
strcat(values_buf[i], values[j].value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
variables[option_index].key = key;
|
||||
variables[option_index].value = values_buf[i];
|
||||
option_index++;
|
||||
}
|
||||
|
||||
/* Set variables */
|
||||
environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);
|
||||
}
|
||||
|
||||
error:
|
||||
/* Clean up */
|
||||
|
||||
if (option_v1_defs_us)
|
||||
{
|
||||
free(option_v1_defs_us);
|
||||
option_v1_defs_us = NULL;
|
||||
}
|
||||
|
||||
#ifndef HAVE_NO_LANGEXTRA
|
||||
if (option_v1_defs_intl)
|
||||
{
|
||||
free(option_v1_defs_intl);
|
||||
option_v1_defs_intl = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (values_buf)
|
||||
{
|
||||
for (i = 0; i < num_options; i++)
|
||||
{
|
||||
if (values_buf[i])
|
||||
{
|
||||
free(values_buf[i]);
|
||||
values_buf[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
free(values_buf);
|
||||
values_buf = NULL;
|
||||
}
|
||||
|
||||
if (variables)
|
||||
{
|
||||
free(variables);
|
||||
variables = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,157 @@
|
||||
#ifndef LIBRETRO_CORE_OPTIONS_INTL_H__
|
||||
#define LIBRETRO_CORE_OPTIONS_INTL_H__
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1500 && _MSC_VER < 1900)
|
||||
/* https://support.microsoft.com/en-us/kb/980263 */
|
||||
#pragma execution_character_set("utf-8")
|
||||
#pragma warning(disable:4566)
|
||||
#endif
|
||||
|
||||
#include <libretro.h>
|
||||
|
||||
/*
|
||||
********************************
|
||||
* VERSION: 2.0
|
||||
********************************
|
||||
*
|
||||
* - 2.0: Add support for core options v2 interface
|
||||
* - 1.3: Move translations to libretro_core_options_intl.h
|
||||
* - libretro_core_options_intl.h includes BOM and utf-8
|
||||
* fix for MSVC 2010-2013
|
||||
* - Added HAVE_NO_LANGEXTRA flag to disable translations
|
||||
* on platforms/compilers without BOM support
|
||||
* - 1.2: Use core options v1 interface when
|
||||
* RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1
|
||||
* (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1)
|
||||
* - 1.1: Support generation of core options v0 retro_core_option_value
|
||||
* arrays containing options with a single value
|
||||
* - 1.0: First commit
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
********************************
|
||||
* Core Option Definitions
|
||||
********************************
|
||||
*/
|
||||
|
||||
/* RETRO_LANGUAGE_JAPANESE */
|
||||
|
||||
/* RETRO_LANGUAGE_FRENCH */
|
||||
|
||||
struct retro_core_option_v2_category option_cats_fr[] = {
|
||||
{
|
||||
"video", /* key must match option_cats_us entry */
|
||||
"Vidéo", /* translated category description */
|
||||
"Configurez les options d'affichage." /* translated category sublabel */
|
||||
},
|
||||
{
|
||||
"hacks",
|
||||
"Avancée",
|
||||
"Options affectant les performances et la précision de l'émulation de bas niveau."
|
||||
},
|
||||
{ NULL, NULL, NULL },
|
||||
};
|
||||
|
||||
struct retro_core_option_v2_definition option_defs_fr[] = {
|
||||
{
|
||||
"mycore_region", /* key must match option_defs_us entry */
|
||||
"Région de la console", /* translated description */
|
||||
NULL,
|
||||
"Spécifiez la région d'origine du système.", /* translated sublabel */
|
||||
NULL,
|
||||
NULL, /* category key is taken from option_defs_us
|
||||
* -> can set to NULL here */
|
||||
{
|
||||
{ "auto", "Auto" }, /* value must match option_defs_us entry */
|
||||
{ "ntsc-j", "Japon" }, /* > only value_label should be translated */
|
||||
{ "ntsc-u", "Amérique" },
|
||||
{ "pal", "L'Europe" },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
NULL /* default_value is taken from option_defs_us
|
||||
* -> can set to NULL here */
|
||||
},
|
||||
{
|
||||
"mycore_video_scale",
|
||||
"Vidéo > Échelle", /* translated description */
|
||||
"Échelle", /* translated 'categorised' description */
|
||||
"Définir le facteur d'échelle vidéo interne.",
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ NULL, NULL }, /* If value_labels do not require translation (e.g. numbers), values may be omitted */
|
||||
},
|
||||
NULL
|
||||
},
|
||||
{
|
||||
"mycore_overclock",
|
||||
"Avancé > Réduire le ralentissement",
|
||||
"Réduire le ralentissement",
|
||||
"L'activation de « Avancé > Réduire le ralentissement » réduira la précision.", /* translated sublabel */
|
||||
"L'activation de « Réduire le ralentissement » réduira la précision.", /* translated 'categorised'
|
||||
* sublabel */
|
||||
NULL,
|
||||
{
|
||||
{ NULL, NULL }, /* 'enabled' and 'disabled' values should not be translated */
|
||||
},
|
||||
NULL
|
||||
},
|
||||
{ NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL },
|
||||
};
|
||||
|
||||
struct retro_core_options_v2 options_fr = {
|
||||
option_cats_fr,
|
||||
option_defs_fr
|
||||
};
|
||||
|
||||
/* RETRO_LANGUAGE_SPANISH */
|
||||
|
||||
/* RETRO_LANGUAGE_GERMAN */
|
||||
|
||||
/* RETRO_LANGUAGE_ITALIAN */
|
||||
|
||||
/* RETRO_LANGUAGE_DUTCH */
|
||||
|
||||
/* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */
|
||||
|
||||
/* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */
|
||||
|
||||
/* RETRO_LANGUAGE_RUSSIAN */
|
||||
|
||||
/* RETRO_LANGUAGE_KOREAN */
|
||||
|
||||
/* RETRO_LANGUAGE_CHINESE_TRADITIONAL */
|
||||
|
||||
/* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */
|
||||
|
||||
/* RETRO_LANGUAGE_ESPERANTO */
|
||||
|
||||
/* RETRO_LANGUAGE_POLISH */
|
||||
|
||||
/* RETRO_LANGUAGE_VIETNAMESE */
|
||||
|
||||
/* RETRO_LANGUAGE_ARABIC */
|
||||
|
||||
/* RETRO_LANGUAGE_GREEK */
|
||||
|
||||
/* RETRO_LANGUAGE_TURKISH */
|
||||
|
||||
/* RETRO_LANGUAGE_SLOVAK */
|
||||
|
||||
/* RETRO_LANGUAGE_PERSIAN */
|
||||
|
||||
/* RETRO_LANGUAGE_HEBREW */
|
||||
|
||||
/* RETRO_LANGUAGE_ASTURIAN */
|
||||
|
||||
/* RETRO_LANGUAGE_FINNISH */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user