Unverified Commit 9d528837 authored by LibretroAdmin's avatar LibretroAdmin Committed by GitHub
Browse files

Merge pull request #64 from DisasterMo/fix-crowdin-config

Fix Crowdin config & workflow
parents 3d2fcc5a 560423ad
Pipeline #154982 passed with stages
in 6 minutes and 56 seconds
......@@ -15,15 +15,18 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Java JDK
uses: actions/setup-java@v1
uses: actions/setup-java@v3
with:
java-version: 1.8
java-version: 18
distribution: zulu
- name: Setup Python
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Upload Source
shell: bash
......
......@@ -12,15 +12,18 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Java JDK
uses: actions/setup-java@v1
uses: actions/setup-java@v3
with:
java-version: 1.8
java-version: 18
distribution: zulu
- name: Setup Python
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal access token.
fetch-depth: 0 # otherwise, there would be errors pushing refs to the destination repository.
......
......@@ -62,7 +62,7 @@ if __name__ == '__main__':
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} {'AM' if hour < 12 else 'PM'}, 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)
......
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]+|#.*[\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'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*'
r'((?:.|[\r\n])*?)\{\s*NULL,\s*NULL,\s*NULL\s*(?:.|[\r\n])*?},?(?:.|[\r\n])*?};') # captures full struct, it's beginning and it's content
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_]*))\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*)*'
......@@ -78,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]
......
......@@ -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) */
......
......@@ -137,6 +137,11 @@ struct retro_core_options_v2 *options_intl[RETRO_LANGUAGE_LAST] = {
&options_id, /* RETRO_LANGUAGE_INDONESIAN */
&options_sv, /* RETRO_LANGUAGE_SWEDISH */
&options_uk, /* RETRO_LANGUAGE_UKRAINIAN */
&options_cs, /* RETRO_LANGUAGE_CZECH */
&options_val, /* RETRO_LANGUAGE_CATALAN_VALENCIA */
&options_ca, /* RETRO_LANGUAGE_CATALAN */
&options_en, /* RETRO_LANGUAGE_BRITISH_ENGLISH */
&options_hu, /* RETRO_LANGUAGE_HUNGARIAN */
};
#endif
......
......@@ -99,7 +99,7 @@ struct retro_core_options_v2 options_ar = {
/* RETRO_LANGUAGE_AST */
#define LYNX_ROT_SCREEN_LABEL_AST NULL
#define LYNX_ROT_SCREEN_LABEL_AST "Voltiar automáticamente la pantalla"
#define LYNX_ROT_SCREEN_INFO_0_AST NULL
#define OPTION_VAL_AUTO_AST NULL
#define OPTION_VAL_MANUAL_AST NULL
......@@ -161,7 +161,7 @@ struct retro_core_options_v2 options_ast = {
#define LYNX_ROT_SCREEN_LABEL_CA NULL
#define LYNX_ROT_SCREEN_INFO_0_CA NULL
#define OPTION_VAL_AUTO_CA NULL
#define OPTION_VAL_AUTO_CA "Automàtic"
#define OPTION_VAL_MANUAL_CA NULL
#define LYNX_PIX_FORMAT_LABEL_CA NULL
#define OPTION_VAL_16_CA NULL
......@@ -279,13 +279,13 @@ struct retro_core_options_v2 options_chs = {
/* RETRO_LANGUAGE_CHT */
#define LYNX_ROT_SCREEN_LABEL_CHT NULL
#define LYNX_ROT_SCREEN_INFO_0_CHT NULL
#define LYNX_ROT_SCREEN_LABEL_CHT "自動旋轉螢幕"
#define LYNX_ROT_SCREEN_INFO_0_CHT "設定旋轉螢幕的模式。設定為 <手動> 時,使用「選擇鍵」調整畫面逆時針旋轉,90度、180度、270度和0度的順序重複切換。"
#define OPTION_VAL_AUTO_CHT "自動"
#define OPTION_VAL_MANUAL_CHT NULL
#define LYNX_PIX_FORMAT_LABEL_CHT NULL
#define OPTION_VAL_16_CHT NULL
#define OPTION_VAL_32_CHT NULL
#define OPTION_VAL_MANUAL_CHT "手動"
#define LYNX_PIX_FORMAT_LABEL_CHT "色彩格式 (需要重新啟動)"
#define OPTION_VAL_16_CHT "16位元 (RGB565)"
#define OPTION_VAL_32_CHT "32位元 (RGB8888)"
struct retro_core_option_v2_category option_cats_cht[] = {
{ NULL, NULL, NULL },
......@@ -339,11 +339,11 @@ struct retro_core_options_v2 options_cht = {
/* RETRO_LANGUAGE_CS */
#define LYNX_ROT_SCREEN_LABEL_CS NULL
#define LYNX_ROT_SCREEN_INFO_0_CS NULL
#define OPTION_VAL_AUTO_CS NULL
#define OPTION_VAL_MANUAL_CS NULL
#define LYNX_PIX_FORMAT_LABEL_CS NULL
#define LYNX_ROT_SCREEN_LABEL_CS "Automatické otáčení obrazovky"
#define LYNX_ROT_SCREEN_INFO_0_CS "Prakticky automaticky otáčí orientaci obrazovky a mapování tlačítek pro známé hry. Pokud je nastaveno \"Ruční\", otáčení obrazovky se upravuje stisknutím tlačítka SELECT, jinak lze nastavit pevné otáčení buď na 0, 90, 180 nebo 270 stupňů proti směru hodinových ručiček."
#define OPTION_VAL_AUTO_CS "Automatické"
#define OPTION_VAL_MANUAL_CS "Manuální"
#define LYNX_PIX_FORMAT_LABEL_CS "Formát barev (nutný restart)"
#define OPTION_VAL_16_CS NULL
#define OPTION_VAL_32_CS NULL
......@@ -520,7 +520,7 @@ struct retro_core_options_v2 options_da = {
/* RETRO_LANGUAGE_DE */
#define LYNX_ROT_SCREEN_LABEL_DE "Bildschirm automatisch drehen"
#define LYNX_ROT_SCREEN_INFO_0_DE NULL
#define LYNX_ROT_SCREEN_INFO_0_DE "Bildschirmausrichtung und Tastenzuordnung für bekannte Spiele automatisch virtuell drehen. Bei der Einstellung „Manuell“ wird die Bildschirmdrehung durch Drücken der SELECT-Taste angepasst, andernfalls kann eine feste Drehung auf 0, 90, 180 oder 270 Grad gegen den Uhrzeigersinn eingestellt werden."
#define OPTION_VAL_AUTO_DE "Automatisch"
#define OPTION_VAL_MANUAL_DE "Manuell"
#define LYNX_PIX_FORMAT_LABEL_DE "Farbformat (Neustart erforderlich)"
......@@ -637,6 +637,66 @@ struct retro_core_options_v2 options_el = {
option_defs_el
};
/* RETRO_LANGUAGE_EN */
#define LYNX_ROT_SCREEN_LABEL_EN NULL
#define LYNX_ROT_SCREEN_INFO_0_EN NULL
#define OPTION_VAL_AUTO_EN NULL
#define OPTION_VAL_MANUAL_EN NULL
#define LYNX_PIX_FORMAT_LABEL_EN "Colour Format (Restart Required)"
#define OPTION_VAL_16_EN NULL
#define OPTION_VAL_32_EN NULL
struct retro_core_option_v2_category option_cats_en[] = {
{ NULL, NULL, NULL },
};
struct retro_core_option_v2_definition option_defs_en[] = {
/* These variable names and possible values constitute an ABI with ZMZ (ZSNES Libretro player).
* Changing "Show layer 1" is fine, but don't change "layer_1"/etc or the possible values ("Yes|No").
* Adding more variables and rearranging them is safe. */
{
"lynx_rot_screen",
LYNX_ROT_SCREEN_LABEL_EN,
NULL,
LYNX_ROT_SCREEN_INFO_0_EN,
NULL,
NULL,
{
{ "auto", OPTION_VAL_AUTO_EN },
{ "manual", OPTION_VAL_MANUAL_EN },
{ "0", NULL },
{ "90", NULL },
{ "180", NULL },
{ "270", NULL },
{ NULL, NULL},
},
"auto",
},
{
"lynx_pix_format",
LYNX_PIX_FORMAT_LABEL_EN,
NULL,
"",
NULL,
NULL,
{
{ "16", OPTION_VAL_16_EN },
{ "32", OPTION_VAL_32_EN },
{ NULL, NULL},
},
"16",
},
{ 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 LYNX_ROT_SCREEN_LABEL_EO NULL
......@@ -759,13 +819,13 @@ struct retro_core_options_v2 options_es = {
/* RETRO_LANGUAGE_FA */
#define LYNX_ROT_SCREEN_LABEL_FA NULL
#define LYNX_ROT_SCREEN_INFO_0_FA NULL
#define OPTION_VAL_AUTO_FA NULL
#define OPTION_VAL_MANUAL_FA NULL
#define LYNX_PIX_FORMAT_LABEL_FA NULL
#define OPTION_VAL_16_FA NULL
#define OPTION_VAL_32_FA NULL
#define LYNX_ROT_SCREEN_LABEL_FA "چرخش خودکار نمایشگر"
#define LYNX_ROT_SCREEN_INFO_0_FA "جهت‌گیری نمایشگر و نگاشت دکمه‌ها را به طور خودکار برای بازی‌های شناخته شده بچرخانید. هنگامی که روی «دستی» تنظیم می‌شود، چرخش صفحه با فشاردادن دکمه SELECT تنظیم می‌شود، در غیر این صورت یک چرخش ثابت را می‌توان روی ۰، ۹۰، ۱۸۰ یا ۲۷۰ درجه پادساعتگرد تنظیم کرد."
#define OPTION_VAL_AUTO_FA "خودکار"
#define OPTION_VAL_MANUAL_FA "دستی"
#define LYNX_PIX_FORMAT_LABEL_FA "فرمت رنگ (نیازمند بازآغاز)"
#define OPTION_VAL_16_FA "۱۶-بیتی (RGB۵۶۵)"
#define OPTION_VAL_32_FA "۳۲-بیتی (RGB۸۸۸۸)"
struct retro_core_option_v2_category option_cats_fa[] = {
{ NULL, NULL, NULL },
......@@ -820,7 +880,7 @@ struct retro_core_options_v2 options_fa = {
/* RETRO_LANGUAGE_FI */
#define LYNX_ROT_SCREEN_LABEL_FI "Näytön automaattinen kierto"
#define LYNX_ROT_SCREEN_INFO_0_FI NULL
#define LYNX_ROT_SCREEN_INFO_0_FI "Kierrä virtuaalisesti näytön ja painikkeiden suuntaa automaattisesti tunnetuille peleille. Kun asetus on \"Manuaalinen\", näytön kierto säädetään painamalla SELECT-painiketta, muuten kiinteä kierto voidaan asettaa joko 0, 90, 180, tai 270 asteen vastapäivään."
#define OPTION_VAL_AUTO_FI "Automaattinen"
#define OPTION_VAL_MANUAL_FI "Manuaalinen"
#define LYNX_PIX_FORMAT_LABEL_FI "Väriformaatti (Uudelleenkäynnistys vaaditaan)"
......@@ -1057,15 +1117,75 @@ struct retro_core_options_v2 options_he = {
option_defs_he
};
/* RETRO_LANGUAGE_HR */
#define LYNX_ROT_SCREEN_LABEL_HR NULL
#define LYNX_ROT_SCREEN_INFO_0_HR NULL
#define OPTION_VAL_AUTO_HR NULL
#define OPTION_VAL_MANUAL_HR NULL
#define LYNX_PIX_FORMAT_LABEL_HR NULL
#define OPTION_VAL_16_HR NULL
#define OPTION_VAL_32_HR NULL
struct retro_core_option_v2_category option_cats_hr[] = {
{ NULL, NULL, NULL },
};
struct retro_core_option_v2_definition option_defs_hr[] = {
/* These variable names and possible values constitute an ABI with ZMZ (ZSNES Libretro player).
* Changing "Show layer 1" is fine, but don't change "layer_1"/etc or the possible values ("Yes|No").
* Adding more variables and rearranging them is safe. */
{
"lynx_rot_screen",
LYNX_ROT_SCREEN_LABEL_HR,
NULL,
LYNX_ROT_SCREEN_INFO_0_HR,
NULL,
NULL,
{
{ "auto", OPTION_VAL_AUTO_HR },
{ "manual", OPTION_VAL_MANUAL_HR },
{ "0", NULL },
{ "90", NULL },
{ "180", NULL },
{ "270", NULL },
{ NULL, NULL},
},
"auto",
},
{
"lynx_pix_format",
LYNX_PIX_FORMAT_LABEL_HR,
NULL,
"",
NULL,
NULL,
{
{ "16", OPTION_VAL_16_HR },
{ "32", OPTION_VAL_32_HR },
{ NULL, NULL},
},
"16",
},
{ 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 LYNX_ROT_SCREEN_LABEL_HU NULL
#define LYNX_ROT_SCREEN_INFO_0_HU NULL
#define OPTION_VAL_AUTO_HU NULL
#define LYNX_ROT_SCREEN_LABEL_HU "Automatikus képernyőforgatás"
#define LYNX_ROT_SCREEN_INFO_0_HU "A képernyőirány és gombkiosztás virtuális elforgatása az ismert játékokhoz automatikusan. \"Kézi\" esetben a Select gomb lenyomásával forgatható, vagy fix elforgatás választható 0, 90, 180, vagy 270 fokban az óramutató járásával ellentétesen."
#define OPTION_VAL_AUTO_HU "Automatikus"
#define OPTION_VAL_MANUAL_HU "Kézi"
#define LYNX_PIX_FORMAT_LABEL_HU NULL
#define OPTION_VAL_16_HU NULL
#define OPTION_VAL_32_HU NULL
#define LYNX_PIX_FORMAT_LABEL_HU "Színformátum (újraindítás szükséges)"
#define OPTION_VAL_16_HU "16 bites (RGB565)"
#define OPTION_VAL_32_HU "32 bites (RGB8888)"
struct retro_core_option_v2_category option_cats_hu[] = {
{ NULL, NULL, NULL },
......@@ -1121,7 +1241,7 @@ struct retro_core_options_v2 options_hu = {
#define LYNX_ROT_SCREEN_LABEL_ID NULL
#define LYNX_ROT_SCREEN_INFO_0_ID NULL
#define OPTION_VAL_AUTO_ID NULL
#define OPTION_VAL_AUTO_ID "Otomatis"
#define OPTION_VAL_MANUAL_ID NULL
#define LYNX_PIX_FORMAT_LABEL_ID NULL
#define OPTION_VAL_16_ID NULL
......@@ -1600,10 +1720,10 @@ struct retro_core_options_v2 options_oc = {
/* RETRO_LANGUAGE_PL */
#define LYNX_ROT_SCREEN_LABEL_PL "Autoobracanie ekranu"
#define LYNX_ROT_SCREEN_INFO_0_PL "Praktycznie obracaj orientację ekranu i mapowanie przycisków automatycznie dla znanych gier. Po ustawieniu na 'Ręczny', obrót ekranu jest regulowany poprzez naciśnięcie przycisku SELECT w przeciwnym razie stały obrót można ustawić na 0, 90, 180 lub 270 stopni w kierunku przeciwnym do ruchu wskazówek zegara."
#define LYNX_ROT_SCREEN_INFO_0_PL "Automatycznie obracaj orietancję ekranu i przypisania klawiszy dla znanych gier. Po ustawieniu na 'Ręcznie', obrót ekranu jest regulowany poprzez naciśnięcie przycisku SELECT, w przeciwnym wypadku stałą wartość obrótu można ustawić na 0, 90, 180 lub 270 stopni w kierunku przeciwnym do ruchu wskazówek zegara."
#define OPTION_VAL_AUTO_PL NULL
#define OPTION_VAL_MANUAL_PL "Ręcznie"
#define LYNX_PIX_FORMAT_LABEL_PL NULL
#define LYNX_PIX_FORMAT_LABEL_PL "Format Kolorów (Wymagany Restart)"
#define OPTION_VAL_16_PL NULL
#define OPTION_VAL_32_PL NULL
......@@ -1719,11 +1839,11 @@ struct retro_core_options_v2 options_pt_br = {
/* RETRO_LANGUAGE_PT_PT */
#define LYNX_ROT_SCREEN_LABEL_PT_PT NULL
#define LYNX_ROT_SCREEN_INFO_0_PT_PT NULL