mirror of
https://github.com/libretro/libretro-prboom.git
synced 2024-11-26 17:50:36 +00:00
Fix Crowdin config & workflow
Also add new languages and update translation scripts
This commit is contained in:
parent
4e671fa0a4
commit
6435f70dae
70
intl/activate.py
Normal file
70
intl/activate.py
Normal file
@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import glob
|
||||
import random as r
|
||||
|
||||
# -------------------- MAIN -------------------- #
|
||||
|
||||
if __name__ == '__main__':
|
||||
DIR_PATH = os.path.dirname(os.path.realpath(__file__))
|
||||
if os.path.basename(DIR_PATH) != "intl":
|
||||
raise RuntimeError("Script is not in intl folder!")
|
||||
|
||||
BASE_PATH = os.path.dirname(DIR_PATH)
|
||||
WORKFLOW_PATH = os.path.join(BASE_PATH, ".github", "workflows")
|
||||
PREP_WF = os.path.join(WORKFLOW_PATH, "crowdin_prep.yml")
|
||||
TRANSLATE_WF = os.path.join(WORKFLOW_PATH, "crowdin_translate.yml")
|
||||
CORE_NAME = os.path.basename(BASE_PATH)
|
||||
CORE_OP_FILE = os.path.join(BASE_PATH, "**", "libretro_core_options.h")
|
||||
|
||||
core_options_hits = glob.glob(CORE_OP_FILE, recursive=True)
|
||||
|
||||
if len(core_options_hits) == 0:
|
||||
raise RuntimeError("libretro_core_options.h not found!")
|
||||
elif len(core_options_hits) > 1:
|
||||
print("More than one libretro_core_options.h file found:\n\n")
|
||||
for i, file in enumerate(core_options_hits):
|
||||
print(f"{i} {file}\n")
|
||||
|
||||
while True:
|
||||
user_choice = input("Please choose one ('q' will exit): ")
|
||||
if user_choice == 'q':
|
||||
exit(0)
|
||||
elif user_choice.isdigit():
|
||||
core_op_file = core_options_hits[int(user_choice)]
|
||||
break
|
||||
else:
|
||||
print("Please make a valid choice!\n\n")
|
||||
else:
|
||||
core_op_file = core_options_hits[0]
|
||||
|
||||
core_intl_file = os.path.join(os.path.dirname(core_op_file.replace(BASE_PATH, ''))[1:],
|
||||
'libretro_core_options_intl.h')
|
||||
core_op_file = os.path.join(os.path.dirname(core_op_file.replace(BASE_PATH, ''))[1:],
|
||||
'libretro_core_options.h')
|
||||
minutes = r.randrange(0, 59, 5)
|
||||
hour = r.randrange(0, 23)
|
||||
|
||||
with open(PREP_WF, 'r') as wf_file:
|
||||
prep_txt = wf_file.read()
|
||||
|
||||
prep_txt = prep_txt.replace("<CORE_NAME>", CORE_NAME)
|
||||
prep_txt = prep_txt.replace("<PATH/TO>/libretro_core_options.h",
|
||||
core_op_file)
|
||||
with open(PREP_WF, 'w') as wf_file:
|
||||
wf_file.write(prep_txt)
|
||||
|
||||
|
||||
with open(TRANSLATE_WF, 'r') as wf_file:
|
||||
translate_txt = wf_file.read()
|
||||
|
||||
translate_txt = translate_txt.replace('<0-59>', f"{minutes}")
|
||||
translate_txt = translate_txt.replace('<0-23>', f"{hour}")
|
||||
translate_txt = translate_txt.replace('# Fridays at , UTC',
|
||||
f"# Fridays at {hour%12}:{minutes if minutes > 9 else '0' + str(minutes)} {'AM' if hour < 12 else 'PM'}, UTC")
|
||||
translate_txt = translate_txt.replace("<CORE_NAME>", CORE_NAME)
|
||||
translate_txt = translate_txt.replace('<PATH/TO>/libretro_core_options_intl.h',
|
||||
core_intl_file)
|
||||
with open(TRANSLATE_WF, 'w') as wf_file:
|
||||
wf_file.write(translate_txt)
|
@ -1,14 +1,14 @@
|
||||
import re
|
||||
|
||||
# 0: full struct; 1: up to & including first []; 2: content between first {}
|
||||
p_struct = re.compile(r'(struct\s*[a-zA-Z0-9_\s]+\[])\s*'
|
||||
r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+)\s*)*'
|
||||
# 0: full struct; 1: up to & including first []; 2 & 3: comments; 4: content between first {}
|
||||
p_struct = re.compile(r'(\bstruct\b\s*[a-zA-Z0-9_\s]+\[])\s*' # 1st capturing group
|
||||
r'(?:(?=(\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+))\2\s*)*' # 2nd capturing group
|
||||
r'=\s*' # =
|
||||
r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+)\s*)*'
|
||||
r'(?:(?=(\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+))\3\s*)*' # 3rd capturing group
|
||||
r'{((?:.|[\r\n])*?)\{\s*NULL,\s*NULL,\s*NULL\s*(?:.|[\r\n])*?},?(?:.|[\r\n])*?};') # captures full struct, it's beginning and it's content
|
||||
# 0: type name[]; 1: type; 2: name
|
||||
p_type_name = re.compile(r'(retro_core_option_[a-zA-Z0-9_]+)\s*'
|
||||
r'(option_cats([a-z_]{0,8})|option_defs([a-z_]{0,8}))\s*\[]')
|
||||
p_type_name = re.compile(r'(\bretro_core_option_[a-zA-Z0-9_]+)\s*'
|
||||
r'(\boption_cats([a-z_]{0,8})|\boption_defs([a-z_]*))\s*\[]')
|
||||
# 0: full option; 1: key; 2: description; 3: additional info; 4: key/value pairs
|
||||
p_option = re.compile(r'{\s*' # opening braces
|
||||
r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*'
|
||||
@ -76,9 +76,9 @@ p_key_value = re.compile(r'{\s*' # opening braces
|
||||
|
||||
p_masked = re.compile(r'([A-Z_][A-Z0-9_]+)\s*(\"(?:"\s*"|\\\s*|.)*\")')
|
||||
|
||||
p_intl = re.compile(r'(struct retro_core_option_definition \*option_defs_intl\[RETRO_LANGUAGE_LAST]) = {'
|
||||
p_intl = re.compile(r'(\bstruct retro_core_option_definition \*option_defs_intl\[RETRO_LANGUAGE_LAST]) = {'
|
||||
r'((?:.|[\r\n])*?)};')
|
||||
p_set = re.compile(r'static INLINE void libretro_set_core_options\(retro_environment_t environ_cb\)'
|
||||
p_set = re.compile(r'\bstatic INLINE void libretro_set_core_options\(retro_environment_t environ_cb\)'
|
||||
r'(?:.|[\r\n])*?};?\s*#ifdef __cplusplus\s*}\s*#endif')
|
||||
|
||||
p_yaml = re.compile(r'"project_id": "[0-9]+".*\s*'
|
||||
|
@ -134,13 +134,12 @@ def is_viable_non_dupe(text: str, comparison) -> bool:
|
||||
|
||||
|
||||
def is_viable_value(text: str) -> bool:
|
||||
"""text must be longer than 2 ('""'), not 'NULL' and text.lower() not in
|
||||
{'"enabled"', '"disabled"', '"true"', '"false"', '"on"', '"off"'}.
|
||||
"""text must be longer than 2 ('""') and not 'NULL'.
|
||||
|
||||
:param text: String to be tested.
|
||||
:return: bool
|
||||
"""
|
||||
return 2 < len(text) and text != 'NULL' and text.lower() not in ON_OFFS
|
||||
return 2 < len(text) and text != 'NULL'
|
||||
|
||||
|
||||
def create_non_dupe(base_name: str, opt_num: int, comparison) -> str:
|
||||
@ -183,17 +182,17 @@ def get_texts(text: str) -> dict:
|
||||
if lang not in just_string:
|
||||
hash_n_string[lang] = {}
|
||||
just_string[lang] = set()
|
||||
|
||||
is_v2 = False
|
||||
is_v2_definition = 'retro_core_option_v2_definition' == struct_type_name[0]
|
||||
pre_name = ''
|
||||
# info texts format
|
||||
p = cor.p_info
|
||||
if 'retro_core_option_v2_definition' == struct_type_name[0]:
|
||||
is_v2 = True
|
||||
elif 'retro_core_option_v2_category' == struct_type_name[0]:
|
||||
if 'retro_core_option_v2_category' == struct_type_name[0]:
|
||||
# prepend category labels, as they can be the same as option labels
|
||||
pre_name = 'CATEGORY_'
|
||||
# categories have different info texts format
|
||||
p = cor.p_info_cat
|
||||
|
||||
struct_content = struct.group(2)
|
||||
struct_content = struct.group(4)
|
||||
# 0: full option; 1: key; 2: description; 3: additional info; 4: key/value pairs
|
||||
struct_options = cor.p_option.finditer(struct_content)
|
||||
for opt, option in enumerate(struct_options):
|
||||
@ -219,7 +218,7 @@ def get_texts(text: str) -> dict:
|
||||
if option.group(3):
|
||||
infos = option.group(3)
|
||||
option_info = p.finditer(infos)
|
||||
if is_v2:
|
||||
if is_v2_definition:
|
||||
desc1 = next(option_info).group(1)
|
||||
if is_viable_non_dupe(desc1, just_string[lang]):
|
||||
just_string[lang].add(desc1)
|
||||
@ -248,16 +247,21 @@ def get_texts(text: str) -> dict:
|
||||
else:
|
||||
raise ValueError(f'Too few arguments in struct {struct_type_name[1]} option {option.group(1)}!')
|
||||
|
||||
# group 4:
|
||||
# group 4: key/value pairs
|
||||
if option.group(4):
|
||||
for j, kv_set in enumerate(cor.p_key_value.finditer(option.group(4))):
|
||||
set_key, set_value = kv_set.group(1, 2)
|
||||
if not is_viable_value(set_value):
|
||||
if not is_viable_value(set_key):
|
||||
continue
|
||||
# use the key if value not available
|
||||
set_value = set_key
|
||||
if not is_viable_value(set_value):
|
||||
continue
|
||||
# re.fullmatch(r'(?:[+-][0-9]+)+', value[1:-1])
|
||||
if set_value not in just_string[lang] and not re.sub(r'[+-]', '', set_value[1:-1]).isdigit():
|
||||
|
||||
# add only if non-dupe, not translated by RetroArch directly & not purely numeric
|
||||
if set_value not in just_string[lang]\
|
||||
and set_value.lower() not in ON_OFFS\
|
||||
and not re.sub(r'[+-]', '', set_value[1:-1]).isdigit():
|
||||
clean_key = set_key[1:-1]
|
||||
clean_key = remove_special_chars(clean_key).upper().replace(' ', '_')
|
||||
m_h = create_non_dupe(re.sub(r'__+', '_', f"OPTION_VAL_{clean_key}"), opt, hash_n_string[lang])
|
||||
@ -298,8 +302,12 @@ def h2json(file_paths: dict) -> dict:
|
||||
for file_lang in file_paths:
|
||||
if not os.path.isfile(file_paths[file_lang]):
|
||||
continue
|
||||
|
||||
jsons[file_lang] = file_paths[file_lang][:-2] + '.json'
|
||||
file_path = file_paths[file_lang]
|
||||
try:
|
||||
jsons[file_lang] = file_path[:file_path.rindex('.')] + '.json'
|
||||
except ValueError:
|
||||
print(f"File {file_path} has incorrect format! File ending missing?")
|
||||
continue
|
||||
|
||||
p = cor.p_masked
|
||||
|
||||
@ -397,11 +405,11 @@ def get_crowdin_client(dir_path: str) -> str:
|
||||
return jar_path
|
||||
|
||||
|
||||
def create_intl_file(localisation_file_path: str, intl_dir_path: str, text: str, file_path: str) -> None:
|
||||
def create_intl_file(intl_file_path: str, localisations_path: str, text: str, file_path: str) -> None:
|
||||
"""Creates 'libretro_core_options_intl.h' from Crowdin translations.
|
||||
|
||||
:param localisation_file_path: Path to 'libretro_core_options_intl.h'
|
||||
:param intl_dir_path: Path to the intl/<core_name> directory.
|
||||
:param intl_file_path: Path to 'libretro_core_options_intl.h'
|
||||
:param localisations_path: Path to the intl/<core_name> directory.
|
||||
:param text: Content of the 'libretro_core_options.h' being translated.
|
||||
:param file_path: Path to the '_us.h' file, containing the original English texts.
|
||||
:return: None
|
||||
@ -497,10 +505,11 @@ def create_intl_file(localisation_file_path: str, intl_dir_path: str, text: str,
|
||||
'extern "C" {\n' \
|
||||
'#endif\n'
|
||||
|
||||
if os.path.isfile(localisation_file_path):
|
||||
if os.path.isfile(intl_file_path):
|
||||
# copy top of the file for re-use
|
||||
with open(localisation_file_path, 'r', encoding='utf-8') as intl: # libretro_core_options_intl.h
|
||||
with open(intl_file_path, 'r', encoding='utf-8') as intl: # libretro_core_options_intl.h
|
||||
in_text = intl.read()
|
||||
# attempt 1: find the distinct comment header
|
||||
intl_start = re.search(re.escape('/*\n'
|
||||
' ********************************\n'
|
||||
' * Core Option Definitions\n'
|
||||
@ -509,19 +518,22 @@ def create_intl_file(localisation_file_path: str, intl_dir_path: str, text: str,
|
||||
if intl_start:
|
||||
out_txt = in_text[:intl_start.end(0)]
|
||||
else:
|
||||
# attempt 2: if no comment header present, find c++ compiler instruction (it is kind of a must)
|
||||
intl_start = re.search(re.escape('#ifdef __cplusplus\n'
|
||||
'extern "C" {\n'
|
||||
'#endif\n'), in_text)
|
||||
if intl_start:
|
||||
out_txt = in_text[:intl_start.end(0)]
|
||||
# if all attempts fail, use default from above
|
||||
|
||||
# only write to file, if there is anything worthwhile to write!
|
||||
overwrite = False
|
||||
|
||||
# iterate through localisation files
|
||||
files = {}
|
||||
for file in os.scandir(intl_dir_path):
|
||||
for file in os.scandir(localisations_path):
|
||||
files[file.name] = {'is_file': file.is_file(), 'path': file.path}
|
||||
|
||||
for file in sorted(files): # intl/<core_name>/_*
|
||||
if files[file]['is_file'] \
|
||||
and file.startswith('_') \
|
||||
@ -532,6 +544,7 @@ def create_intl_file(localisation_file_path: str, intl_dir_path: str, text: str,
|
||||
struct_groups = cor.p_struct.finditer(text)
|
||||
lang_low = os.path.splitext(file)[0].lower()
|
||||
lang_up = lang_low.upper()
|
||||
# mark each language's section with a comment, for readability
|
||||
out_txt = out_txt + f'/* RETRO_LANGUAGE{lang_up} */\n\n' # /* RETRO_LANGUAGE_NM */
|
||||
|
||||
# copy adjusted translations (makros)
|
||||
@ -544,22 +557,22 @@ def create_intl_file(localisation_file_path: str, intl_dir_path: str, text: str,
|
||||
if 3 > len(struct_type_name): # no language specifier
|
||||
new_decl = re.sub(re.escape(struct_type_name[1]), struct_type_name[1] + lang_low, declaration)
|
||||
else:
|
||||
new_decl = re.sub(re.escape(struct_type_name[2]), lang_low, declaration)
|
||||
if '_us' != struct_type_name[2]:
|
||||
# only use _us constructs - other languages present in the source file are not important
|
||||
continue
|
||||
new_decl = re.sub(re.escape(struct_type_name[2]), lang_low, declaration)
|
||||
|
||||
p = cor.p_info
|
||||
if 'retro_core_option_v2_category' == struct_type_name[0]:
|
||||
p = cor.p_info_cat
|
||||
p = (cor.p_info_cat if 'retro_core_option_v2_category' == struct_type_name[0] else cor.p_info)
|
||||
offset_construct = construct.start(0)
|
||||
# append localised construct name and ' = {'
|
||||
start = construct.end(1) - offset_construct
|
||||
end = construct.start(2) - offset_construct
|
||||
end = construct.start(4) - offset_construct
|
||||
out_txt = out_txt + new_decl + construct.group(0)[start:end]
|
||||
|
||||
content = construct.group(2)
|
||||
# insert macros
|
||||
content = construct.group(4)
|
||||
new_content = cor.p_option.sub(replace_option, content)
|
||||
|
||||
start = construct.end(2) - offset_construct
|
||||
start = construct.end(4) - offset_construct
|
||||
# append macro-filled content and close the construct
|
||||
out_txt = out_txt + new_content + construct.group(0)[start:] + '\n'
|
||||
|
||||
# for v2
|
||||
@ -574,7 +587,7 @@ def create_intl_file(localisation_file_path: str, intl_dir_path: str, text: str,
|
||||
|
||||
# only write to file, if there is anything worthwhile to write!
|
||||
if overwrite:
|
||||
with open(localisation_file_path, 'w', encoding='utf-8') as intl:
|
||||
with open(intl_file_path, 'w', encoding='utf-8') as intl:
|
||||
intl.write(out_txt + '\n#ifdef __cplusplus\n'
|
||||
'}\n#endif\n'
|
||||
'\n#endif')
|
||||
@ -585,7 +598,7 @@ def create_intl_file(localisation_file_path: str, intl_dir_path: str, text: str,
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
if os.path.isfile(sys.argv[1]):
|
||||
if os.path.isfile(sys.argv[1]) or sys.argv[1].endswith('.h'):
|
||||
_temp = os.path.dirname(sys.argv[1])
|
||||
else:
|
||||
_temp = sys.argv[1]
|
||||
|
@ -6,8 +6,8 @@
|
||||
"files":
|
||||
[
|
||||
{
|
||||
"source": "/intl/_core_name_/_us.json",
|
||||
"source": "/_core_name_/_us.json",
|
||||
"dest": "/_core_name_/_core_name_.json",
|
||||
"translation": "/intl/_core_name_/_%two_letters_code%.json",
|
||||
"translation": "/_core_name_/_%two_letters_code%.json",
|
||||
},
|
||||
]
|
||||
|
@ -4,7 +4,7 @@ import core_option_translation as t
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
if t.os.path.isfile(t.sys.argv[1]):
|
||||
if t.os.path.isfile(t.sys.argv[1]) or t.sys.argv[1].endswith('.h'):
|
||||
_temp = t.os.path.dirname(t.sys.argv[1])
|
||||
else:
|
||||
_temp = t.sys.argv[1]
|
||||
|
@ -4,7 +4,7 @@ import core_option_translation as t
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
if t.os.path.isfile(t.sys.argv[1]):
|
||||
if t.os.path.isfile(t.sys.argv[1]) or t.sys.argv[1].endswith('.h'):
|
||||
_temp = t.os.path.dirname(t.sys.argv[1])
|
||||
else:
|
||||
_temp = t.sys.argv[1]
|
||||
|
@ -21,8 +21,8 @@ if __name__ == '__main__':
|
||||
print('Please provide Crowdin API Token and core name!')
|
||||
raise e
|
||||
|
||||
DIR_PATH = t.os.path.dirname(t.os.path.realpath(__file__))
|
||||
YAML_PATH = t.os.path.join(DIR_PATH, 'crowdin.yaml')
|
||||
DIR_PATH = os.path.dirname(os.path.realpath(__file__))
|
||||
YAML_PATH = os.path.join(DIR_PATH, 'crowdin.yaml')
|
||||
|
||||
# Apply Crowdin API Key
|
||||
with open(YAML_PATH, 'r') as crowdin_config_file:
|
||||
@ -39,22 +39,22 @@ if __name__ == '__main__':
|
||||
try:
|
||||
# Download Crowdin CLI
|
||||
jar_name = 'crowdin-cli.jar'
|
||||
jar_path = t.os.path.join(DIR_PATH, jar_name)
|
||||
jar_path = os.path.join(DIR_PATH, jar_name)
|
||||
crowdin_cli_file = 'crowdin-cli.zip'
|
||||
crowdin_cli_url = 'https://downloads.crowdin.com/cli/v3/' + crowdin_cli_file
|
||||
crowdin_cli_path = t.os.path.join(DIR_PATH, crowdin_cli_file)
|
||||
crowdin_cli_path = os.path.join(DIR_PATH, crowdin_cli_file)
|
||||
|
||||
if not os.path.isfile(t.os.path.join(DIR_PATH, jar_name)):
|
||||
if not os.path.isfile(os.path.join(DIR_PATH, jar_name)):
|
||||
print('download crowdin-cli.jar')
|
||||
urllib.request.urlretrieve(crowdin_cli_url, crowdin_cli_path)
|
||||
with zipfile.ZipFile(crowdin_cli_path, 'r') as zip_ref:
|
||||
jar_dir = t.os.path.join(DIR_PATH, zip_ref.namelist()[0])
|
||||
jar_dir = os.path.join(DIR_PATH, zip_ref.namelist()[0])
|
||||
for file in zip_ref.namelist():
|
||||
if file.endswith(jar_name):
|
||||
jar_file = file
|
||||
break
|
||||
zip_ref.extract(jar_file, path=DIR_PATH)
|
||||
os.rename(t.os.path.join(DIR_PATH, jar_file), jar_path)
|
||||
os.rename(os.path.join(DIR_PATH, jar_file), jar_path)
|
||||
os.remove(crowdin_cli_path)
|
||||
shutil.rmtree(jar_dir)
|
||||
|
||||
@ -81,6 +81,19 @@ if __name__ == '__main__':
|
||||
with open(YAML_PATH, 'w') as crowdin_config_file:
|
||||
crowdin_config_file.write(crowdin_config)
|
||||
|
||||
with open('intl/upload_workflow.py', 'r') as workflow:
|
||||
workflow_config = workflow.read()
|
||||
workflow_config = workflow_config.replace(
|
||||
"subprocess.run(['python3', 'intl/core_option_translation.py', dir_path, core_name])",
|
||||
"subprocess.run(['python3', 'intl/crowdin_prep.py', dir_path, core_name])"
|
||||
)
|
||||
workflow_config = workflow_config.replace(
|
||||
"subprocess.run(['python3', 'intl/initial_sync.py', api_key, core_name])",
|
||||
"subprocess.run(['python3', 'intl/crowdin_source_upload.py', api_key, core_name])"
|
||||
)
|
||||
with open('intl/upload_workflow.py', 'w') as workflow:
|
||||
workflow.write(workflow_config)
|
||||
|
||||
with open('intl/download_workflow.py', 'r') as workflow:
|
||||
workflow_config = workflow.read()
|
||||
workflow_config = workflow_config.replace(
|
||||
|
30
intl/remove_initial_cycle.py
Normal file
30
intl/remove_initial_cycle.py
Normal file
@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
with open('intl/upload_workflow.py', 'r') as workflow:
|
||||
workflow_config = workflow.read()
|
||||
|
||||
workflow_config = workflow_config.replace(
|
||||
"subprocess.run(['python3', 'intl/core_option_translation.py', dir_path, core_name])",
|
||||
"subprocess.run(['python3', 'intl/crowdin_prep.py', dir_path, core_name])"
|
||||
)
|
||||
workflow_config = workflow_config.replace(
|
||||
"subprocess.run(['python3', 'intl/initial_sync.py', api_key, core_name])",
|
||||
"subprocess.run(['python3', 'intl/crowdin_source_upload.py', api_key, core_name])"
|
||||
)
|
||||
with open('intl/upload_workflow.py', 'w') as workflow:
|
||||
workflow.write(workflow_config)
|
||||
|
||||
|
||||
with open('intl/download_workflow.py', 'r') as workflow:
|
||||
workflow_config = workflow.read()
|
||||
|
||||
workflow_config = workflow_config.replace(
|
||||
"subprocess.run(['python3', 'intl/core_option_translation.py', dir_path, core_name])",
|
||||
"subprocess.run(['python3', 'intl/crowdin_prep.py', dir_path, core_name])"
|
||||
)
|
||||
workflow_config = workflow_config.replace(
|
||||
"subprocess.run(['python3', 'intl/initial_sync.py', api_key, core_name])",
|
||||
"subprocess.run(['python3', 'intl/crowdin_translation_download.py', api_key, core_name])"
|
||||
)
|
||||
with open('intl/download_workflow.py', 'w') as workflow:
|
||||
workflow.write(workflow_config)
|
@ -9,7 +9,7 @@ The original files will be preserved as *.v1
|
||||
"""
|
||||
import core_option_regex as cor
|
||||
import os
|
||||
import sys
|
||||
import glob
|
||||
|
||||
|
||||
def create_v2_code_file(struct_text, file_name):
|
||||
@ -379,7 +379,8 @@ def create_v2_code_file(struct_text, file_name):
|
||||
f' option_defs{struct_type_name_lang[2]}\n'
|
||||
'};',
|
||||
construct.group(0)[construct.end(2) - offset:])
|
||||
out_text = cor.re.sub(cor.re.escape(construct.group(0)), repl_text, out_text)
|
||||
out_text = out_text.replace(construct.group(0), repl_text)
|
||||
#out_text = cor.re.sub(cor.re.escape(construct.group(0)), repl_text, raw_out)
|
||||
else:
|
||||
return -2
|
||||
with open(file_name, 'w', encoding='utf-8') as code_file:
|
||||
@ -408,11 +409,19 @@ def create_v2_code_file(struct_text, file_name):
|
||||
' &options_ar, /* RETRO_LANGUAGE_ARABIC */\n' \
|
||||
' &options_el, /* RETRO_LANGUAGE_GREEK */\n' \
|
||||
' &options_tr, /* RETRO_LANGUAGE_TURKISH */\n' \
|
||||
' &options_sv, /* RETRO_LANGUAGE_SLOVAK */\n' \
|
||||
' &options_sk, /* RETRO_LANGUAGE_SLOVAK */\n' \
|
||||
' &options_fa, /* RETRO_LANGUAGE_PERSIAN */\n' \
|
||||
' &options_he, /* RETRO_LANGUAGE_HEBREW */\n' \
|
||||
' &options_ast, /* RETRO_LANGUAGE_ASTURIAN */\n' \
|
||||
' &options_fi, /* RETRO_LANGUAGE_FINNISH */\n' \
|
||||
' &options_id, /* RETRO_LANGUAGE_INDONESIAN */\n' \
|
||||
' &options_sv, /* RETRO_LANGUAGE_SWEDISH */\n' \
|
||||
' &options_uk, /* RETRO_LANGUAGE_UKRAINIAN */\n' \
|
||||
' &options_cs, /* RETRO_LANGUAGE_CZECH */\n' \
|
||||
' &options_val, /* RETRO_LANGUAGE_CATALAN_VALENCIA */\n' \
|
||||
' &options_ca, /* RETRO_LANGUAGE_CATALAN */\n' \
|
||||
' &options_en, /* RETRO_LANGUAGE_BRITISH_ENGLISH */\n' \
|
||||
' &options_hu, /* RETRO_LANGUAGE_HUNGARIAN */\n' \
|
||||
+ out_text[intl.end(2):]
|
||||
out_text = p_set.sub(new_set, new_intl)
|
||||
else:
|
||||
@ -425,21 +434,36 @@ def create_v2_code_file(struct_text, file_name):
|
||||
# -------------------- MAIN -------------------- #
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
if os.path.isfile(sys.argv[1]):
|
||||
_temp = os.path.dirname(sys.argv[1])
|
||||
else:
|
||||
_temp = sys.argv[1]
|
||||
while _temp.endswith('/') or _temp.endswith('\\'):
|
||||
_temp = _temp[:-1]
|
||||
DIR_PATH = _temp
|
||||
except IndexError:
|
||||
DIR_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
|
||||
print("No path provided, assuming parent directory:\n" + DIR_PATH)
|
||||
DIR_PATH = os.path.dirname(os.path.realpath(__file__))
|
||||
if os.path.basename(DIR_PATH) != "intl":
|
||||
raise RuntimeError("Script is not in intl folder!")
|
||||
|
||||
H_FILE_PATH = os.path.join(DIR_PATH, 'libretro_core_options.h')
|
||||
INTL_FILE_PATH = os.path.join(DIR_PATH, 'libretro_core_options_intl.h')
|
||||
BASE_PATH = os.path.dirname(DIR_PATH)
|
||||
CORE_OP_FILE = os.path.join(BASE_PATH, "**", "libretro_core_options.h")
|
||||
|
||||
core_options_hits = glob.glob(CORE_OP_FILE, recursive=True)
|
||||
|
||||
if len(core_options_hits) == 0:
|
||||
raise RuntimeError("libretro_core_options.h not found!")
|
||||
elif len(core_options_hits) > 1:
|
||||
print("More than one libretro_core_options.h file found:\n\n")
|
||||
for i, file in enumerate(core_options_hits):
|
||||
print(f"{i} {file}\n")
|
||||
|
||||
while True:
|
||||
user_choice = input("Please choose one ('q' will exit): ")
|
||||
if user_choice == 'q':
|
||||
exit(0)
|
||||
elif user_choice.isdigit():
|
||||
core_op_file = core_options_hits[int(user_choice)]
|
||||
break
|
||||
else:
|
||||
print("Please make a valid choice!\n\n")
|
||||
else:
|
||||
core_op_file = core_options_hits[0]
|
||||
|
||||
H_FILE_PATH = core_op_file
|
||||
INTL_FILE_PATH = core_op_file.replace("libretro_core_options.h", 'libretro_core_options_intl.h')
|
||||
for file in (H_FILE_PATH, INTL_FILE_PATH):
|
||||
if os.path.isfile(file):
|
||||
with open(file, 'r+', encoding='utf-8') as h_file:
|
||||
|
@ -286,6 +286,11 @@ enum retro_language
|
||||
RETRO_LANGUAGE_INDONESIAN = 24,
|
||||
RETRO_LANGUAGE_SWEDISH = 25,
|
||||
RETRO_LANGUAGE_UKRAINIAN = 26,
|
||||
RETRO_LANGUAGE_CZECH = 27,
|
||||
RETRO_LANGUAGE_CATALAN_VALENCIA = 28,
|
||||
RETRO_LANGUAGE_CATALAN = 29,
|
||||
RETRO_LANGUAGE_BRITISH_ENGLISH = 30,
|
||||
RETRO_LANGUAGE_HUNGARIAN = 31,
|
||||
RETRO_LANGUAGE_LAST,
|
||||
|
||||
/* Ensure sizeof(enum) == sizeof(int) */
|
||||
@ -1756,6 +1761,12 @@ enum retro_mod
|
||||
* the frontend is attempting to call retro_run().
|
||||
*/
|
||||
|
||||
#define RETRO_ENVIRONMENT_GET_SAVESTATE_CONTEXT (72 | RETRO_ENVIRONMENT_EXPERIMENTAL)
|
||||
/* int * --
|
||||
* Tells the core about the context the frontend is asking for savestate.
|
||||
* (see enum retro_savestate_context)
|
||||
*/
|
||||
|
||||
/* VFS functionality */
|
||||
|
||||
/* File paths:
|
||||
@ -2993,6 +3004,35 @@ enum retro_pixel_format
|
||||
RETRO_PIXEL_FORMAT_UNKNOWN = INT_MAX
|
||||
};
|
||||
|
||||
enum retro_savestate_context
|
||||
{
|
||||
/* Standard savestate written to disk. */
|
||||
RETRO_SAVESTATE_CONTEXT_NORMAL = 0,
|
||||
|
||||
/* Savestate where you are guaranteed that the same instance will load the save state.
|
||||
* You can store internal pointers to code or data.
|
||||
* It's still a full serialization and deserialization, and could be loaded or saved at any time.
|
||||
* It won't be written to disk or sent over the network.
|
||||
*/
|
||||
RETRO_SAVESTATE_CONTEXT_RUNAHEAD_SAME_INSTANCE = 1,
|
||||
|
||||
/* Savestate where you are guaranteed that the same emulator binary will load that savestate.
|
||||
* You can skip anything that would slow down saving or loading state but you can not store internal pointers.
|
||||
* It won't be written to disk or sent over the network.
|
||||
* Example: "Second Instance" runahead
|
||||
*/
|
||||
RETRO_SAVESTATE_CONTEXT_RUNAHEAD_SAME_BINARY = 2,
|
||||
|
||||
/* Savestate used within a rollback netplay feature.
|
||||
* You should skip anything that would unnecessarily increase bandwidth usage.
|
||||
* It won't be written to disk but it will be sent over the network.
|
||||
*/
|
||||
RETRO_SAVESTATE_CONTEXT_ROLLBACK_NETPLAY = 3,
|
||||
|
||||
/* Ensure sizeof() == sizeof(int). */
|
||||
RETRO_SAVESTATE_CONTEXT_UNKNOWN = INT_MAX
|
||||
};
|
||||
|
||||
struct retro_message
|
||||
{
|
||||
const char *msg; /* Message to be displayed. */
|
||||
|
@ -316,14 +316,14 @@ struct retro_core_options_v2 options_ast = {
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_CA NULL
|
||||
#define PRBOOM_RESOLUTION_INFO_0_CA NULL
|
||||
#define OPTION_VAL_320X200_CA NULL
|
||||
#define OPTION_VAL_640X400_CA NULL
|
||||
#define OPTION_VAL_960X600_CA NULL
|
||||
#define OPTION_VAL_1280X800_CA NULL
|
||||
#define OPTION_VAL_1600X1000_CA NULL
|
||||
#define OPTION_VAL_1920X1200_CA NULL
|
||||
#define OPTION_VAL_2240X1400_CA NULL
|
||||
#define OPTION_VAL_2560X1600_CA NULL
|
||||
#define OPTION_VAL_320X200_CA "320×200"
|
||||
#define OPTION_VAL_640X400_CA "640×400"
|
||||
#define OPTION_VAL_960X600_CA "960×600"
|
||||
#define OPTION_VAL_1280X800_CA "1280×800"
|
||||
#define OPTION_VAL_1600X1000_CA "1600×1000"
|
||||
#define OPTION_VAL_1920X1200_CA "1920×1200"
|
||||
#define OPTION_VAL_2240X1400_CA "2240×1400"
|
||||
#define OPTION_VAL_2560X1600_CA "2560×1600"
|
||||
#define PRBOOM_MOUSE_ON_LABEL_CA NULL
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_CA NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_CA NULL
|
||||
@ -608,7 +608,7 @@ struct retro_core_options_v2 options_chs = {
|
||||
|
||||
/* RETRO_LANGUAGE_CHT */
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_CHT NULL
|
||||
#define PRBOOM_RESOLUTION_LABEL_CHT "內部解析度 (需要重新啟動)"
|
||||
#define PRBOOM_RESOLUTION_INFO_0_CHT NULL
|
||||
#define OPTION_VAL_320X200_CHT NULL
|
||||
#define OPTION_VAL_640X400_CHT NULL
|
||||
@ -755,8 +755,8 @@ struct retro_core_options_v2 options_cht = {
|
||||
|
||||
/* RETRO_LANGUAGE_CS */
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_CS NULL
|
||||
#define PRBOOM_RESOLUTION_INFO_0_CS NULL
|
||||
#define PRBOOM_RESOLUTION_LABEL_CS "Internal resolution (Vyžaduje restart)"
|
||||
#define PRBOOM_RESOLUTION_INFO_0_CS "Konfigurace rozlišení."
|
||||
#define OPTION_VAL_320X200_CS NULL
|
||||
#define OPTION_VAL_640X400_CS NULL
|
||||
#define OPTION_VAL_960X600_CS NULL
|
||||
@ -765,16 +765,16 @@ struct retro_core_options_v2 options_cht = {
|
||||
#define OPTION_VAL_1920X1200_CS NULL
|
||||
#define OPTION_VAL_2240X1400_CS NULL
|
||||
#define OPTION_VAL_2560X1600_CS NULL
|
||||
#define PRBOOM_MOUSE_ON_LABEL_CS NULL
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_CS NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_CS NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_CS NULL
|
||||
#define PRBOOM_RUMBLE_LABEL_CS NULL
|
||||
#define PRBOOM_RUMBLE_INFO_0_CS NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_CS NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_INFO_0_CS NULL
|
||||
#define PRBOOM_PURGE_LIMIT_LABEL_CS NULL
|
||||
#define PRBOOM_PURGE_LIMIT_INFO_0_CS NULL
|
||||
#define PRBOOM_MOUSE_ON_LABEL_CS "Aktivní Myš při Použití Gamepadu"
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_CS "Umožňuje používat vstupy myši, i když typ zařízení uživatele 1 není nastaven na 'RetroKlávesnice/Myš'."
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_CS "Prohlédnout si nadřazené složky IWADs"
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_CS "Prohledá nadřazené složky a vyhledá v nich soubory IWAD. POZNÁMKA: Pokud chcete spustit SIGIL, musíte tuto funkci zakázat."
|
||||
#define PRBOOM_RUMBLE_LABEL_CS "Rázové Efekty"
|
||||
#define PRBOOM_RUMBLE_INFO_0_CS "Povoluje haptickou zpětnou vazbu při použití gamepadu vybaveného funkcí vibrace."
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_CS "Analogová Mrtvá Zóna (Procenta)"
|
||||
#define PRBOOM_ANALOG_DEADZONE_INFO_0_CS "Nastaví zónu odpojení analogových páček gamepadu, když je typ vstupního zařízení nastaven na 'Gamepad Modern'."
|
||||
#define PRBOOM_PURGE_LIMIT_LABEL_CS "Velikost Cache"
|
||||
#define PRBOOM_PURGE_LIMIT_INFO_0_CS "Nastavuje limit velikosti paměťového fondu používaného k ukládání herních prostředků do mezipaměti. Malé hodnoty mohou způsobit zadrhávání při procházení velkých map."
|
||||
#define OPTION_VAL_8_CS NULL
|
||||
#define OPTION_VAL_12_CS NULL
|
||||
#define OPTION_VAL_16_CS NULL
|
||||
@ -1197,7 +1197,7 @@ struct retro_core_options_v2 options_da = {
|
||||
/* RETRO_LANGUAGE_DE */
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_DE "Interne Auflösung (Neustart erforderlich)"
|
||||
#define PRBOOM_RESOLUTION_INFO_0_DE NULL
|
||||
#define PRBOOM_RESOLUTION_INFO_0_DE "Die Auflösung konfigurieren."
|
||||
#define OPTION_VAL_320X200_DE "320 x 200"
|
||||
#define OPTION_VAL_640X400_DE "640 x 400"
|
||||
#define OPTION_VAL_960X600_DE "960 x 600"
|
||||
@ -1206,16 +1206,16 @@ struct retro_core_options_v2 options_da = {
|
||||
#define OPTION_VAL_1920X1200_DE "1920 x 1200"
|
||||
#define OPTION_VAL_2240X1400_DE "2240 x 1400"
|
||||
#define OPTION_VAL_2560X1600_DE "2560 x 1600"
|
||||
#define PRBOOM_MOUSE_ON_LABEL_DE NULL
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_DE NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_DE NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_DE NULL
|
||||
#define PRBOOM_MOUSE_ON_LABEL_DE "Maus aktiv bei Verwendung von Gamepad"
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_DE "Erlaubt die Verwendung von Mauseingaben, auch wenn der Gerätetyp des Benutzers 1 nicht auf „RetroKeyboard/Maus“ gesetzt ist."
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_DE "In übergeordnete Ordnern nach IWADs suchen"
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_DE "Scannt übergeordnete Ordner nach IWADs. HINWEIS: Dies muss deaktiviert werden, wenn SIGIL ausführen wird."
|
||||
#define PRBOOM_RUMBLE_LABEL_DE "Rumpel-Effekte"
|
||||
#define PRBOOM_RUMBLE_INFO_0_DE NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_DE NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_INFO_0_DE NULL
|
||||
#define PRBOOM_PURGE_LIMIT_LABEL_DE NULL
|
||||
#define PRBOOM_PURGE_LIMIT_INFO_0_DE NULL
|
||||
#define PRBOOM_RUMBLE_INFO_0_DE "Aktiviert haptisches Feedback bei Verwendung eines mit Vibration ausgestatteten Gamepads."
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_DE "Analoge Deadzone (Prozent)"
|
||||
#define PRBOOM_ANALOG_DEADZONE_INFO_0_DE "Legt die Deadzone der Analogsticks vom Gamepad fest, wenn der Eingabegerätetyp auf „Gamepad Modern“ gesetzt ist."
|
||||
#define PRBOOM_PURGE_LIMIT_LABEL_DE "Cachegröße"
|
||||
#define PRBOOM_PURGE_LIMIT_INFO_0_DE "Legt eine Grenze für die Größe des Speicherpools fest, der zum Zwischenspeichern von Spielelementen verwendet wird. Kleine Werte können beim Navigieren auf großen Karten zum Stottern führen."
|
||||
#define OPTION_VAL_8_DE NULL
|
||||
#define OPTION_VAL_12_DE NULL
|
||||
#define OPTION_VAL_16_DE NULL
|
||||
@ -1488,6 +1488,153 @@ struct retro_core_options_v2 options_el = {
|
||||
option_defs_el
|
||||
};
|
||||
|
||||
/* RETRO_LANGUAGE_EN */
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_EN NULL
|
||||
#define PRBOOM_RESOLUTION_INFO_0_EN NULL
|
||||
#define OPTION_VAL_320X200_EN NULL
|
||||
#define OPTION_VAL_640X400_EN NULL
|
||||
#define OPTION_VAL_960X600_EN NULL
|
||||
#define OPTION_VAL_1280X800_EN NULL
|
||||
#define OPTION_VAL_1600X1000_EN NULL
|
||||
#define OPTION_VAL_1920X1200_EN NULL
|
||||
#define OPTION_VAL_2240X1400_EN NULL
|
||||
#define OPTION_VAL_2560X1600_EN NULL
|
||||
#define PRBOOM_MOUSE_ON_LABEL_EN NULL
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_EN NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_EN NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_EN NULL
|
||||
#define PRBOOM_RUMBLE_LABEL_EN NULL
|
||||
#define PRBOOM_RUMBLE_INFO_0_EN NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_EN "Analogue Dead-zone (Percent)"
|
||||
#define PRBOOM_ANALOG_DEADZONE_INFO_0_EN "Sets the dead-zone of the gamepad analogue sticks when the input device type is set to 'Gamepad Modern'."
|
||||
#define PRBOOM_PURGE_LIMIT_LABEL_EN NULL
|
||||
#define PRBOOM_PURGE_LIMIT_INFO_0_EN NULL
|
||||
#define OPTION_VAL_8_EN NULL
|
||||
#define OPTION_VAL_12_EN NULL
|
||||
#define OPTION_VAL_16_EN NULL
|
||||
#define OPTION_VAL_24_EN NULL
|
||||
#define OPTION_VAL_32_EN NULL
|
||||
#define OPTION_VAL_48_EN NULL
|
||||
#define OPTION_VAL_64_EN NULL
|
||||
#define OPTION_VAL_128_EN NULL
|
||||
#define OPTION_VAL_256_EN NULL
|
||||
|
||||
struct retro_core_option_v2_category option_cats_en[] = {
|
||||
{ NULL, NULL, NULL },
|
||||
};
|
||||
struct retro_core_option_v2_definition option_defs_en[] = {
|
||||
{
|
||||
"prboom-resolution",
|
||||
PRBOOM_RESOLUTION_LABEL_EN,
|
||||
NULL,
|
||||
PRBOOM_RESOLUTION_INFO_0_EN,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "320x200", OPTION_VAL_320X200_EN },
|
||||
{ "640x400", OPTION_VAL_640X400_EN },
|
||||
{ "960x600", OPTION_VAL_960X600_EN },
|
||||
{ "1280x800", OPTION_VAL_1280X800_EN },
|
||||
{ "1600x1000", OPTION_VAL_1600X1000_EN },
|
||||
{ "1920x1200", OPTION_VAL_1920X1200_EN },
|
||||
{ "2240x1400", OPTION_VAL_2240X1400_EN },
|
||||
{ "2560x1600", OPTION_VAL_2560X1600_EN },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"320x200"
|
||||
},
|
||||
{
|
||||
"prboom-mouse_on",
|
||||
PRBOOM_MOUSE_ON_LABEL_EN,
|
||||
NULL,
|
||||
PRBOOM_MOUSE_ON_INFO_0_EN,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"prboom-find_recursive_on",
|
||||
PRBOOM_FIND_RECURSIVE_ON_LABEL_EN,
|
||||
NULL,
|
||||
PRBOOM_FIND_RECURSIVE_ON_INFO_0_EN,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"prboom-rumble",
|
||||
PRBOOM_RUMBLE_LABEL_EN,
|
||||
NULL,
|
||||
PRBOOM_RUMBLE_INFO_0_EN,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"prboom-analog_deadzone",
|
||||
PRBOOM_ANALOG_DEADZONE_LABEL_EN,
|
||||
NULL,
|
||||
PRBOOM_ANALOG_DEADZONE_INFO_0_EN,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "0", NULL },
|
||||
{ "5", NULL },
|
||||
{ "10", NULL },
|
||||
{ "15", NULL },
|
||||
{ "20", NULL },
|
||||
{ "25", NULL },
|
||||
{ "30", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"15"
|
||||
},
|
||||
#if defined(MEMORY_LOW)
|
||||
{
|
||||
"prboom-purge_limit",
|
||||
PRBOOM_PURGE_LIMIT_LABEL_EN,
|
||||
NULL,
|
||||
PRBOOM_PURGE_LIMIT_INFO_0_EN,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "8", OPTION_VAL_8_EN },
|
||||
{ "12", OPTION_VAL_12_EN },
|
||||
{ "16", OPTION_VAL_16_EN },
|
||||
{ "24", OPTION_VAL_24_EN },
|
||||
{ "32", OPTION_VAL_32_EN },
|
||||
{ "48", OPTION_VAL_48_EN },
|
||||
{ "64", OPTION_VAL_64_EN },
|
||||
{ "128", OPTION_VAL_128_EN },
|
||||
{ "256", OPTION_VAL_256_EN },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"16"
|
||||
},
|
||||
#endif
|
||||
{ NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL },
|
||||
};
|
||||
struct retro_core_options_v2 options_en = {
|
||||
option_cats_en,
|
||||
option_defs_en
|
||||
};
|
||||
|
||||
/* RETRO_LANGUAGE_EO */
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_EO NULL
|
||||
@ -2517,10 +2664,157 @@ struct retro_core_options_v2 options_he = {
|
||||
option_defs_he
|
||||
};
|
||||
|
||||
/* RETRO_LANGUAGE_HR */
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_HR NULL
|
||||
#define PRBOOM_RESOLUTION_INFO_0_HR NULL
|
||||
#define OPTION_VAL_320X200_HR NULL
|
||||
#define OPTION_VAL_640X400_HR NULL
|
||||
#define OPTION_VAL_960X600_HR NULL
|
||||
#define OPTION_VAL_1280X800_HR NULL
|
||||
#define OPTION_VAL_1600X1000_HR NULL
|
||||
#define OPTION_VAL_1920X1200_HR NULL
|
||||
#define OPTION_VAL_2240X1400_HR NULL
|
||||
#define OPTION_VAL_2560X1600_HR NULL
|
||||
#define PRBOOM_MOUSE_ON_LABEL_HR NULL
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_HR NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_HR NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_HR NULL
|
||||
#define PRBOOM_RUMBLE_LABEL_HR NULL
|
||||
#define PRBOOM_RUMBLE_INFO_0_HR NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_HR NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_INFO_0_HR NULL
|
||||
#define PRBOOM_PURGE_LIMIT_LABEL_HR NULL
|
||||
#define PRBOOM_PURGE_LIMIT_INFO_0_HR NULL
|
||||
#define OPTION_VAL_8_HR NULL
|
||||
#define OPTION_VAL_12_HR NULL
|
||||
#define OPTION_VAL_16_HR NULL
|
||||
#define OPTION_VAL_24_HR NULL
|
||||
#define OPTION_VAL_32_HR NULL
|
||||
#define OPTION_VAL_48_HR NULL
|
||||
#define OPTION_VAL_64_HR NULL
|
||||
#define OPTION_VAL_128_HR NULL
|
||||
#define OPTION_VAL_256_HR NULL
|
||||
|
||||
struct retro_core_option_v2_category option_cats_hr[] = {
|
||||
{ NULL, NULL, NULL },
|
||||
};
|
||||
struct retro_core_option_v2_definition option_defs_hr[] = {
|
||||
{
|
||||
"prboom-resolution",
|
||||
PRBOOM_RESOLUTION_LABEL_HR,
|
||||
NULL,
|
||||
PRBOOM_RESOLUTION_INFO_0_HR,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "320x200", OPTION_VAL_320X200_HR },
|
||||
{ "640x400", OPTION_VAL_640X400_HR },
|
||||
{ "960x600", OPTION_VAL_960X600_HR },
|
||||
{ "1280x800", OPTION_VAL_1280X800_HR },
|
||||
{ "1600x1000", OPTION_VAL_1600X1000_HR },
|
||||
{ "1920x1200", OPTION_VAL_1920X1200_HR },
|
||||
{ "2240x1400", OPTION_VAL_2240X1400_HR },
|
||||
{ "2560x1600", OPTION_VAL_2560X1600_HR },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"320x200"
|
||||
},
|
||||
{
|
||||
"prboom-mouse_on",
|
||||
PRBOOM_MOUSE_ON_LABEL_HR,
|
||||
NULL,
|
||||
PRBOOM_MOUSE_ON_INFO_0_HR,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"prboom-find_recursive_on",
|
||||
PRBOOM_FIND_RECURSIVE_ON_LABEL_HR,
|
||||
NULL,
|
||||
PRBOOM_FIND_RECURSIVE_ON_INFO_0_HR,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"prboom-rumble",
|
||||
PRBOOM_RUMBLE_LABEL_HR,
|
||||
NULL,
|
||||
PRBOOM_RUMBLE_INFO_0_HR,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"prboom-analog_deadzone",
|
||||
PRBOOM_ANALOG_DEADZONE_LABEL_HR,
|
||||
NULL,
|
||||
PRBOOM_ANALOG_DEADZONE_INFO_0_HR,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "0", NULL },
|
||||
{ "5", NULL },
|
||||
{ "10", NULL },
|
||||
{ "15", NULL },
|
||||
{ "20", NULL },
|
||||
{ "25", NULL },
|
||||
{ "30", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"15"
|
||||
},
|
||||
#if defined(MEMORY_LOW)
|
||||
{
|
||||
"prboom-purge_limit",
|
||||
PRBOOM_PURGE_LIMIT_LABEL_HR,
|
||||
NULL,
|
||||
PRBOOM_PURGE_LIMIT_INFO_0_HR,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "8", OPTION_VAL_8_HR },
|
||||
{ "12", OPTION_VAL_12_HR },
|
||||
{ "16", OPTION_VAL_16_HR },
|
||||
{ "24", OPTION_VAL_24_HR },
|
||||
{ "32", OPTION_VAL_32_HR },
|
||||
{ "48", OPTION_VAL_48_HR },
|
||||
{ "64", OPTION_VAL_64_HR },
|
||||
{ "128", OPTION_VAL_128_HR },
|
||||
{ "256", OPTION_VAL_256_HR },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"16"
|
||||
},
|
||||
#endif
|
||||
{ NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL },
|
||||
};
|
||||
struct retro_core_options_v2 options_hr = {
|
||||
option_cats_hr,
|
||||
option_defs_hr
|
||||
};
|
||||
|
||||
/* RETRO_LANGUAGE_HU */
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_HU NULL
|
||||
#define PRBOOM_RESOLUTION_INFO_0_HU NULL
|
||||
#define PRBOOM_RESOLUTION_LABEL_HU "Belső felbontás (újraindítás szükséges)"
|
||||
#define PRBOOM_RESOLUTION_INFO_0_HU "A felbontás beállítása."
|
||||
#define OPTION_VAL_320X200_HU NULL
|
||||
#define OPTION_VAL_640X400_HU NULL
|
||||
#define OPTION_VAL_960X600_HU NULL
|
||||
@ -2529,16 +2823,16 @@ struct retro_core_options_v2 options_he = {
|
||||
#define OPTION_VAL_1920X1200_HU NULL
|
||||
#define OPTION_VAL_2240X1400_HU NULL
|
||||
#define OPTION_VAL_2560X1600_HU NULL
|
||||
#define PRBOOM_MOUSE_ON_LABEL_HU NULL
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_HU NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_HU NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_HU NULL
|
||||
#define PRBOOM_RUMBLE_LABEL_HU NULL
|
||||
#define PRBOOM_RUMBLE_INFO_0_HU NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_HU NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_INFO_0_HU NULL
|
||||
#define PRBOOM_PURGE_LIMIT_LABEL_HU NULL
|
||||
#define PRBOOM_PURGE_LIMIT_INFO_0_HU NULL
|
||||
#define PRBOOM_MOUSE_ON_LABEL_HU "Kontroller használatakor is aktív egér"
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_HU "Ha az 1. felhasználó eszköztípusa nem \"Billentyűzet/Egér\", akkor is engedélyezi az egérbemenetet."
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_HU "IWAD-ok keresése a könyvtárstruktúrában feljebb"
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_HU "A könyvtárstruktúrában felfele keresi az IWAD-okat. Figyelem: ezt SIGIL futtatása esetén ki kell kapcsolni."
|
||||
#define PRBOOM_RUMBLE_LABEL_HU "Rezgő effektek"
|
||||
#define PRBOOM_RUMBLE_INFO_0_HU "Engedélyezi a tapintható visszajelzést rezgőmotorral ellátott kontrollereknél."
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_HU "Analóg holtsáv (százalék)"
|
||||
#define PRBOOM_ANALOG_DEADZONE_INFO_0_HU "A kontroller analóg karjainak holtsávját állítja, ha a bemeneti eszköz típusa \"Gamepad Modern\"."
|
||||
#define PRBOOM_PURGE_LIMIT_LABEL_HU "Gyorsítótár mérete"
|
||||
#define PRBOOM_PURGE_LIMIT_INFO_0_HU "A játék tartalmaihoz használt memória-gyorsítótár felső korlátja. Kis értékek döcögősséget okozhatnak nagy térképeken közlekedés esetén."
|
||||
#define OPTION_VAL_8_HU NULL
|
||||
#define OPTION_VAL_12_HU NULL
|
||||
#define OPTION_VAL_16_HU NULL
|
||||
@ -3414,7 +3708,7 @@ struct retro_core_options_v2 options_mt = {
|
||||
#define PRBOOM_MOUSE_ON_LABEL_NL NULL
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_NL NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_NL NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_NL NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_NL "Scant bovenliggende folders voor IWADs. LET OP: U moet dit uitschakelen als u SIGIL wilt uitvoeren."
|
||||
#define PRBOOM_RUMBLE_LABEL_NL NULL
|
||||
#define PRBOOM_RUMBLE_INFO_0_NL NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_NL NULL
|
||||
@ -4281,153 +4575,6 @@ struct retro_core_options_v2 options_pt_pt = {
|
||||
option_defs_pt_pt
|
||||
};
|
||||
|
||||
/* RETRO_LANGUAGE_RO */
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_RO NULL
|
||||
#define PRBOOM_RESOLUTION_INFO_0_RO NULL
|
||||
#define OPTION_VAL_320X200_RO NULL
|
||||
#define OPTION_VAL_640X400_RO NULL
|
||||
#define OPTION_VAL_960X600_RO NULL
|
||||
#define OPTION_VAL_1280X800_RO NULL
|
||||
#define OPTION_VAL_1600X1000_RO NULL
|
||||
#define OPTION_VAL_1920X1200_RO NULL
|
||||
#define OPTION_VAL_2240X1400_RO NULL
|
||||
#define OPTION_VAL_2560X1600_RO NULL
|
||||
#define PRBOOM_MOUSE_ON_LABEL_RO NULL
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_RO NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_RO NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_RO NULL
|
||||
#define PRBOOM_RUMBLE_LABEL_RO NULL
|
||||
#define PRBOOM_RUMBLE_INFO_0_RO NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_RO NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_INFO_0_RO NULL
|
||||
#define PRBOOM_PURGE_LIMIT_LABEL_RO NULL
|
||||
#define PRBOOM_PURGE_LIMIT_INFO_0_RO NULL
|
||||
#define OPTION_VAL_8_RO NULL
|
||||
#define OPTION_VAL_12_RO NULL
|
||||
#define OPTION_VAL_16_RO NULL
|
||||
#define OPTION_VAL_24_RO NULL
|
||||
#define OPTION_VAL_32_RO NULL
|
||||
#define OPTION_VAL_48_RO NULL
|
||||
#define OPTION_VAL_64_RO NULL
|
||||
#define OPTION_VAL_128_RO NULL
|
||||
#define OPTION_VAL_256_RO NULL
|
||||
|
||||
struct retro_core_option_v2_category option_cats_ro[] = {
|
||||
{ NULL, NULL, NULL },
|
||||
};
|
||||
struct retro_core_option_v2_definition option_defs_ro[] = {
|
||||
{
|
||||
"prboom-resolution",
|
||||
PRBOOM_RESOLUTION_LABEL_RO,
|
||||
NULL,
|
||||
PRBOOM_RESOLUTION_INFO_0_RO,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "320x200", OPTION_VAL_320X200_RO },
|
||||
{ "640x400", OPTION_VAL_640X400_RO },
|
||||
{ "960x600", OPTION_VAL_960X600_RO },
|
||||
{ "1280x800", OPTION_VAL_1280X800_RO },
|
||||
{ "1600x1000", OPTION_VAL_1600X1000_RO },
|
||||
{ "1920x1200", OPTION_VAL_1920X1200_RO },
|
||||
{ "2240x1400", OPTION_VAL_2240X1400_RO },
|
||||
{ "2560x1600", OPTION_VAL_2560X1600_RO },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"320x200"
|
||||
},
|
||||
{
|
||||
"prboom-mouse_on",
|
||||
PRBOOM_MOUSE_ON_LABEL_RO,
|
||||
NULL,
|
||||
PRBOOM_MOUSE_ON_INFO_0_RO,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"prboom-find_recursive_on",
|
||||
PRBOOM_FIND_RECURSIVE_ON_LABEL_RO,
|
||||
NULL,
|
||||
PRBOOM_FIND_RECURSIVE_ON_INFO_0_RO,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"enabled"
|
||||
},
|
||||
{
|
||||
"prboom-rumble",
|
||||
PRBOOM_RUMBLE_LABEL_RO,
|
||||
NULL,
|
||||
PRBOOM_RUMBLE_INFO_0_RO,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "disabled", NULL },
|
||||
{ "enabled", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"disabled"
|
||||
},
|
||||
{
|
||||
"prboom-analog_deadzone",
|
||||
PRBOOM_ANALOG_DEADZONE_LABEL_RO,
|
||||
NULL,
|
||||
PRBOOM_ANALOG_DEADZONE_INFO_0_RO,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "0", NULL },
|
||||
{ "5", NULL },
|
||||
{ "10", NULL },
|
||||
{ "15", NULL },
|
||||
{ "20", NULL },
|
||||
{ "25", NULL },
|
||||
{ "30", NULL },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"15"
|
||||
},
|
||||
#if defined(MEMORY_LOW)
|
||||
{
|
||||
"prboom-purge_limit",
|
||||
PRBOOM_PURGE_LIMIT_LABEL_RO,
|
||||
NULL,
|
||||
PRBOOM_PURGE_LIMIT_INFO_0_RO,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
{ "8", OPTION_VAL_8_RO },
|
||||
{ "12", OPTION_VAL_12_RO },
|
||||
{ "16", OPTION_VAL_16_RO },
|
||||
{ "24", OPTION_VAL_24_RO },
|
||||
{ "32", OPTION_VAL_32_RO },
|
||||
{ "48", OPTION_VAL_48_RO },
|
||||
{ "64", OPTION_VAL_64_RO },
|
||||
{ "128", OPTION_VAL_128_RO },
|
||||
{ "256", OPTION_VAL_256_RO },
|
||||
{ NULL, NULL },
|
||||
},
|
||||
"16"
|
||||
},
|
||||
#endif
|
||||
{ NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL },
|
||||
};
|
||||
struct retro_core_options_v2 options_ro = {
|
||||
option_cats_ro,
|
||||
option_defs_ro
|
||||
};
|
||||
|
||||
/* RETRO_LANGUAGE_RU */
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_RU "Внутреннее разрешение (требуется перезапуск)"
|
||||
@ -5312,9 +5459,9 @@ struct retro_core_options_v2 options_tr = {
|
||||
|
||||
/* RETRO_LANGUAGE_UK */
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_UK NULL
|
||||
#define PRBOOM_RESOLUTION_INFO_0_UK NULL
|
||||
#define OPTION_VAL_320X200_UK NULL
|
||||
#define PRBOOM_RESOLUTION_LABEL_UK "Роздільна здатність (потрібний перезапуск)"
|
||||
#define PRBOOM_RESOLUTION_INFO_0_UK "Налаштування роздільної здатності."
|
||||
#define OPTION_VAL_320X200_UK "320х200"
|
||||
#define OPTION_VAL_640X400_UK NULL
|
||||
#define OPTION_VAL_960X600_UK NULL
|
||||
#define OPTION_VAL_1280X800_UK NULL
|
||||
@ -5322,25 +5469,25 @@ struct retro_core_options_v2 options_tr = {
|
||||
#define OPTION_VAL_1920X1200_UK NULL
|
||||
#define OPTION_VAL_2240X1400_UK NULL
|
||||
#define OPTION_VAL_2560X1600_UK NULL
|
||||
#define PRBOOM_MOUSE_ON_LABEL_UK NULL
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_UK NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_UK NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_UK NULL
|
||||
#define PRBOOM_RUMBLE_LABEL_UK NULL
|
||||
#define PRBOOM_RUMBLE_INFO_0_UK NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_UK NULL
|
||||
#define PRBOOM_ANALOG_DEADZONE_INFO_0_UK NULL
|
||||
#define PRBOOM_PURGE_LIMIT_LABEL_UK NULL
|
||||
#define PRBOOM_PURGE_LIMIT_INFO_0_UK NULL
|
||||
#define OPTION_VAL_8_UK NULL
|
||||
#define OPTION_VAL_12_UK NULL
|
||||
#define OPTION_VAL_16_UK NULL
|
||||
#define OPTION_VAL_24_UK NULL
|
||||
#define OPTION_VAL_32_UK NULL
|
||||
#define OPTION_VAL_48_UK NULL
|
||||
#define OPTION_VAL_64_UK NULL
|
||||
#define OPTION_VAL_128_UK NULL
|
||||
#define OPTION_VAL_256_UK NULL
|
||||
#define PRBOOM_MOUSE_ON_LABEL_UK "Миша активна під час використання геймпаду"
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_UK "Дозволяє використовувати введення мишею, навіть коли для Користувача 1 тип пристрою не налаштований як 'Ретро клавіатура/Миша'."
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_UK "Пошук в батьківських теках для IWAD"
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_INFO_0_UK "Сканує батьківські папки для IWADs. ПРИМІТКА: Вам необхідно вимкнути це, якщо ви хочете запустити SIGIL."
|
||||
#define PRBOOM_RUMBLE_LABEL_UK "Бойові ефекти"
|
||||
#define PRBOOM_RUMBLE_INFO_0_UK "Включає вібрацію при використанні сумісного геймпаду."
|
||||
#define PRBOOM_ANALOG_DEADZONE_LABEL_UK "Мертва зона аналогу (Відсоток)"
|
||||
#define PRBOOM_ANALOG_DEADZONE_INFO_0_UK "Встановлює мертву зону аналогу, якщо тип пристрою для вводу встановлено на 'Сучасний геймпад'."
|
||||
#define PRBOOM_PURGE_LIMIT_LABEL_UK "Розмір кешу"
|
||||
#define PRBOOM_PURGE_LIMIT_INFO_0_UK "Встановлює обмеження на розмір пам'яті, який використовується для кешування ігрових активів. Малі значення можуть спричинити заїкання під час навігації великими картами."
|
||||
#define OPTION_VAL_8_UK "8 МБ"
|
||||
#define OPTION_VAL_12_UK "12 МБ"
|
||||
#define OPTION_VAL_16_UK "16 МБ"
|
||||
#define OPTION_VAL_24_UK "24 МБ"
|
||||
#define OPTION_VAL_32_UK "32 МБ"
|
||||
#define OPTION_VAL_48_UK "48 МБ"
|
||||
#define OPTION_VAL_64_UK "64 МБ"
|
||||
#define OPTION_VAL_128_UK "128 МБ"
|
||||
#define OPTION_VAL_256_UK "256 МБ"
|
||||
|
||||
struct retro_core_option_v2_category option_cats_uk[] = {
|
||||
{ NULL, NULL, NULL },
|
||||
@ -5461,14 +5608,14 @@ struct retro_core_options_v2 options_uk = {
|
||||
|
||||
#define PRBOOM_RESOLUTION_LABEL_VAL NULL
|
||||
#define PRBOOM_RESOLUTION_INFO_0_VAL NULL
|
||||
#define OPTION_VAL_320X200_VAL NULL
|
||||
#define OPTION_VAL_640X400_VAL NULL
|
||||
#define OPTION_VAL_960X600_VAL NULL
|
||||
#define OPTION_VAL_1280X800_VAL NULL
|
||||
#define OPTION_VAL_1600X1000_VAL NULL
|
||||
#define OPTION_VAL_1920X1200_VAL NULL
|
||||
#define OPTION_VAL_2240X1400_VAL NULL
|
||||
#define OPTION_VAL_2560X1600_VAL NULL
|
||||
#define OPTION_VAL_320X200_VAL "320×200"
|
||||
#define OPTION_VAL_640X400_VAL "640×400"
|
||||
#define OPTION_VAL_960X600_VAL "960×600"
|
||||
#define OPTION_VAL_1280X800_VAL "1280×800"
|
||||
#define OPTION_VAL_1600X1000_VAL "1600×1000"
|
||||
#define OPTION_VAL_1920X1200_VAL "1920×1200"
|
||||
#define OPTION_VAL_2240X1400_VAL "2240×1400"
|
||||
#define OPTION_VAL_2560X1600_VAL "2560×1600"
|
||||
#define PRBOOM_MOUSE_ON_LABEL_VAL NULL
|
||||
#define PRBOOM_MOUSE_ON_INFO_0_VAL NULL
|
||||
#define PRBOOM_FIND_RECURSIVE_ON_LABEL_VAL NULL
|
||||
|
Loading…
Reference in New Issue
Block a user