From 453348afad62a79114a095b970fe29850304973d Mon Sep 17 00:00:00 2001 From: DisasterMo Date: Mon, 8 Nov 2021 21:33:23 +0100 Subject: [PATCH 001/175] Update the core localisation sync scripts, workflows and instructions --- .../workflows/crowdin_initial_setup.yml | 32 + .../workflows/crowdin_source_upload.yml | 37 + .../workflows/crowdin_translation_sync.yml | 55 ++ .../example_translation/instructions.txt | 92 +++ .../example_translation/intl/.gitignore | 4 + .../example_translation/intl/activate.py | 70 ++ .../intl/core_option_regex.py | 16 +- .../intl/core_option_translation.py | 633 ++++++++++++++++++ .../example_translation/intl/crowdin.yaml | 13 + .../example_translation/intl/crowdin_prep.py | 30 + .../intl/crowdin_source_upload.py | 93 +++ .../intl/crowdin_translate.py | 39 ++ .../intl/crowdin_translation_download.py | 93 +++ .../intl/download_workflow.py | 16 + .../example_translation/intl/initial_sync.py | 102 +++ .../intl/remove_initial_cycle.py | 30 + .../intl/upload_workflow.py | 15 + .../intl/v1_to_v2_converter.py | 483 +++++++++++++ .../libretro_core_options.h | 386 ++++++++--- .../libretro_core_options_intl.h | 44 +- .../.github/workflows/crowdin_intl.yml | 41 -- .../.github/workflows/crowdin_prep.yml | 41 -- .../translation scripts/crowdin.yml | 3 - .../translation scripts/instructions.txt | 47 -- .../translation scripts/intl/.gitignore | 1 - .../intl/core_opt_translation.py | 609 ----------------- .../translation scripts/intl/crowdin_intl.py | 43 -- .../translation scripts/intl/crowdin_prep.py | 34 - .../intl/v1_to_v2_converter.py | 459 ------------- 29 files changed, 2162 insertions(+), 1399 deletions(-) create mode 100644 libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_initial_setup.yml create mode 100644 libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_source_upload.yml create mode 100644 libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_translation_sync.yml create mode 100644 libretro-common/samples/core_options/example_translation/instructions.txt create mode 100644 libretro-common/samples/core_options/example_translation/intl/.gitignore create mode 100644 libretro-common/samples/core_options/example_translation/intl/activate.py rename libretro-common/samples/core_options/example_translation/{translation scripts => }/intl/core_option_regex.py (87%) create mode 100644 libretro-common/samples/core_options/example_translation/intl/core_option_translation.py create mode 100644 libretro-common/samples/core_options/example_translation/intl/crowdin.yaml create mode 100644 libretro-common/samples/core_options/example_translation/intl/crowdin_prep.py create mode 100644 libretro-common/samples/core_options/example_translation/intl/crowdin_source_upload.py create mode 100644 libretro-common/samples/core_options/example_translation/intl/crowdin_translate.py create mode 100644 libretro-common/samples/core_options/example_translation/intl/crowdin_translation_download.py create mode 100644 libretro-common/samples/core_options/example_translation/intl/download_workflow.py create mode 100644 libretro-common/samples/core_options/example_translation/intl/initial_sync.py create mode 100644 libretro-common/samples/core_options/example_translation/intl/remove_initial_cycle.py create mode 100644 libretro-common/samples/core_options/example_translation/intl/upload_workflow.py create mode 100644 libretro-common/samples/core_options/example_translation/intl/v1_to_v2_converter.py delete mode 100644 libretro-common/samples/core_options/example_translation/translation scripts/.github/workflows/crowdin_intl.yml delete mode 100644 libretro-common/samples/core_options/example_translation/translation scripts/.github/workflows/crowdin_prep.yml delete mode 100644 libretro-common/samples/core_options/example_translation/translation scripts/crowdin.yml delete mode 100644 libretro-common/samples/core_options/example_translation/translation scripts/instructions.txt delete mode 100644 libretro-common/samples/core_options/example_translation/translation scripts/intl/.gitignore delete mode 100644 libretro-common/samples/core_options/example_translation/translation scripts/intl/core_opt_translation.py delete mode 100644 libretro-common/samples/core_options/example_translation/translation scripts/intl/crowdin_intl.py delete mode 100644 libretro-common/samples/core_options/example_translation/translation scripts/intl/crowdin_prep.py delete mode 100644 libretro-common/samples/core_options/example_translation/translation scripts/intl/v1_to_v2_converter.py diff --git a/libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_initial_setup.yml b/libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_initial_setup.yml new file mode 100644 index 0000000000..739d137b11 --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_initial_setup.yml @@ -0,0 +1,32 @@ +# Uploads source texts and any present translations to Crowdin. + +name: Crowdin Translations Initial Setup + +# On manual run only. +on: + workflow_dispatch + +jobs: + upload_source_file: + runs-on: ubuntu-latest + steps: + - name: Setup Java JDK + uses: actions/setup-java@v4 + with: + java-version: 18 + distribution: zulu + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Checkout + uses: actions/checkout@v3 + + - name: Initial synchroniation + shell: bash + env: + CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }} + run: | + python3 intl/initial_sync.py $CROWDIN_API_KEY "" "/libretro_core_options.h" diff --git a/libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_source_upload.yml b/libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_source_upload.yml new file mode 100644 index 0000000000..181e74ecdf --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_source_upload.yml @@ -0,0 +1,37 @@ +# Prepare source texts & upload them to Crowdin + +name: Crowdin Source Texts Upload + +# on change to the English texts +on: + workflow_dispatch + push: + branches: + - master + paths: + - '/libretro_core_options.h' + +jobs: + upload_source_file: + runs-on: ubuntu-latest + steps: + - name: Setup Java JDK + uses: actions/setup-java@v4 + with: + java-version: 18 + distribution: zulu + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Checkout + uses: actions/checkout@v3 + + - name: Upload Source + shell: bash + env: + CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }} + run: | + python3 intl/upload_workflow.py $CROWDIN_API_KEY "" "/libretro_core_options.h" diff --git a/libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_translation_sync.yml b/libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_translation_sync.yml new file mode 100644 index 0000000000..9f37a38177 --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/.github/workflows/crowdin_translation_sync.yml @@ -0,0 +1,55 @@ +# Download translations form Crowdin & Recreate libretro_core_options_intl.h + +name: Crowdin Translation Sync + +on: + workflow_dispatch + schedule: + # please choose a random time & weekday to avoid all repos synching at the same time + - cron: '<0-59> <0-23> * * 5' # Fridays at , UTC + +jobs: + create_intl_file: + permissions: + contents: write # 'write' access to repository contents + pull-requests: write # 'write' access to pull requests + + runs-on: ubuntu-latest + steps: + - name: Setup Java JDK + uses: actions/setup-java@v4 + with: + java-version: 18 + distribution: zulu + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Checkout + uses: actions/checkout@v4 + 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. + + - name: Create intl file + shell: bash + env: + CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }} + run: | + python3 intl/download_workflow.py $CROWDIN_API_KEY "" "/libretro_core_options_intl.h" + + - name: Commit files + run: | + git config --local user.email "github-actions@github.com" + git config --local user.name "github-actions[bot]" + git add intl/*_workflow.py "/libretro_core_options_intl.h" + git commit -m "Fetch translations & Recreate libretro_core_options_intl.h" + + - name: GitHub Push + uses: ad-m/github-push-action@v0.8.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: ${{ github.ref }} + diff --git a/libretro-common/samples/core_options/example_translation/instructions.txt b/libretro-common/samples/core_options/example_translation/instructions.txt new file mode 100644 index 0000000000..3adb8073a3 --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/instructions.txt @@ -0,0 +1,92 @@ +## Requirements + +Make sure the core is libretro conformant: +both `libretro_core_options.h`, containing the English texts, and +`libretro_core_options_intl.h`, containing all already existing +translations, if any, must be present in the same directory. + +> Please note: `libretro_core_options_intl.h` does not need to contain +anything, if no translations exist or none of them should be preserved. + +The scripts are not compatible with text filled in by macros or during run time. +The procedure should not fail - but those texts will not be made translatable. + +Also, please verify the existence and correct use of + + `#ifdef HAVE_LANGEXTRA` + +and/or + + `#ifndef NAVE_NO_LANGEXTRA` + +pre-compiler instructions in `libretro_core_options.h` to remove any +references to additional languages on platforms which cannot handle them, +e.g. due to limited RAM. +For an example, refer to an up-to-date core, like [gambatte-libretro](https://github.com/libretro/gambatte-libretro/blob/master/libgambatte/libretro/libretro_core_options.h). + +> Make sure `options_intl` in `libretro_core_options.h` correctly references the `intl` options, or the translations will not be applied! + +## Adding automatic Crowdin sync + +Place the `intl` and `.github` folders, including content, into the root +of the repository. + +In `.github/workflows` are two files: +`crowdin_prep.yml` & `crowdin_translate.yml`. +In each of those are placeholders, which need to be replaced. + +For convenience, one can run `intl/activate.py`, which will try to find +the `libretro_core_options.h` file as well as identify the core name to +fill those placeholders with. + +Even then, one should still check, if it produced the correct result: + +For `crowdin_prep.yml`: +> **NOTE:** Please verify, that this workflow watches the correct branch! +Uploads happen, whenever `libretro_core_options.h` of that branch is changed. + +- (x2) + - replace with the full path from the root of the repo to the + `libretro_core_options.h` file + +- + - the name of the core (or repo) + +And for crowdin_translate.yml: +- <0-59> <0-23> + - Minute and hour at which the sync will happen. + The script will generate a random time for this, to avoid + stressing GitHub & Crowdin with many simultaneous runs. + +- + - same as above + +- (x2) + - replace with the full path from the root of the repo to the + 'libretro_core_options_intl.h' file + +Create a Pull Request and ask a Crowdin project manager, either on [Crowdin](https://crowdin.com/project/retroarch) or, preferably, on [discord](https://discord.gg/xuMbcVuF) in the `retroarch-translations` channel, to provide you with an access key. Create an Actions repository secret on GitHub named CROWDIN_API_KEY for this access token. + + +When everything is ready, run the "Crowdin Translations Initial Setup" workflow manually to upload the source texts and any translations to Crowdin. + +> You may either disable the initial workflow or even remove it from your repository. Running it more than once is very much discouraged! That may mess with the newest translations, which are usually not yet incorporated into the repository. + +Finally, it is recommended to run the "Crowdin Translation Sync" workflow manually once. If a "Permission to \ denied" error occurs, you might need to configure the GITHUB_TOKEN with the appropriate access rights, [see here](https://github.com/marketplace/actions/github-push#requirements-and-prerequisites). + +## (For Crowdin project managers) Creating an access token + +To create an access token, navigate to the account settings via your profile picture in the top right. Change to the API tab. Here you should find a `New Token` button. + +Name the token after the core/repository, which will receive it. The following permissions should be set: + +- Projects + - read +- Source files & strings + - read & write +- Translations + - read & write +- (optional) Translation status + - read + +> Please provide these access tokens to the core developers in a private message and delete those after successful setup. Do not share tokens publicly or store them in plain text long term! \ No newline at end of file diff --git a/libretro-common/samples/core_options/example_translation/intl/.gitignore b/libretro-common/samples/core_options/example_translation/intl/.gitignore new file mode 100644 index 0000000000..458f3d31a9 --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/.gitignore @@ -0,0 +1,4 @@ +__pycache__ +crowdin-cli.jar +*.h +*.json diff --git a/libretro-common/samples/core_options/example_translation/intl/activate.py b/libretro-common/samples/core_options/example_translation/intl/activate.py new file mode 100644 index 0000000000..38426a6a40 --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/activate.py @@ -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) + prep_txt = prep_txt.replace("/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) + translate_txt = translate_txt.replace('/libretro_core_options_intl.h', + core_intl_file) + with open(TRANSLATE_WF, 'w') as wf_file: + wf_file.write(translate_txt) diff --git a/libretro-common/samples/core_options/example_translation/translation scripts/intl/core_option_regex.py b/libretro-common/samples/core_options/example_translation/intl/core_option_regex.py similarity index 87% rename from libretro-common/samples/core_options/example_translation/translation scripts/intl/core_option_regex.py rename to libretro-common/samples/core_options/example_translation/intl/core_option_regex.py index 34a3f20a23..753bd3fa00 100644 --- a/libretro-common/samples/core_options/example_translation/translation scripts/intl/core_option_regex.py +++ b/libretro-common/samples/core_options/example_translation/intl/core_option_regex.py @@ -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*' diff --git a/libretro-common/samples/core_options/example_translation/intl/core_option_translation.py b/libretro-common/samples/core_options/example_translation/intl/core_option_translation.py new file mode 100644 index 0000000000..6e9c9711eb --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/core_option_translation.py @@ -0,0 +1,633 @@ +#!/usr/bin/env python3 + +"""Core options text extractor + +The purpose of this script is to set up & provide functions for automatic generation of 'libretro_core_options_intl.h' +from 'libretro_core_options.h' using translations from Crowdin. + +Both v1 and v2 structs are supported. It is, however, recommended to convert v1 files to v2 using the included +'v1_to_v2_converter.py'. + +Usage: +python3 path/to/core_option_translation.py "path/to/where/libretro_core_options.h & libretro_core_options_intl.h/are" "core_name" + +This script will: +1.) create key words for & extract the texts from libretro_core_options.h & save them into intl/_us/core_options.h +2.) do the same for any present translations in libretro_core_options_intl.h, saving those in their respective folder +""" +import core_option_regex as cor +import re +import os +import sys +import json +import urllib.request as req +import shutil + +# LANG_CODE_TO_R_LANG = {'_ar': 'RETRO_LANGUAGE_ARABIC', +# '_ast': 'RETRO_LANGUAGE_ASTURIAN', +# '_chs': 'RETRO_LANGUAGE_CHINESE_SIMPLIFIED', +# '_cht': 'RETRO_LANGUAGE_CHINESE_TRADITIONAL', +# '_cs': 'RETRO_LANGUAGE_CZECH', +# '_cy': 'RETRO_LANGUAGE_WELSH', +# '_da': 'RETRO_LANGUAGE_DANISH', +# '_de': 'RETRO_LANGUAGE_GERMAN', +# '_el': 'RETRO_LANGUAGE_GREEK', +# '_eo': 'RETRO_LANGUAGE_ESPERANTO', +# '_es': 'RETRO_LANGUAGE_SPANISH', +# '_fa': 'RETRO_LANGUAGE_PERSIAN', +# '_fi': 'RETRO_LANGUAGE_FINNISH', +# '_fr': 'RETRO_LANGUAGE_FRENCH', +# '_gl': 'RETRO_LANGUAGE_GALICIAN', +# '_he': 'RETRO_LANGUAGE_HEBREW', +# '_hu': 'RETRO_LANGUAGE_HUNGARIAN', +# '_id': 'RETRO_LANGUAGE_INDONESIAN', +# '_it': 'RETRO_LANGUAGE_ITALIAN', +# '_ja': 'RETRO_LANGUAGE_JAPANESE', +# '_ko': 'RETRO_LANGUAGE_KOREAN', +# '_nl': 'RETRO_LANGUAGE_DUTCH', +# '_oc': 'RETRO_LANGUAGE_OCCITAN', +# '_pl': 'RETRO_LANGUAGE_POLISH', +# '_pt_br': 'RETRO_LANGUAGE_PORTUGUESE_BRAZIL', +# '_pt_pt': 'RETRO_LANGUAGE_PORTUGUESE_PORTUGAL', +# '_ru': 'RETRO_LANGUAGE_RUSSIAN', +# '_sk': 'RETRO_LANGUAGE_SLOVAK', +# '_sv': 'RETRO_LANGUAGE_SWEDISH', +# '_tr': 'RETRO_LANGUAGE_TURKISH', +# '_uk': 'RETRO_LANGUAGE_UKRAINIAN', +# '_us': 'RETRO_LANGUAGE_ENGLISH', +# '_vn': 'RETRO_LANGUAGE_VIETNAMESE'} + +# these are handled by RetroArch directly - no need to include them in core translations +ON_OFFS = {'"enabled"', '"disabled"', '"true"', '"false"', '"on"', '"off"'} + + +def remove_special_chars(text: str, char_set=0, allow_non_ascii=False) -> str: + """Removes special characters from a text. + + :param text: String to be cleaned. + :param char_set: 0 -> remove all ASCII special chars except for '_' & 'space' (default) + 1 -> remove invalid chars from file names + :param allow_non_ascii: False -> all non-ascii characters will be removed (default) + True -> non-ascii characters will be passed through + :return: Clean text. + """ + command_chars = [chr(unicode) for unicode in tuple(range(0, 32)) + (127,)] + special_chars = ([chr(unicode) for unicode in tuple(range(33, 48)) + tuple(range(58, 65)) + tuple(range(91, 95)) + + (96,) + tuple(range(123, 127))], + ('\\', '/', ':', '*', '?', '"', '<', '>', '|', '#', '%', + '&', '{', '}', '$', '!', '¸', "'", '@', '+', '=')) + res = text if allow_non_ascii \ + else text.encode('ascii', errors='ignore').decode('unicode-escape') + + for cm in command_chars: + res = res.replace(cm, '_') + for sp in special_chars[char_set]: + res = res.replace(sp, '_') + while res.startswith('_'): + res = res[1:] + while res.endswith('_'): + res = res[:-1] + return res + + +def clean_file_name(file_name: str) -> str: + """Removes characters which might make file_name inappropriate for files on some OS. + + :param file_name: File name to be cleaned. + :return: The clean file name. + """ + file_name = remove_special_chars(file_name, 1) + file_name = re.sub(r'__+', '_', file_name.replace(' ', '_')) + return file_name + + +def get_struct_type_name(decl: str) -> tuple: + """ Returns relevant parts of the struct declaration: + type, name of the struct and the language appendix, if present. + :param decl: The struct declaration matched by cor.p_type_name. + :return: Tuple, e.g.: ('retro_core_option_definition', 'option_defs_us', '_us') + """ + struct_match = cor.p_type_name.search(decl) + if struct_match: + if struct_match.group(3): + struct_type_name = struct_match.group(1, 2, 3) + return struct_type_name + elif struct_match.group(4): + struct_type_name = struct_match.group(1, 2, 4) + return struct_type_name + else: + struct_type_name = struct_match.group(1, 2) + return struct_type_name + else: + raise ValueError(f'No or incomplete struct declaration: {decl}!\n' + 'Please make sure all structs are complete, including the type and name declaration.') + + +def is_viable_non_dupe(text: str, comparison) -> bool: + """text must be longer than 2 ('""'), not 'NULL' and not in comparison. + + :param text: String to be tested. + :param comparison: Dictionary or set to search for text in. + :return: bool + """ + return 2 < len(text) and text != 'NULL' and text not in comparison + + +def is_viable_value(text: str) -> bool: + """text must be longer than 2 ('""') and not 'NULL'. + + :param text: String to be tested. + :return: bool + """ + return 2 < len(text) and text != 'NULL' + + +def create_non_dupe(base_name: str, opt_num: int, comparison) -> str: + """Makes sure base_name is not in comparison, and if it is it's renamed. + + :param base_name: Name to check/make unique. + :param opt_num: Number of the option base_name belongs to, used in making it unique. + :param comparison: Dictionary or set to search for base_name in. + :return: Unique name. + """ + h = base_name + if h in comparison: + n = 0 + h = h + '_O' + str(opt_num) + h_end = len(h) + while h in comparison: + h = h[:h_end] + '_' + str(n) + n += 1 + return h + + +def get_texts(text: str) -> dict: + """Extracts the strings, which are to be translated/are the translations, + from text and creates macro names for them. + + :param text: The string to be parsed. + :return: Dictionary of the form { '_': { 'macro': 'string', ... }, ... }. + """ + # all structs: group(0) full struct, group(1) beginning, group(2) content + structs = cor.p_struct.finditer(text) + hash_n_string = {} + just_string = {} + for struct in structs: + struct_declaration = struct.group(1) + struct_type_name = get_struct_type_name(struct_declaration) + if 3 > len(struct_type_name): + lang = '_us' + else: + lang = struct_type_name[2] + if lang not in just_string: + hash_n_string[lang] = {} + just_string[lang] = set() + 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_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(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): + # group 1: key + if option.group(1): + opt_name = pre_name + option.group(1) + # no special chars allowed in key + opt_name = remove_special_chars(opt_name).upper().replace(' ', '_') + else: + raise ValueError(f'No option name (key) found in struct {struct_type_name[1]} option {opt}!') + + # group 2: description0 + if option.group(2): + desc0 = option.group(2) + if is_viable_non_dupe(desc0, just_string[lang]): + just_string[lang].add(desc0) + m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_LABEL'), opt, hash_n_string[lang]) + hash_n_string[lang][m_h] = desc0 + else: + raise ValueError(f'No label found in struct {struct_type_name[1]} option {option.group(1)}!') + + # group 3: desc1, info0, info1, category + if option.group(3): + infos = option.group(3) + option_info = p.finditer(infos) + if is_v2_definition: + desc1 = next(option_info).group(1) + if is_viable_non_dupe(desc1, just_string[lang]): + just_string[lang].add(desc1) + m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_LABEL_CAT'), opt, hash_n_string[lang]) + hash_n_string[lang][m_h] = desc1 + last = None + m_h = None + for j, info in enumerate(option_info): + last = info.group(1) + if is_viable_non_dupe(last, just_string[lang]): + just_string[lang].add(last) + m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_INFO_{j}'), opt, + hash_n_string[lang]) + hash_n_string[lang][m_h] = last + if last in just_string[lang]: # category key should not be translated + hash_n_string[lang].pop(m_h) + just_string[lang].remove(last) + else: + for j, info in enumerate(option_info): + gr1 = info.group(1) + if is_viable_non_dupe(gr1, just_string[lang]): + just_string[lang].add(gr1) + m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_INFO_{j}'), opt, + hash_n_string[lang]) + hash_n_string[lang][m_h] = gr1 + else: + raise ValueError(f'Too few arguments in struct {struct_type_name[1]} option {option.group(1)}!') + + # 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): + # 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]) + + # 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]) + hash_n_string[lang][m_h] = set_value + just_string[lang].add(set_value) + return hash_n_string + + +def create_msg_hash(intl_dir_path: str, core_name: str, keyword_string_dict: dict) -> dict: + """Creates '.h' files in 'intl/_/' containing the macro name & string combinations. + + :param intl_dir_path: Path to the intl directory. + :param core_name: Name of the core, used for the files' paths. + :param keyword_string_dict: Dictionary of the form { '_': { 'macro': 'string', ... }, ... }. + :return: Dictionary of the form { '_': 'path/to/file (./intl/_/.h)', ... }. + """ + files = {} + for localisation in keyword_string_dict: + path = os.path.join(intl_dir_path, core_name) # intl// + files[localisation] = os.path.join(path, localisation + '.h') # intl//_.h + if not os.path.exists(path): + os.makedirs(path) + with open(files[localisation], 'w', encoding='utf-8') as crowdin_file: + out_text = '' + for keyword in keyword_string_dict[localisation]: + out_text = f'{out_text}{keyword} {keyword_string_dict[localisation][keyword]}\n' + crowdin_file.write(out_text) + return files + + +def h2json(file_paths: dict) -> dict: + """Converts .h files pointed to by file_paths into .jsons. + + :param file_paths: Dictionary of the form { '_': 'path/to/file (./intl/_/.h)', ... }. + :return: Dictionary of the form { '_': 'path/to/file (./intl/_/.json)', ... }. + """ + jsons = {} + for file_lang in file_paths: + if not os.path.isfile(file_paths[file_lang]): + continue + 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 + + with open(file_paths[file_lang], 'r+', encoding='utf-8') as h_file: + text = h_file.read() + result = p.finditer(text) + messages = {} + for msg in result: + key, val = msg.group(1, 2) + if key not in messages: + if key and val: + # unescape & remove "\n" + messages[key] = re.sub(r'"\s*(?:(?:/\*(?:.|[\r\n])*?\*/|//.*[\r\n]+)\s*)*"', + '\\\n', val[1:-1].replace('\\\"', '"')) + else: + print(f"DUPLICATE KEY in {file_paths[file_lang]}: {key}") + with open(jsons[file_lang], 'w', encoding='utf-8') as json_file: + json.dump(messages, json_file, indent=2) + + return jsons + + +def json2h(intl_dir_path: str, file_list) -> None: + """Converts .json file in json_file_path into an .h ready to be included in C code. + + :param intl_dir_path: Path to the intl/ directory. + :param file_list: Iterator of os.DirEntry objects. Contains localisation files to convert. + :return: None + """ + + p = cor.p_masked + + def update(s_messages, s_template, s_source_messages, file_name): + translation = '' + template_messages = p.finditer(s_template) + for tp_msg in template_messages: + old_key = tp_msg.group(1) + if old_key in s_messages and s_messages[old_key] != s_source_messages[old_key]: + tl_msg_val = s_messages[old_key] + tl_msg_val = tl_msg_val.replace('"', '\\\"').replace('\n', '') # escape + translation = ''.join((translation, '#define ', old_key, file_name.upper(), f' "{tl_msg_val}"\n')) + + else: # Remove English duplicates and non-translatable strings + translation = ''.join((translation, '#define ', old_key, file_name.upper(), ' NULL\n')) + return translation + + us_h = os.path.join(intl_dir_path, '_us.h') + us_json = os.path.join(intl_dir_path, '_us.json') + + with open(us_h, 'r', encoding='utf-8') as template_file: + template = template_file.read() + with open(us_json, 'r+', encoding='utf-8') as source_json_file: + source_messages = json.load(source_json_file) + + for file in file_list: + if file.name.lower().startswith('_us') \ + or file.name.lower().endswith('.h') \ + or file.is_dir(): + continue + + with open(file.path, 'r+', encoding='utf-8') as json_file: + messages = json.load(json_file) + new_translation = update(messages, template, source_messages, os.path.splitext(file.name)[0]) + with open(os.path.splitext(file.path)[0] + '.h', 'w', encoding='utf-8') as h_file: + h_file.seek(0) + h_file.write(new_translation) + h_file.truncate() + return + + +def get_crowdin_client(dir_path: str) -> str: + """Makes sure the Crowdin CLI client is present. If it isn't, it is fetched & extracted. + + :return: The path to 'crowdin-cli.jar'. + """ + jar_name = 'crowdin-cli.jar' + jar_path = os.path.join(dir_path, jar_name) + + if not os.path.isfile(jar_path): + print('Downloading crowdin-cli.jar') + crowdin_cli_file = os.path.join(dir_path, 'crowdin-cli.zip') + crowdin_cli_url = 'https://downloads.crowdin.com/cli/v3/crowdin-cli.zip' + req.urlretrieve(crowdin_cli_url, crowdin_cli_file) + import zipfile + with zipfile.ZipFile(crowdin_cli_file, 'r') as zip_ref: + jar_dir = zip_ref.namelist()[0] + for file in zip_ref.namelist(): + if file.endswith(jar_name): + jar_file = file + break + zip_ref.extract(jar_file) + os.rename(jar_file, jar_path) + os.remove(crowdin_cli_file) + shutil.rmtree(jar_dir) + return jar_path + + +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 intl_file_path: Path to 'libretro_core_options_intl.h' + :param localisations_path: Path to the intl/ 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 + """ + msg_dict = {} + lang_up = '' + + def replace_pair(pair_match): + """Replaces a key-value-pair of an option with the macros corresponding to the language. + + :param pair_match: The re match object representing the key-value-pair block. + :return: Replacement string. + """ + offset = pair_match.start(0) + if pair_match.group(1): # key + if pair_match.group(2) in msg_dict: # value + val = msg_dict[pair_match.group(2)] + lang_up + elif pair_match.group(1) in msg_dict: # use key if value not viable (e.g. NULL) + val = msg_dict[pair_match.group(1)] + lang_up + else: + return pair_match.group(0) + else: + return pair_match.group(0) + res = pair_match.group(0)[:pair_match.start(2) - offset] + val \ + + pair_match.group(0)[pair_match.end(2) - offset:] + return res + + def replace_info(info_match): + """Replaces the 'additional strings' of an option with the macros corresponding to the language. + + :param info_match: The re match object representing the 'additional strings' block. + :return: Replacement string. + """ + offset = info_match.start(0) + if info_match.group(1) in msg_dict: + res = info_match.group(0)[:info_match.start(1) - offset] + \ + msg_dict[info_match.group(1)] + lang_up + \ + info_match.group(0)[info_match.end(1) - offset:] + return res + else: + return info_match.group(0) + + def replace_option(option_match): + """Replaces strings within an option + '{ "opt_key", "label", "additional strings", ..., { {"key", "value"}, ... }, ... }' + within a struct with the macros corresponding to the language: + '{ "opt_key", MACRO_LABEL, MACRO_STRINGS, ..., { {"key", MACRO_VALUE}, ... }, ... }' + + :param option_match: The re match object representing the option. + :return: Replacement string. + """ + # label + offset = option_match.start(0) + if option_match.group(2): + res = option_match.group(0)[:option_match.start(2) - offset] + msg_dict[option_match.group(2)] + lang_up + else: + return option_match.group(0) + # additional block + if option_match.group(3): + res = res + option_match.group(0)[option_match.end(2) - offset:option_match.start(3) - offset] + new_info = p.sub(replace_info, option_match.group(3)) + res = res + new_info + else: + return res + option_match.group(0)[option_match.end(2) - offset:] + # key-value-pairs + if option_match.group(4): + res = res + option_match.group(0)[option_match.end(3) - offset:option_match.start(4) - offset] + new_pairs = cor.p_key_value.sub(replace_pair, option_match.group(4)) + res = res + new_pairs + option_match.group(0)[option_match.end(4) - offset:] + else: + res = res + option_match.group(0)[option_match.end(3) - offset:] + + return res + + # ------------------------------------------------------------------------------------ + + with open(file_path, 'r+', encoding='utf-8') as template: # intl//_us.h + masked_msgs = cor.p_masked.finditer(template.read()) + + for msg in masked_msgs: + msg_dict[msg.group(2)] = msg.group(1) + + # top of the file - in case there is no file to copy it from + out_txt = "#ifndef LIBRETRO_CORE_OPTIONS_INTL_H__\n" \ + "#define LIBRETRO_CORE_OPTIONS_INTL_H__\n\n" \ + "#if defined(_MSC_VER) && (_MSC_VER >= 1500 && _MSC_VER < 1900)\n" \ + "/* https://support.microsoft.com/en-us/kb/980263 */\n" \ + '#pragma execution_character_set("utf-8")\n' \ + "#pragma warning(disable:4566)\n" \ + "#endif\n\n" \ + "#include \n\n" \ + '#ifdef __cplusplus\n' \ + 'extern "C" {\n' \ + '#endif\n' + + if os.path.isfile(intl_file_path): + # copy top of the file for re-use + 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' + ' ********************************\n' + '*/\n'), in_text) + 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(localisations_path): + files[file.name] = {'is_file': file.is_file(), 'path': file.path} + + for file in sorted(files): # intl//_* + if files[file]['is_file'] \ + and file.startswith('_') \ + and file.endswith('.h') \ + and not file.startswith('_us'): + translation_path = files[file]['path'] # _.h + # all structs: group(0) full struct, group(1) beginning, group(2) content + 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) + with open(translation_path, 'r+', encoding='utf-8') as f_in: # .h + out_txt = out_txt + f_in.read() + '\n' + # replace English texts with makros + for construct in struct_groups: + declaration = construct.group(1) + struct_type_name = get_struct_type_name(declaration) + 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: + 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_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(4) - offset_construct + out_txt = out_txt + new_decl + construct.group(0)[start:end] + # insert macros + content = construct.group(4) + new_content = cor.p_option.sub(replace_option, content) + 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 + if 'retro_core_option_v2_definition' == struct_type_name[0]: + out_txt = out_txt + f'struct retro_core_options_v2 options{lang_low}' \ + ' = {\n' \ + f' option_cats{lang_low},\n' \ + f' option_defs{lang_low}\n' \ + '};\n\n' + # if it got this far, we've got something to write + overwrite = True + + # only write to file, if there is anything worthwhile to write! + if overwrite: + with open(intl_file_path, 'w', encoding='utf-8') as intl: + intl.write(out_txt + '\n#ifdef __cplusplus\n' + '}\n#endif\n' + '\n#endif') + return + + +# -------------------- MAIN -------------------- # + +if __name__ == '__main__': + try: + 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] + while _temp.endswith('/') or _temp.endswith('\\'): + _temp = _temp[:-1] + TARGET_DIR_PATH = _temp + except IndexError: + TARGET_DIR_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + print("No path provided, assuming parent directory:\n" + TARGET_DIR_PATH) + + CORE_NAME = clean_file_name(sys.argv[2]) + + DIR_PATH = os.path.dirname(os.path.realpath(__file__)) + H_FILE_PATH = os.path.join(TARGET_DIR_PATH, 'libretro_core_options.h') + INTL_FILE_PATH = os.path.join(TARGET_DIR_PATH, 'libretro_core_options_intl.h') + + print('Getting texts from libretro_core_options.h') + with open(H_FILE_PATH, 'r+', encoding='utf-8') as _h_file: + _main_text = _h_file.read() + _hash_n_str = get_texts(_main_text) + _files = create_msg_hash(DIR_PATH, CORE_NAME, _hash_n_str) + _source_jsons = h2json(_files) + + print('Getting texts from libretro_core_options_intl.h') + if os.path.isfile(INTL_FILE_PATH): + with open(INTL_FILE_PATH, 'r+', encoding='utf-8') as _intl_file: + _intl_text = _intl_file.read() + _hash_n_str_intl = get_texts(_intl_text) + _intl_files = create_msg_hash(DIR_PATH, CORE_NAME, _hash_n_str_intl) + _intl_jsons = h2json(_intl_files) + + print('\nAll done!') diff --git a/libretro-common/samples/core_options/example_translation/intl/crowdin.yaml b/libretro-common/samples/core_options/example_translation/intl/crowdin.yaml new file mode 100644 index 0000000000..6fefeb9759 --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/crowdin.yaml @@ -0,0 +1,13 @@ +"project_id": "380544" +"api_token": "_secret_" +"base_url": "https://api.crowdin.com" +"preserve_hierarchy": true + +"files": + [ + { + "source": "/_core_name_/_us.json", + "dest": "/_core_name_/_core_name_.json", + "translation": "/_core_name_/_%two_letters_code%.json", + }, + ] diff --git a/libretro-common/samples/core_options/example_translation/intl/crowdin_prep.py b/libretro-common/samples/core_options/example_translation/intl/crowdin_prep.py new file mode 100644 index 0000000000..a2c225e4c7 --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/crowdin_prep.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + +import core_option_translation as t + +if __name__ == '__main__': + try: + 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] + while _temp.endswith('/') or _temp.endswith('\\'): + _temp = _temp[:-1] + TARGET_DIR_PATH = _temp + except IndexError: + TARGET_DIR_PATH = t.os.path.dirname(t.os.path.dirname(t.os.path.realpath(__file__))) + print("No path provided, assuming parent directory:\n" + TARGET_DIR_PATH) + + CORE_NAME = t.clean_file_name(t.sys.argv[2]) + DIR_PATH = t.os.path.dirname(t.os.path.realpath(__file__)) + H_FILE_PATH = t.os.path.join(TARGET_DIR_PATH, 'libretro_core_options.h') + + print('Getting texts from libretro_core_options.h') + with open(H_FILE_PATH, 'r+', encoding='utf-8') as _h_file: + _main_text = _h_file.read() + _hash_n_str = t.get_texts(_main_text) + _files = t.create_msg_hash(DIR_PATH, CORE_NAME, _hash_n_str) + + _source_jsons = t.h2json(_files) + + print('\nAll done!') diff --git a/libretro-common/samples/core_options/example_translation/intl/crowdin_source_upload.py b/libretro-common/samples/core_options/example_translation/intl/crowdin_source_upload.py new file mode 100644 index 0000000000..52fb770f0c --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/crowdin_source_upload.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +import re +import os +import shutil +import subprocess +import sys +import urllib.request +import zipfile +import core_option_translation as t + +# -------------------- MAIN -------------------- # + +if __name__ == '__main__': + # Check Crowdin API Token and core name + try: + API_KEY = sys.argv[1] + CORE_NAME = t.clean_file_name(sys.argv[2]) + except IndexError as e: + 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') + + # Apply Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": "_secret_"', + f'"api_token": "{API_KEY}"', + crowdin_config, 1) + crowdin_config = re.sub(r'/_core_name_', + f'/{CORE_NAME}' + , crowdin_config) + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + try: + # Download Crowdin CLI + jar_name = 'crowdin-cli.jar' + jar_path = t.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) + + if not os.path.isfile(t.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]) + 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.remove(crowdin_cli_path) + shutil.rmtree(jar_dir) + + print('upload source *.json') + subprocess.run(['java', '-jar', jar_path, 'upload', 'sources', '--config', YAML_PATH]) + + # Reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*?"', + '"api_token": "_secret_"', + crowdin_config, 1) + + # TODO this is NOT safe! + crowdin_config = re.sub(re.escape(f'/{CORE_NAME}'), + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + except Exception as e: + # Try really hard to reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*?"', + '"api_token": "_secret_"', + crowdin_config, 1) + + # TODO this is NOT safe! + crowdin_config = re.sub(re.escape(f'/{CORE_NAME}'), + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + raise e diff --git a/libretro-common/samples/core_options/example_translation/intl/crowdin_translate.py b/libretro-common/samples/core_options/example_translation/intl/crowdin_translate.py new file mode 100644 index 0000000000..b4c911a1db --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/crowdin_translate.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +import core_option_translation as t + +if __name__ == '__main__': + try: + 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] + while _temp.endswith('/') or _temp.endswith('\\'): + _temp = _temp[:-1] + TARGET_DIR_PATH = _temp + except IndexError: + TARGET_DIR_PATH = t.os.path.dirname(t.os.path.dirname(t.os.path.realpath(__file__))) + print("No path provided, assuming parent directory:\n" + TARGET_DIR_PATH) + + CORE_NAME = t.clean_file_name(t.sys.argv[2]) + DIR_PATH = t.os.path.dirname(t.os.path.realpath(__file__)) + LOCALISATIONS_PATH = t.os.path.join(DIR_PATH, CORE_NAME) + US_FILE_PATH = t.os.path.join(LOCALISATIONS_PATH, '_us.h') + H_FILE_PATH = t.os.path.join(TARGET_DIR_PATH, 'libretro_core_options.h') + INTL_FILE_PATH = t.os.path.join(TARGET_DIR_PATH, 'libretro_core_options_intl.h') + + print('Getting texts from libretro_core_options.h') + with open(H_FILE_PATH, 'r+', encoding='utf-8') as _h_file: + _main_text = _h_file.read() + _hash_n_str = t.get_texts(_main_text) + _files = t.create_msg_hash(DIR_PATH, CORE_NAME, _hash_n_str) + _source_jsons = t.h2json(_files) + + print('Converting translations *.json to *.h:') + localisation_files = t.os.scandir(LOCALISATIONS_PATH) + t.json2h(LOCALISATIONS_PATH, localisation_files) + + print('Constructing libretro_core_options_intl.h') + t.create_intl_file(INTL_FILE_PATH, LOCALISATIONS_PATH, _main_text, _files["_us"]) + + print('\nAll done!') diff --git a/libretro-common/samples/core_options/example_translation/intl/crowdin_translation_download.py b/libretro-common/samples/core_options/example_translation/intl/crowdin_translation_download.py new file mode 100644 index 0000000000..d3e7027ffe --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/crowdin_translation_download.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +import re +import os +import shutil +import subprocess +import sys +import urllib.request +import zipfile +import core_option_translation as t + +# -------------------- MAIN -------------------- # + +if __name__ == '__main__': + # Check Crowdin API Token and core name + try: + API_KEY = sys.argv[1] + CORE_NAME = t.clean_file_name(sys.argv[2]) + except IndexError as e: + 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') + + # Apply Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": "_secret_"', + f'"api_token": "{API_KEY}"', + crowdin_config, 1) + crowdin_config = re.sub(r'/_core_name_', + f'/{CORE_NAME}' + , crowdin_config) + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + try: + # Download Crowdin CLI + jar_name = 'crowdin-cli.jar' + jar_path = t.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) + + if not os.path.isfile(t.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]) + 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.remove(crowdin_cli_path) + shutil.rmtree(jar_dir) + + print('download translation *.json') + subprocess.run(['java', '-jar', jar_path, 'download', '--config', YAML_PATH]) + + # Reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*?"', + '"api_token": "_secret_"', + crowdin_config, 1) + + # TODO this is NOT safe! + crowdin_config = re.sub(re.escape(f'/{CORE_NAME}'), + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + except Exception as e: + # Try really hard to reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*?"', + '"api_token": "_secret_"', + crowdin_config, 1) + + # TODO this is NOT safe! + crowdin_config = re.sub(re.escape(f'/{CORE_NAME}'), + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + raise e diff --git a/libretro-common/samples/core_options/example_translation/intl/download_workflow.py b/libretro-common/samples/core_options/example_translation/intl/download_workflow.py new file mode 100644 index 0000000000..5ce74dda9b --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/download_workflow.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +import sys +import subprocess + +try: + api_key = sys.argv[1] + core_name = sys.argv[2] + dir_path = sys.argv[3] +except IndexError as e: + print('Please provide path to libretro_core_options.h, Crowdin API Token and core name!') + raise e + +subprocess.run(['python3', 'intl/crowdin_prep.py', dir_path, core_name]) +subprocess.run(['python3', 'intl/crowdin_translation_download.py', api_key, core_name]) +subprocess.run(['python3', 'intl/crowdin_translate.py', dir_path, core_name]) diff --git a/libretro-common/samples/core_options/example_translation/intl/initial_sync.py b/libretro-common/samples/core_options/example_translation/intl/initial_sync.py new file mode 100644 index 0000000000..f774e42b6f --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/initial_sync.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 + +import re +import os +import shutil +import subprocess +import sys +import time +import urllib.request +import zipfile +import core_option_translation as t + +# -------------------- MAIN -------------------- # + +if __name__ == '__main__': + # Check Crowdin API Token and core name + try: + API_KEY = sys.argv[1] + CORE_NAME = t.clean_file_name(sys.argv[2]) + OPTIONS_PATH = t.clean_file_name(sys.argv[3]) + except IndexError as e: + print('Please provide Crowdin API Token, core name and path to the core options file!') + raise e + + 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: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": "_secret_"', + f'"api_token": "{API_KEY}"', + crowdin_config, 1) + crowdin_config = re.sub(r'/_core_name_(?=[/.])]', + f'/{CORE_NAME}' + , crowdin_config) + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + try: + jar_name = 'crowdin-cli.jar' + 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 = os.path.join(DIR_PATH, crowdin_cli_file) + + # Download Crowdin CLI + 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 = 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(os.path.join(DIR_PATH, jar_file), jar_path) + os.remove(crowdin_cli_path) + shutil.rmtree(jar_dir) + + # Create JSON data + subprocess.run(['python3', 'intl/core_option_translation.py', OPTIONS_PATH, CORE_NAME]) + print('upload source & translations *.json') + subprocess.run(['java', '-jar', jar_path, 'upload', 'sources', '--config', YAML_PATH]) + subprocess.run(['java', '-jar', jar_path, 'upload', 'translations', '--config', YAML_PATH]) + + print('wait for crowdin server to process data') + time.sleep(10) + + print('download translation *.json') + subprocess.run(['java', '-jar', jar_path, 'download', '--config', YAML_PATH]) + + # Reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*"', '"api_token": "_secret_"', crowdin_config, 1) + + # TODO This is technically not safe and could replace more than intended. + crowdin_config = re.sub(r'/' + re.escape(CORE_NAME) + r'(?=[/.])', + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + except Exception as e: + # Try really hard to reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*?"', + '"api_token": "_secret_"', + crowdin_config, 1) + + # TODO This is technically not safe and could replace more than intended. + crowdin_config = re.sub(r'/' + re.escape(CORE_NAME) + r'(?=[/.])', + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + raise e diff --git a/libretro-common/samples/core_options/example_translation/intl/remove_initial_cycle.py b/libretro-common/samples/core_options/example_translation/intl/remove_initial_cycle.py new file mode 100644 index 0000000000..9d90a50f18 --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/remove_initial_cycle.py @@ -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) diff --git a/libretro-common/samples/core_options/example_translation/intl/upload_workflow.py b/libretro-common/samples/core_options/example_translation/intl/upload_workflow.py new file mode 100644 index 0000000000..6bfff92768 --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/upload_workflow.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 + +import sys +import subprocess + +try: + api_key = sys.argv[1] + core_name = sys.argv[2] + dir_path = sys.argv[3] +except IndexError as e: + print('Please provide path to libretro_core_options.h, Crowdin API Token and core name!') + raise e + +subprocess.run(['python3', 'intl/crowdin_prep.py', dir_path, core_name]) +subprocess.run(['python3', 'intl/crowdin_source_upload.py', api_key, core_name]) diff --git a/libretro-common/samples/core_options/example_translation/intl/v1_to_v2_converter.py b/libretro-common/samples/core_options/example_translation/intl/v1_to_v2_converter.py new file mode 100644 index 0000000000..2e7fcf667f --- /dev/null +++ b/libretro-common/samples/core_options/example_translation/intl/v1_to_v2_converter.py @@ -0,0 +1,483 @@ +#!/usr/bin/env python3 + +"""Core options v1 to v2 converter + +Just run this script as follows, to convert 'libretro_core_options.h' & 'Libretro_coreoptions_intl.h' to v2: +python3 "/path/to/v1_to_v2_converter.py" "/path/to/where/libretro_core_options.h & Libretro_coreoptions_intl.h/are" + +The original files will be preserved as *.v1 +""" +import core_option_regex as cor +import os +import glob + + +def create_v2_code_file(struct_text, file_name): + def replace_option(option_match): + _offset = option_match.start(0) + + if option_match.group(3): + res = option_match.group(0)[:option_match.end(2) - _offset] + ',\n NULL' + \ + option_match.group(0)[option_match.end(2) - _offset:option_match.end(3) - _offset] + \ + 'NULL,\n NULL,\n ' + option_match.group(0)[option_match.end(3) - _offset:] + else: + return option_match.group(0) + + return res + + comment_v1 = '/*\n' \ + ' ********************************\n' \ + ' * VERSION: 1.3\n' \ + ' ********************************\n' \ + ' *\n' \ + ' * - 1.3: Move translations to libretro_core_options_intl.h\n' \ + ' * - libretro_core_options_intl.h includes BOM and utf-8\n' \ + ' * fix for MSVC 2010-2013\n' \ + ' * - Added HAVE_NO_LANGEXTRA flag to disable translations\n' \ + ' * on platforms/compilers without BOM support\n' \ + ' * - 1.2: Use core options v1 interface when\n' \ + ' * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1\n' \ + ' * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1)\n' \ + ' * - 1.1: Support generation of core options v0 retro_core_option_value\n' \ + ' * arrays containing options with a single value\n' \ + ' * - 1.0: First commit\n' \ + '*/\n' + + comment_v2 = '/*\n' \ + ' ********************************\n' \ + ' * VERSION: 2.0\n' \ + ' ********************************\n' \ + ' *\n' \ + ' * - 2.0: Add support for core options v2 interface\n' \ + ' * - 1.3: Move translations to libretro_core_options_intl.h\n' \ + ' * - libretro_core_options_intl.h includes BOM and utf-8\n' \ + ' * fix for MSVC 2010-2013\n' \ + ' * - Added HAVE_NO_LANGEXTRA flag to disable translations\n' \ + ' * on platforms/compilers without BOM support\n' \ + ' * - 1.2: Use core options v1 interface when\n' \ + ' * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1\n' \ + ' * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1)\n' \ + ' * - 1.1: Support generation of core options v0 retro_core_option_value\n' \ + ' * arrays containing options with a single value\n' \ + ' * - 1.0: First commit\n' \ + '*/\n' + + p_intl = cor.p_intl + p_set = cor.p_set + new_set = 'static INLINE void libretro_set_core_options(retro_environment_t environ_cb,\n' \ + ' bool *categories_supported)\n' \ + '{\n' \ + ' unsigned version = 0;\n' \ + '#ifndef HAVE_NO_LANGEXTRA\n' \ + ' unsigned language = 0;\n' \ + '#endif\n' \ + '\n' \ + ' if (!environ_cb || !categories_supported)\n' \ + ' return;\n' \ + '\n' \ + ' *categories_supported = false;\n' \ + '\n' \ + ' if (!environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version))\n' \ + ' version = 0;\n' \ + '\n' \ + ' if (version >= 2)\n' \ + ' {\n' \ + '#ifndef HAVE_NO_LANGEXTRA\n' \ + ' struct retro_core_options_v2_intl core_options_intl;\n' \ + '\n' \ + ' core_options_intl.us = &options_us;\n' \ + ' core_options_intl.local = NULL;\n' \ + '\n' \ + ' if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) &&\n' \ + ' (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH))\n' \ + ' core_options_intl.local = options_intl[language];\n' \ + '\n' \ + ' *categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL,\n' \ + ' &core_options_intl);\n' \ + '#else\n' \ + ' *categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2,\n' \ + ' &options_us);\n' \ + '#endif\n' \ + ' }\n' \ + ' else\n' \ + ' {\n' \ + ' size_t i, j;\n' \ + ' size_t option_index = 0;\n' \ + ' size_t num_options = 0;\n' \ + ' struct retro_core_option_definition\n' \ + ' *option_v1_defs_us = NULL;\n' \ + '#ifndef HAVE_NO_LANGEXTRA\n' \ + ' size_t num_options_intl = 0;\n' \ + ' struct retro_core_option_v2_definition\n' \ + ' *option_defs_intl = NULL;\n' \ + ' struct retro_core_option_definition\n' \ + ' *option_v1_defs_intl = NULL;\n' \ + ' struct retro_core_options_intl\n' \ + ' core_options_v1_intl;\n' \ + '#endif\n' \ + ' struct retro_variable *variables = NULL;\n' \ + ' char **values_buf = NULL;\n' \ + '\n' \ + ' /* Determine total number of options */\n' \ + ' while (true)\n' \ + ' {\n' \ + ' if (option_defs_us[num_options].key)\n' \ + ' num_options++;\n' \ + ' else\n' \ + ' break;\n' \ + ' }\n' \ + '\n' \ + ' if (version >= 1)\n' \ + ' {\n' \ + ' /* Allocate US array */\n' \ + ' option_v1_defs_us = (struct retro_core_option_definition *)\n' \ + ' calloc(num_options + 1, sizeof(struct retro_core_option_definition));\n' \ + '\n' \ + ' /* Copy parameters from option_defs_us array */\n' \ + ' for (i = 0; i < num_options; i++)\n' \ + ' {\n' \ + ' struct retro_core_option_v2_definition *option_def_us = &option_defs_us[i];\n' \ + ' struct retro_core_option_value *option_values = option_def_us->values;\n' \ + ' struct retro_core_option_definition *option_v1_def_us = &option_v1_defs_us[i];\n' \ + ' struct retro_core_option_value *option_v1_values = option_v1_def_us->values;\n' \ + '\n' \ + ' option_v1_def_us->key = option_def_us->key;\n' \ + ' option_v1_def_us->desc = option_def_us->desc;\n' \ + ' option_v1_def_us->info = option_def_us->info;\n' \ + ' option_v1_def_us->default_value = option_def_us->default_value;\n' \ + '\n' \ + ' /* Values must be copied individually... */\n' \ + ' while (option_values->value)\n' \ + ' {\n' \ + ' option_v1_values->value = option_values->value;\n' \ + ' option_v1_values->label = option_values->label;\n' \ + '\n' \ + ' option_values++;\n' \ + ' option_v1_values++;\n' \ + ' }\n' \ + ' }\n' \ + '\n' \ + '#ifndef HAVE_NO_LANGEXTRA\n' \ + ' if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) &&\n' \ + ' (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH) &&\n' \ + ' options_intl[language])\n' \ + ' option_defs_intl = options_intl[language]->definitions;\n' \ + '\n' \ + ' if (option_defs_intl)\n' \ + ' {\n' \ + ' /* Determine number of intl options */\n' \ + ' while (true)\n' \ + ' {\n' \ + ' if (option_defs_intl[num_options_intl].key)\n' \ + ' num_options_intl++;\n' \ + ' else\n' \ + ' break;\n' \ + ' }\n' \ + '\n' \ + ' /* Allocate intl array */\n' \ + ' option_v1_defs_intl = (struct retro_core_option_definition *)\n' \ + ' calloc(num_options_intl + 1, sizeof(struct retro_core_option_definition));\n' \ + '\n' \ + ' /* Copy parameters from option_defs_intl array */\n' \ + ' for (i = 0; i < num_options_intl; i++)\n' \ + ' {\n' \ + ' struct retro_core_option_v2_definition *option_def_intl = &option_defs_intl[i];\n' \ + ' struct retro_core_option_value *option_values = option_def_intl->values;\n' \ + ' struct retro_core_option_definition *option_v1_def_intl = &option_v1_defs_intl[i];\n' \ + ' struct retro_core_option_value *option_v1_values = option_v1_def_intl->values;\n' \ + '\n' \ + ' option_v1_def_intl->key = option_def_intl->key;\n' \ + ' option_v1_def_intl->desc = option_def_intl->desc;\n' \ + ' option_v1_def_intl->info = option_def_intl->info;\n' \ + ' option_v1_def_intl->default_value = option_def_intl->default_value;\n' \ + '\n' \ + ' /* Values must be copied individually... */\n' \ + ' while (option_values->value)\n' \ + ' {\n' \ + ' option_v1_values->value = option_values->value;\n' \ + ' option_v1_values->label = option_values->label;\n' \ + '\n' \ + ' option_values++;\n' \ + ' option_v1_values++;\n' \ + ' }\n' \ + ' }\n' \ + ' }\n' \ + '\n' \ + ' core_options_v1_intl.us = option_v1_defs_us;\n' \ + ' core_options_v1_intl.local = option_v1_defs_intl;\n' \ + '\n' \ + ' environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_v1_intl);\n' \ + '#else\n' \ + ' environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, option_v1_defs_us);\n' \ + '#endif\n' \ + ' }\n' \ + ' else\n' \ + ' {\n' \ + ' /* Allocate arrays */\n' \ + ' variables = (struct retro_variable *)calloc(num_options + 1,\n' \ + ' sizeof(struct retro_variable));\n' \ + ' values_buf = (char **)calloc(num_options, sizeof(char *));\n' \ + '\n' \ + ' if (!variables || !values_buf)\n' \ + ' goto error;\n' \ + '\n' \ + ' /* Copy parameters from option_defs_us array */\n' \ + ' for (i = 0; i < num_options; i++)\n' \ + ' {\n' \ + ' const char *key = option_defs_us[i].key;\n' \ + ' const char *desc = option_defs_us[i].desc;\n' \ + ' const char *default_value = option_defs_us[i].default_value;\n' \ + ' struct retro_core_option_value *values = option_defs_us[i].values;\n' \ + ' size_t buf_len = 3;\n' \ + ' size_t default_index = 0;\n' \ + '\n' \ + ' values_buf[i] = NULL;\n' \ + '\n' \ + ' if (desc)\n' \ + ' {\n' \ + ' size_t num_values = 0;\n' \ + '\n' \ + ' /* Determine number of values */\n' \ + ' while (true)\n' \ + ' {\n' \ + ' if (values[num_values].value)\n' \ + ' {\n' \ + ' /* Check if this is the default value */\n' \ + ' if (default_value)\n' \ + ' if (strcmp(values[num_values].value, default_value) == 0)\n' \ + ' default_index = num_values;\n' \ + '\n' \ + ' buf_len += strlen(values[num_values].value);\n' \ + ' num_values++;\n' \ + ' }\n' \ + ' else\n' \ + ' break;\n' \ + ' }\n' \ + '\n' \ + ' /* Build values string */\n' \ + ' if (num_values > 0)\n' \ + ' {\n' \ + ' buf_len += num_values - 1;\n' \ + ' buf_len += strlen(desc);\n' \ + '\n' \ + ' values_buf[i] = (char *)calloc(buf_len, sizeof(char));\n' \ + ' if (!values_buf[i])\n' \ + ' goto error;\n' \ + '\n' \ + ' strcpy(values_buf[i], desc);\n' \ + ' strcat(values_buf[i], "; ");\n' \ + '\n' \ + ' /* Default value goes first */\n' \ + ' strcat(values_buf[i], values[default_index].value);\n' \ + '\n' \ + ' /* Add remaining values */\n' \ + ' for (j = 0; j < num_values; j++)\n' \ + ' {\n' \ + ' if (j != default_index)\n' \ + ' {\n' \ + ' strcat(values_buf[i], "|");\n' \ + ' strcat(values_buf[i], values[j].value);\n' \ + ' }\n' \ + ' }\n' \ + ' }\n' \ + ' }\n' \ + '\n' \ + ' variables[option_index].key = key;\n' \ + ' variables[option_index].value = values_buf[i];\n' \ + ' option_index++;\n' \ + ' }\n' \ + '\n' \ + ' /* Set variables */\n' \ + ' environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);\n' \ + ' }\n' \ + '\n' \ + 'error:\n' \ + ' /* Clean up */\n' \ + '\n' \ + ' if (option_v1_defs_us)\n' \ + ' {\n' \ + ' free(option_v1_defs_us);\n' \ + ' option_v1_defs_us = NULL;\n' \ + ' }\n' \ + '\n' \ + '#ifndef HAVE_NO_LANGEXTRA\n' \ + ' if (option_v1_defs_intl)\n' \ + ' {\n' \ + ' free(option_v1_defs_intl);\n' \ + ' option_v1_defs_intl = NULL;\n' \ + ' }\n' \ + '#endif\n' \ + '\n' \ + ' if (values_buf)\n' \ + ' {\n' \ + ' for (i = 0; i < num_options; i++)\n' \ + ' {\n' \ + ' if (values_buf[i])\n' \ + ' {\n' \ + ' free(values_buf[i]);\n' \ + ' values_buf[i] = NULL;\n' \ + ' }\n' \ + ' }\n' \ + '\n' \ + ' free(values_buf);\n' \ + ' values_buf = NULL;\n' \ + ' }\n' \ + '\n' \ + ' if (variables)\n' \ + ' {\n' \ + ' free(variables);\n' \ + ' variables = NULL;\n' \ + ' }\n' \ + ' }\n' \ + '}\n' \ + '\n' \ + '#ifdef __cplusplus\n' \ + '}\n' \ + '#endif' + + struct_groups = cor.p_struct.finditer(struct_text) + out_text = struct_text + + for construct in struct_groups: + repl_text = '' + declaration = construct.group(1) + struct_match = cor.p_type_name.search(declaration) + if struct_match: + if struct_match.group(3): + struct_type_name_lang = struct_match.group(1, 2, 3) + declaration_end = declaration[struct_match.end(1):] + elif struct_match.group(4): + struct_type_name_lang = struct_match.group(1, 2, 4) + declaration_end = declaration[struct_match.end(1):] + else: + struct_type_name_lang = sum((struct_match.group(1, 2), ('_us',)), ()) + declaration_end = f'{declaration[struct_match.end(1):struct_match.end(2)]}_us' \ + f'{declaration[struct_match.end(2):]}' + else: + return -1 + + if 'retro_core_option_definition' == struct_type_name_lang[0]: + import shutil + shutil.copy(file_name, file_name + '.v1') + new_declaration = f'\nstruct retro_core_option_v2_category option_cats{struct_type_name_lang[2]}[] = ' \ + '{\n { NULL, NULL, NULL },\n' \ + '};\n\n' \ + + declaration[:struct_match.start(1)] + \ + 'retro_core_option_v2_definition' \ + + declaration_end + offset = construct.start(0) + repl_text = repl_text + cor.re.sub(cor.re.escape(declaration), new_declaration, + construct.group(0)[:construct.start(2) - offset]) + content = construct.group(2) + new_content = cor.p_option.sub(replace_option, content) + + repl_text = repl_text + new_content + cor.re.sub(r'{\s*NULL,\s*NULL,\s*NULL,\s*{\{0}},\s*NULL\s*},\s*};', + '{ NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL },\n};' + '\n\nstruct retro_core_options_v2 options' + + struct_type_name_lang[2] + ' = {\n' + f' option_cats{struct_type_name_lang[2]},\n' + f' option_defs{struct_type_name_lang[2]}\n' + '};', + construct.group(0)[construct.end(2) - offset:]) + 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: + out_text = cor.re.sub(cor.re.escape(comment_v1), comment_v2, out_text) + intl = p_intl.search(out_text) + if intl: + new_intl = out_text[:intl.start(1)] \ + + 'struct retro_core_options_v2 *options_intl[RETRO_LANGUAGE_LAST]' \ + + out_text[intl.end(1):intl.start(2)] \ + + '\n &options_us, /* RETRO_LANGUAGE_ENGLISH */\n' \ + ' &options_ja, /* RETRO_LANGUAGE_JAPANESE */\n' \ + ' &options_fr, /* RETRO_LANGUAGE_FRENCH */\n' \ + ' &options_es, /* RETRO_LANGUAGE_SPANISH */\n' \ + ' &options_de, /* RETRO_LANGUAGE_GERMAN */\n' \ + ' &options_it, /* RETRO_LANGUAGE_ITALIAN */\n' \ + ' &options_nl, /* RETRO_LANGUAGE_DUTCH */\n' \ + ' &options_pt_br, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */\n' \ + ' &options_pt_pt, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */\n' \ + ' &options_ru, /* RETRO_LANGUAGE_RUSSIAN */\n' \ + ' &options_ko, /* RETRO_LANGUAGE_KOREAN */\n' \ + ' &options_cht, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */\n' \ + ' &options_chs, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */\n' \ + ' &options_eo, /* RETRO_LANGUAGE_ESPERANTO */\n' \ + ' &options_pl, /* RETRO_LANGUAGE_POLISH */\n' \ + ' &options_vn, /* RETRO_LANGUAGE_VIETNAMESE */\n' \ + ' &options_ar, /* RETRO_LANGUAGE_ARABIC */\n' \ + ' &options_el, /* RETRO_LANGUAGE_GREEK */\n' \ + ' &options_tr, /* RETRO_LANGUAGE_TURKISH */\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: + out_text = p_set.sub(new_set, out_text) + code_file.write(out_text) + + return 1 + + +# -------------------- 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) + 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: + text = h_file.read() + try: + test = create_v2_code_file(text, file) + except Exception as e: + print(e) + test = -1 + if -1 > test: + print('Your file looks like it already is v2? (' + file + ')') + continue + if 0 > test: + print('An error occured! Please make sure to use the complete v1 struct! (' + file + ')') + continue + else: + print(file + ' not found.') diff --git a/libretro-common/samples/core_options/example_translation/libretro_core_options.h b/libretro-common/samples/core_options/example_translation/libretro_core_options.h index 7d583cb8c8..1e4ea5d060 100644 --- a/libretro-common/samples/core_options/example_translation/libretro_core_options.h +++ b/libretro-common/samples/core_options/example_translation/libretro_core_options.h @@ -13,9 +13,10 @@ /* ******************************** - * VERSION: 1.3 + * 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 @@ -48,11 +49,36 @@ extern "C" { * - Will be used as a fallback for any missing entries in * frontend language definition */ -struct retro_core_option_definition option_defs_us[] = { +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 */ @@ -64,8 +90,14 @@ struct retro_core_option_definition option_defs_us[] = { }, { "mycore_video_scale", - "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 */ @@ -77,8 +109,13 @@ struct retro_core_option_definition option_defs_us[] = { }, { "mycore_overclock", + "Advanced > Reduce Slowdown", "Reduce Slowdown", - "Enable CPU overclock (unsafe).", + "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 */ @@ -86,7 +123,12 @@ struct retro_core_option_definition option_defs_us[] = { }, "disabled" }, - { NULL, NULL, NULL, {{0}}, NULL }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; + +struct retro_core_options_v2 options_us = { + option_cats_us, + option_defs_us }; /* @@ -96,35 +138,39 @@ struct retro_core_option_definition option_defs_us[] = { */ #ifndef HAVE_NO_LANGEXTRA -struct retro_core_option_definition *option_defs_intl[RETRO_LANGUAGE_LAST] = { - option_defs_us, /* RETRO_LANGUAGE_ENGLISH */ - NULL, /* RETRO_LANGUAGE_JAPANESE */ - option_defs_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 */ - NULL, /* RETRO_LANGUAGE_INDONESIAN */ - NULL, /* RETRO_LANGUAGE_SWEDISH */ - NULL, /* RETRO_LANGUAGE_UKRAINIAN */ - NULL, /* RETRO_LANGUAGE_CZECH */ +struct retro_core_options_v2 *options_intl[RETRO_LANGUAGE_LAST] = { + &options_us, /* RETRO_LANGUAGE_ENGLISH */ + &options_ja, /* RETRO_LANGUAGE_JAPANESE */ + &options_fr, /* RETRO_LANGUAGE_FRENCH */ + &options_es, /* RETRO_LANGUAGE_SPANISH */ + &options_de, /* RETRO_LANGUAGE_GERMAN */ + &options_it, /* RETRO_LANGUAGE_ITALIAN */ + &options_nl, /* RETRO_LANGUAGE_DUTCH */ + &options_pt_br, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ + &options_pt_pt, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */ + &options_ru, /* RETRO_LANGUAGE_RUSSIAN */ + &options_ko, /* RETRO_LANGUAGE_KOREAN */ + &options_cht, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */ + &options_chs, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */ + &options_eo, /* RETRO_LANGUAGE_ESPERANTO */ + &options_pl, /* RETRO_LANGUAGE_POLISH */ + &options_vn, /* RETRO_LANGUAGE_VIETNAMESE */ + &options_ar, /* RETRO_LANGUAGE_ARABIC */ + &options_el, /* RETRO_LANGUAGE_GREEK */ + &options_tr, /* RETRO_LANGUAGE_TURKISH */ + &options_sk, /* RETRO_LANGUAGE_SLOVAK */ + &options_fa, /* RETRO_LANGUAGE_PERSIAN */ + &options_he, /* RETRO_LANGUAGE_HEBREW */ + &options_ast, /* RETRO_LANGUAGE_ASTURIAN */ + &options_fi, /* RETRO_LANGUAGE_FINNISH */ + &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 @@ -142,124 +188,250 @@ struct retro_core_option_definition *option_defs_intl[RETRO_LANGUAGE_LAST] = { * be as painless as possible for core devs) */ -static INLINE void libretro_set_core_options(retro_environment_t environ_cb) +static INLINE void libretro_set_core_options(retro_environment_t environ_cb, + bool *categories_supported) { - unsigned version = 0; + unsigned version = 0; +#ifndef HAVE_NO_LANGEXTRA + unsigned language = 0; +#endif - if (!environ_cb) + if (!environ_cb || !categories_supported) return; - if (environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version) && (version >= 1)) + *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_intl core_options_intl; - unsigned language = 0; + struct retro_core_options_v2_intl core_options_intl; - core_options_intl.us = option_defs_us; + 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 = option_defs_intl[language]; + core_options_intl.local = options_intl[language]; - environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_intl); + *categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL, + &core_options_intl); #else - environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, &option_defs_us); + *categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2, + &options_us); #endif } else { - size_t i; + 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 number of options */ - for (;;) + /* Determine total number of options */ + while (true) { - if (!option_defs_us[num_options].key) + if (option_defs_us[num_options].key) + num_options++; + else break; - num_options++; } - /* 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++) + if (version >= 1) { - 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; + /* Allocate US array */ + option_v1_defs_us = (struct retro_core_option_definition *) + calloc(num_options + 1, sizeof(struct retro_core_option_definition)); - values_buf[i] = NULL; - - if (desc) + /* Copy parameters from option_defs_us array */ + for (i = 0; i < num_options; i++) { - size_t num_values = 0; + 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; - /* Determine number of values */ - for (;;) + 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) { - if (!values[num_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; - - /* 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++; } - /* Build values string */ - if (num_values > 0) + /* 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++) { - size_t j; + 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; - buf_len += num_values - 1; - buf_len += strlen(desc); + 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_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++) + /* Values must be copied individually... */ + while (option_values->value) { - if (j != default_index) - { - strcat(values_buf[i], "|"); - strcat(values_buf[i], values[j].value); - } + option_v1_values->value = option_values->value; + option_v1_values->label = option_values->label; + + option_values++; + option_v1_values++; } } } - variables[i].key = key; - variables[i].value = values_buf[i]; + 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) + { + 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); } - /* 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++) diff --git a/libretro-common/samples/core_options/example_translation/libretro_core_options_intl.h b/libretro-common/samples/core_options/example_translation/libretro_core_options_intl.h index 521c8f4798..0eaf762fb7 100644 --- a/libretro-common/samples/core_options/example_translation/libretro_core_options_intl.h +++ b/libretro-common/samples/core_options/example_translation/libretro_core_options_intl.h @@ -11,9 +11,10 @@ /* ******************************** - * VERSION: 1.3 + * 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 @@ -41,11 +42,29 @@ extern "C" { /* RETRO_LANGUAGE_FRENCH */ -struct retro_core_option_definition option_defs_fr[] = { +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 */ @@ -53,12 +72,16 @@ struct retro_core_option_definition option_defs_fr[] = { { "pal", "L'Europe" }, { NULL, NULL }, }, - NULL /* default_value is taken from option_defs_us -> can set to NULL here */ + NULL /* default_value is taken from option_defs_us + * -> can set to NULL here */ }, { "mycore_video_scale", - "Échelle vidéo", + "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 */ }, @@ -66,14 +89,23 @@ struct retro_core_option_definition option_defs_fr[] = { }, { "mycore_overclock", + "Avancé > Réduire le ralentissement", "Réduire le ralentissement", - "Activer l'overclocking du processeur (non sécurisé).", + "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, {{0}}, 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 */ diff --git a/libretro-common/samples/core_options/example_translation/translation scripts/.github/workflows/crowdin_intl.yml b/libretro-common/samples/core_options/example_translation/translation scripts/.github/workflows/crowdin_intl.yml deleted file mode 100644 index 44e9fe9647..0000000000 --- a/libretro-common/samples/core_options/example_translation/translation scripts/.github/workflows/crowdin_intl.yml +++ /dev/null @@ -1,41 +0,0 @@ -# Recreate libretro_core_options_intl.h using translations form Crowdin - -name: Crowdin Translation Integration - -on: - push: - branches: - - master - paths: - - 'intl/*/*' - -jobs: - create_intl_file: - runs-on: ubuntu-latest - steps: - - name: Setup Python - uses: actions/setup-python@v2 - - - name: Checkout - uses: actions/checkout@v2 - 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. - - - name: Create intl file - shell: bash - run: | - python3 intl/crowdin_intl.py '' - - - name: Commit files - run: | - git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" - git config --local user.name "github-actions[bot]" - git add - git commit -m "Recreate libretro_core_options_intl.h" -a - - - name: GitHub Push - uses: ad-m/github-push-action@v0.6.0 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: ${{ github.ref }} diff --git a/libretro-common/samples/core_options/example_translation/translation scripts/.github/workflows/crowdin_prep.yml b/libretro-common/samples/core_options/example_translation/translation scripts/.github/workflows/crowdin_prep.yml deleted file mode 100644 index 86219ee930..0000000000 --- a/libretro-common/samples/core_options/example_translation/translation scripts/.github/workflows/crowdin_prep.yml +++ /dev/null @@ -1,41 +0,0 @@ -# Prepare source for Crowdin sync - -name: Crowdin Upload Preparation - -on: - push: - branches: - - master - paths: - - '' - -jobs: - prepare_source_file: - runs-on: ubuntu-latest - steps: - - name: Setup Python - uses: actions/setup-python@v2 - - - name: Checkout - uses: actions/checkout@v2 - 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. - - - name: Crowdin Prep - shell: bash - run: | - python3 intl/crowdin_prep.py '' - - - name: Commit files - run: | - git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" - git config --local user.name "github-actions[bot]" - git add intl/* - git commit -m "Recreate translation source text files" -a - - - name: GitHub Push - uses: ad-m/github-push-action@v0.6.0 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: ${{ github.ref }} diff --git a/libretro-common/samples/core_options/example_translation/translation scripts/crowdin.yml b/libretro-common/samples/core_options/example_translation/translation scripts/crowdin.yml deleted file mode 100644 index b6e4730218..0000000000 --- a/libretro-common/samples/core_options/example_translation/translation scripts/crowdin.yml +++ /dev/null @@ -1,3 +0,0 @@ -files: - - source: /intl/_us/*.json - translation: /intl/_%two_letters_code%/%original_file_name% diff --git a/libretro-common/samples/core_options/example_translation/translation scripts/instructions.txt b/libretro-common/samples/core_options/example_translation/translation scripts/instructions.txt deleted file mode 100644 index afd2d11232..0000000000 --- a/libretro-common/samples/core_options/example_translation/translation scripts/instructions.txt +++ /dev/null @@ -1,47 +0,0 @@ -Place 'crowdin.yml' & the 'intl' and '.github' folder, including content, into the root of the repo. - -In '.github/workflows' are two files: 'crowdin_intl.yml' & 'crowdin_prep.yml' -In each of those are place holders, which need to be replaced as follows: - - --> replace with the path from the root of the repo to the directory containing -'libretro_core_options.h' (it is assumed that 'libretro_core_options.h' & -'libretro_core_options_intl.h' are in the same directory) - - --> replace with the full path from the root of the repo to the 'libretro_core_options.h' file - - --> replace with the full path from the root of the repo to the 'libretro_core_options_intl.h' file - - -From the root of the repo run (using bash): -python3 intl/core_opt_translation.py '' - -(If python3 doesn't work, try just python) - -Push changes to repo. Once merged, request Crowdin integration. - - -Crowdin integration: - -On the project page, go to the Applications tab. Choose GitHub. -There are two options: connecting a GitHub account, which has write/commit permissions to the repo -or providing a GitHub token, which will unlock these permissions. - -Then add a repository, a new interface opens. Pick the repository as well as the branch, which you want to sync. -On the right, Crowdin will display the default name of the repository it will use for creating PRs. -Below, set the sync schedule and then save. With that the synchronisation should be set up. -If there are still problems, you might need to manually modify the configuration (double click on the branch in the lower frame). - -Here's what the file paths should look like (the '/' at the start is very important!): - -Source files path: -/intl/_us/*.json - -Translated files path: -/intl/_%two_letters_code%/%original_file_name% - - -Once Crowdin successfully creates the PR & it has been merged, the automatically created branch can be deleted on GitHub. - diff --git a/libretro-common/samples/core_options/example_translation/translation scripts/intl/.gitignore b/libretro-common/samples/core_options/example_translation/translation scripts/intl/.gitignore deleted file mode 100644 index bee8a64b79..0000000000 --- a/libretro-common/samples/core_options/example_translation/translation scripts/intl/.gitignore +++ /dev/null @@ -1 +0,0 @@ -__pycache__ diff --git a/libretro-common/samples/core_options/example_translation/translation scripts/intl/core_opt_translation.py b/libretro-common/samples/core_options/example_translation/translation scripts/intl/core_opt_translation.py deleted file mode 100644 index 37ec7d1c97..0000000000 --- a/libretro-common/samples/core_options/example_translation/translation scripts/intl/core_opt_translation.py +++ /dev/null @@ -1,609 +0,0 @@ -#!/usr/bin/env python3 - -"""Core options text extractor - -The purpose of this script is to set up & provide functions for automatic generation of 'libretro_core_options_intl.h' -from 'libretro_core_options.h' using translations from Crowdin. - -Both v1 and v2 structs are supported. It is, however, recommended to convert v1 files to v2 using the included -'v1_to_v2_converter.py'. - -Usage: -python3 path/to/core_opt_translation.py "path/to/where/libretro_core_options.h & libretro_core_options_intl.h/are" - -This script will: -1.) create key words for & extract the texts from libretro_core_options.h & save them into intl/_us/core_options.h -2.) do the same for any present translations in libretro_core_options_intl.h, saving those in their respective folder -""" -import core_option_regex as cor -import re -import os -import sys -import json -import urllib.request as req -import shutil - -# for uploading translations to Crowdin, the Crowdin 'language id' is required -LANG_CODE_TO_ID = {'_ar': 'ar', - '_ast': 'ast', - '_chs': 'zh-CN', - '_cht': 'zh-TW', - '_cs': 'cs', - '_cy': 'cy', - '_da': 'da', - '_de': 'de', - '_el': 'el', - '_eo': 'eo', - '_es': 'es-ES', - '_fa': 'fa', - '_fi': 'fi', - '_fr': 'fr', - '_gl': 'gl', - '_he': 'he', - '_hu': 'hu', - '_id': 'id', - '_it': 'it', - '_ja': 'ja', - '_ko': 'ko', - '_nl': 'nl', - '_pl': 'pl', - '_pt_br': 'pt-BR', - '_pt_pt': 'pt-PT', - '_ru': 'ru', - '_sk': 'sk', - '_sv': 'sv-SE', - '_tr': 'tr', - '_uk': 'uk', - '_vn': 'vi'} -LANG_CODE_TO_R_LANG = {'_ar': 'RETRO_LANGUAGE_ARABIC', - '_ast': 'RETRO_LANGUAGE_ASTURIAN', - '_chs': 'RETRO_LANGUAGE_CHINESE_SIMPLIFIED', - '_cht': 'RETRO_LANGUAGE_CHINESE_TRADITIONAL', - '_cs': 'RETRO_LANGUAGE_CZECH', - '_cy': 'RETRO_LANGUAGE_WELSH', - '_da': 'RETRO_LANGUAGE_DANISH', - '_de': 'RETRO_LANGUAGE_GERMAN', - '_el': 'RETRO_LANGUAGE_GREEK', - '_eo': 'RETRO_LANGUAGE_ESPERANTO', - '_es': 'RETRO_LANGUAGE_SPANISH', - '_fa': 'RETRO_LANGUAGE_PERSIAN', - '_fi': 'RETRO_LANGUAGE_FINNISH', - '_fr': 'RETRO_LANGUAGE_FRENCH', - '_gl': 'RETRO_LANGUAGE_GALICIAN', - '_he': 'RETRO_LANGUAGE_HEBREW', - '_hu': 'RETRO_LANGUAGE_HUNGARIAN', - '_id': 'RETRO_LANGUAGE_INDONESIAN', - '_it': 'RETRO_LANGUAGE_ITALIAN', - '_ja': 'RETRO_LANGUAGE_JAPANESE', - '_ko': 'RETRO_LANGUAGE_KOREAN', - '_nl': 'RETRO_LANGUAGE_DUTCH', - '_pl': 'RETRO_LANGUAGE_POLISH', - '_pt_br': 'RETRO_LANGUAGE_PORTUGUESE_BRAZIL', - '_pt_pt': 'RETRO_LANGUAGE_PORTUGUESE_PORTUGAL', - '_ru': 'RETRO_LANGUAGE_RUSSIAN', - '_sk': 'RETRO_LANGUAGE_SLOVAK', - '_sv': 'RETRO_LANGUAGE_SWEDISH', - '_tr': 'RETRO_LANGUAGE_TURKISH', - '_uk': 'RETRO_LANGUAGE_UKRAINIAN', - '_us': 'RETRO_LANGUAGE_ENGLISH', - '_vn': 'RETRO_LANGUAGE_VIETNAMESE'} - -# these are handled by RetroArch directly - no need to include them in core translations -ON_OFFS = {'"enabled"', '"disabled"', '"true"', '"false"', '"on"', '"off"'} - - -def remove_special_chars(text: str, char_set=0) -> str: - """Removes special characters from a text. - - :param text: String to be cleaned. - :param char_set: 0 -> remove all ASCII special chars except for '_' & 'space'; - 1 -> remove invalid chars from file names - :return: Clean text. - """ - command_chars = [chr(unicode) for unicode in tuple(range(0, 32)) + (127,)] - special_chars = ([chr(unicode) for unicode in tuple(range(33, 48)) + tuple(range(58, 65)) + tuple(range(91, 95)) - + (96,) + tuple(range(123, 127))], - ('\\', '/', ':', '*', '?', '"', '<', '>', '|')) - res = text - for cm in command_chars: - res = res.replace(cm, '_') - for sp in special_chars[char_set]: - res = res.replace(sp, '_') - while res.startswith('_'): - res = res[1:] - while res.endswith('_'): - res = res[:-1] - return res - - -def clean_file_name(file_name: str) -> str: - """Removes characters which might make file_name inappropriate for files on some OS. - - :param file_name: File name to be cleaned. - :return: The clean file name. - """ - file_name = remove_special_chars(file_name, 1) - file_name = re.sub(r'__+', '_', file_name.replace(' ', '_')) - return file_name - - -def get_struct_type_name(decl: str) -> tuple: - """ Returns relevant parts of the struct declaration: - type, name of the struct and the language appendix, if present. - :param decl: The struct declaration matched by cor.p_type_name. - :return: Tuple, e.g.: ('retro_core_option_definition', 'option_defs_us', '_us') - """ - struct_match = cor.p_type_name.search(decl) - if struct_match: - if struct_match.group(3): - struct_type_name = struct_match.group(1, 2, 3) - return struct_type_name - elif struct_match.group(4): - struct_type_name = struct_match.group(1, 2, 4) - return struct_type_name - else: - struct_type_name = struct_match.group(1, 2) - return struct_type_name - else: - raise ValueError(f'No or incomplete struct declaration: {decl}!\n' - 'Please make sure all structs are complete, including the type and name declaration.') - - -def is_viable_non_dupe(text: str, comparison) -> bool: - """text must be longer than 2 ('""'), not 'NULL' and not in comparison. - - :param text: String to be tested. - :param comparison: Dictionary or set to search for text in. - :return: bool - """ - return 2 < len(text) and text != 'NULL' and text not in comparison - - -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"'}. - - :param text: String to be tested. - :return: bool - """ - return 2 < len(text) and text != 'NULL' and text.lower() not in ON_OFFS - - -def create_non_dupe(base_name: str, opt_num: int, comparison) -> str: - """Makes sure base_name is not in comparison, and if it is it's renamed. - - :param base_name: Name to check/make unique. - :param opt_num: Number of the option base_name belongs to, used in making it unique. - :param comparison: Dictionary or set to search for base_name in. - :return: Unique name. - """ - h = base_name - if h in comparison: - n = 0 - h = h + '_O' + str(opt_num) - h_end = len(h) - while h in comparison: - h = h[:h_end] + '_' + str(n) - n += 1 - return h - - -def get_texts(text: str) -> dict: - """Extracts the strings, which are to be translated/are the translations, - from text and creates macro names for them. - - :param text: The string to be parsed. - :return: Dictionary of the form { '_': { 'macro': 'string', ... }, ... }. - """ - # all structs: group(0) full struct, group(1) beginning, group(2) content - structs = cor.p_struct.finditer(text) - hash_n_string = {} - just_string = {} - for struct in structs: - struct_declaration = struct.group(1) - struct_type_name = get_struct_type_name(struct_declaration) - if 3 > len(struct_type_name): - lang = '_us' - else: - lang = struct_type_name[2] - if lang not in just_string: - hash_n_string[lang] = {} - just_string[lang] = set() - - is_v2 = False - pre_name = '' - 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]: - pre_name = 'CATEGORY_' - p = cor.p_info_cat - - struct_content = struct.group(2) - # 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): - # group 1: key - if option.group(1): - opt_name = pre_name + option.group(1) - # no special chars allowed in key - opt_name = remove_special_chars(opt_name).upper().replace(' ', '_') - else: - raise ValueError(f'No option name (key) found in struct {struct_type_name[1]} option {opt}!') - - # group 2: description0 - if option.group(2): - desc0 = option.group(2) - if is_viable_non_dupe(desc0, just_string[lang]): - just_string[lang].add(desc0) - m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_LABEL'), opt, hash_n_string[lang]) - hash_n_string[lang][m_h] = desc0 - else: - raise ValueError(f'No label found in struct {struct_type_name[1]} option {option.group(1)}!') - - # group 3: desc1, info0, info1, category - if option.group(3): - infos = option.group(3) - option_info = p.finditer(infos) - if is_v2: - desc1 = next(option_info).group(1) - if is_viable_non_dupe(desc1, just_string[lang]): - just_string[lang].add(desc1) - m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_LABEL_CAT'), opt, hash_n_string[lang]) - hash_n_string[lang][m_h] = desc1 - last = None - m_h = None - for j, info in enumerate(option_info): - last = info.group(1) - if is_viable_non_dupe(last, just_string[lang]): - just_string[lang].add(last) - m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_INFO_{j}'), opt, - hash_n_string[lang]) - hash_n_string[lang][m_h] = last - if last in just_string[lang]: # category key should not be translated - hash_n_string[lang].pop(m_h) - just_string[lang].remove(last) - else: - for j, info in enumerate(option_info): - gr1 = info.group(1) - if is_viable_non_dupe(gr1, just_string[lang]): - just_string[lang].add(gr1) - m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_INFO_{j}'), opt, - hash_n_string[lang]) - hash_n_string[lang][m_h] = gr1 - else: - raise ValueError(f'Too few arguments in struct {struct_type_name[1]} option {option.group(1)}!') - - # group 4: - 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 - set_value = set_key - # 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(): - clean_key = set_key.encode('ascii', errors='ignore').decode('unicode-escape')[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]) - hash_n_string[lang][m_h] = set_value - just_string[lang].add(set_value) - return hash_n_string - - -def create_msg_hash(intl_dir_path: str, core_name: str, keyword_string_dict: dict) -> dict: - """Creates '.h' files in 'intl/_/' containing the macro name & string combinations. - - :param intl_dir_path: Path to the intl directory. - :param core_name: Name of the core, used for naming the files. - :param keyword_string_dict: Dictionary of the form { '_': { 'macro': 'string', ... }, ... }. - :return: Dictionary of the form { '_': 'path/to/file (./intl/_/.h)', ... }. - """ - files = {} - for localisation in keyword_string_dict: - path = os.path.join(intl_dir_path, localisation) # intl/_ - files[localisation] = os.path.join(path, core_name + '.h') # intl/_/.h - if not os.path.exists(path): - os.makedirs(path) - with open(files[localisation], 'w', encoding='utf-8') as crowdin_file: - out_text = '' - for keyword in keyword_string_dict[localisation]: - out_text = f'{out_text}{keyword} {keyword_string_dict[localisation][keyword]}\n' - crowdin_file.write(out_text) - return files - - -def h2json(file_paths: dict) -> dict: - """Converts .h files pointed to by file_paths into .jsons. - - :param file_paths: Dictionary of the form { '_': 'path/to/file (./intl/_/.h)', ... }. - :return: Dictionary of the form { '_': 'path/to/file (./intl/_/.json)', ... }. - """ - jsons = {} - for file_lang in file_paths: - jsons[file_lang] = file_paths[file_lang][:-2] + '.json' - - p = cor.p_masked - - with open(file_paths[file_lang], 'r+', encoding='utf-8') as h_file: - text = h_file.read() - result = p.finditer(text) - messages = {} - for msg in result: - key, val = msg.group(1, 2) - if key not in messages: - if key and val: - # unescape & remove "\n" - messages[key] = re.sub(r'"\s*(?:(?:/\*(?:.|[\r\n])*?\*/|//.*[\r\n]+)\s*)*"', - '\\\n', val[1:-1].replace('\\\"', '"')) - else: - print(f"DUPLICATE KEY in {file_paths[file_lang]}: {key}") - with open(jsons[file_lang], 'w', encoding='utf-8') as json_file: - json.dump(messages, json_file, indent=2) - - return jsons - - -def json2h(intl_dir_path: str, json_file_path: str, core_name: str) -> None: - """Converts .json file in json_file_path into an .h ready to be included in C code. - - :param intl_dir_path: Path to the intl directory. - :param json_file_path: Base path of translation .json. - :param core_name: Name of the core, required for naming the files. - :return: None - """ - h_filename = os.path.join(json_file_path, core_name + '.h') - json_filename = os.path.join(json_file_path, core_name + '.json') - file_lang = os.path.basename(json_file_path).upper() - - if os.path.basename(json_file_path).lower() == '_us': - print(' skipped') - return - - p = cor.p_masked - - def update(s_messages, s_template, s_source_messages): - translation = '' - template_messages = p.finditer(s_template) - for tp_msg in template_messages: - old_key = tp_msg.group(1) - if old_key in s_messages and s_messages[old_key] != s_source_messages[old_key]: - tl_msg_val = s_messages[old_key] - tl_msg_val = tl_msg_val.replace('"', '\\\"').replace('\n', '') # escape - translation = ''.join((translation, '#define ', old_key, file_lang, f' "{tl_msg_val}"\n')) - - else: # Remove English duplicates and non-translatable strings - translation = ''.join((translation, '#define ', old_key, file_lang, ' NULL\n')) - return translation - - with open(os.path.join(intl_dir_path, '_us', core_name + '.h'), 'r', encoding='utf-8') as template_file: - template = template_file.read() - with open(os.path.join(intl_dir_path, '_us', core_name + '.json'), 'r+', encoding='utf-8') as source_json_file: - source_messages = json.load(source_json_file) - with open(json_filename, 'r+', encoding='utf-8') as json_file: - messages = json.load(json_file) - new_translation = update(messages, template, source_messages) - with open(h_filename, 'w', encoding='utf-8') as h_file: - h_file.seek(0) - h_file.write(new_translation) - h_file.truncate() - return - - -def get_crowdin_client(dir_path: str) -> str: - """Makes sure the Crowdin CLI client is present. If it isn't, it is fetched & extracted. - - :return: The path to 'crowdin-cli.jar'. - """ - jar_name = 'crowdin-cli.jar' - jar_path = os.path.join(dir_path, jar_name) - - if not os.path.isfile(jar_path): - print('Downloading crowdin-cli.jar') - crowdin_cli_file = os.path.join(dir_path, 'crowdin-cli.zip') - crowdin_cli_url = 'https://downloads.crowdin.com/cli/v3/crowdin-cli.zip' - req.urlretrieve(crowdin_cli_url, crowdin_cli_file) - import zipfile - with zipfile.ZipFile(crowdin_cli_file, 'r') as zip_ref: - jar_dir = zip_ref.namelist()[0] - for file in zip_ref.namelist(): - if file.endswith(jar_name): - jar_file = file - break - zip_ref.extract(jar_file) - os.rename(jar_file, jar_path) - os.remove(crowdin_cli_file) - shutil.rmtree(jar_dir) - return jar_path - - -def create_intl_file(intl_file_path: str, intl_dir_path: str, text: str, core_name: str, file_path: str) -> None: - """Creates 'libretro_core_options_intl.h' from Crowdin translations. - - :param intl_file_path: Path to 'libretro_core_options_intl.h' - :param intl_dir_path: Path to the intl directory. - :param text: Content of the 'libretro_core_options.h' being translated. - :param core_name: Name of the core. Needed to identify the files to pull the translations from. - :param file_path: Path to the '_us.h' file, containing the original English texts. - :return: None - """ - msg_dict = {} - lang_up = '' - - def replace_pair(pair_match): - """Replaces a key-value-pair of an option with the macros corresponding to the language. - - :param pair_match: The re match object representing the key-value-pair block. - :return: Replacement string. - """ - offset = pair_match.start(0) - if pair_match.group(1): # key - if pair_match.group(2) in msg_dict: # value - val = msg_dict[pair_match.group(2)] + lang_up - elif pair_match.group(1) in msg_dict: # use key if value not viable (e.g. NULL) - val = msg_dict[pair_match.group(1)] + lang_up - else: - return pair_match.group(0) - else: - return pair_match.group(0) - res = pair_match.group(0)[:pair_match.start(2) - offset] + val \ - + pair_match.group(0)[pair_match.end(2) - offset:] - return res - - def replace_info(info_match): - """Replaces the 'additional strings' of an option with the macros corresponding to the language. - - :param info_match: The re match object representing the 'additional strings' block. - :return: Replacement string. - """ - offset = info_match.start(0) - if info_match.group(1) in msg_dict: - res = info_match.group(0)[:info_match.start(1) - offset] + \ - msg_dict[info_match.group(1)] + lang_up + \ - info_match.group(0)[info_match.end(1) - offset:] - return res - else: - return info_match.group(0) - - def replace_option(option_match): - """Replaces strings within an option - '{ "opt_key", "label", "additional strings", ..., { {"key", "value"}, ... }, ... }' - within a struct with the macros corresponding to the language: - '{ "opt_key", MACRO_LABEL, MACRO_STRINGS, ..., { {"key", MACRO_VALUE}, ... }, ... }' - - :param option_match: The re match object representing the option. - :return: Replacement string. - """ - # label - offset = option_match.start(0) - if option_match.group(2): - res = option_match.group(0)[:option_match.start(2) - offset] + msg_dict[option_match.group(2)] + lang_up - else: - return option_match.group(0) - # additional block - if option_match.group(3): - res = res + option_match.group(0)[option_match.end(2) - offset:option_match.start(3) - offset] - new_info = p.sub(replace_info, option_match.group(3)) - res = res + new_info - else: - return res + option_match.group(0)[option_match.end(2) - offset:] - # key-value-pairs - if option_match.group(4): - res = res + option_match.group(0)[option_match.end(3) - offset:option_match.start(4) - offset] - new_pairs = cor.p_key_value.sub(replace_pair, option_match.group(4)) - res = res + new_pairs + option_match.group(0)[option_match.end(4) - offset:] - else: - res = res + option_match.group(0)[option_match.end(3) - offset:] - - return res - - with open(file_path, 'r+', encoding='utf-8') as template: # intl/_us/.h - masked_msgs = cor.p_masked.finditer(template.read()) - for msg in masked_msgs: - msg_dict[msg.group(2)] = msg.group(1) - - with open(intl_file_path, 'r', encoding='utf-8') as intl: # libretro_core_options_intl.h - in_text = intl.read() - intl_start = re.search(re.escape('/*\n' - ' ********************************\n' - ' * Core Option Definitions\n' - ' ********************************\n' - '*/\n'), in_text) - if intl_start: - out_txt = in_text[:intl_start.end(0)] - else: - intl_start = re.search(re.escape('#ifdef __cplusplus\n' - 'extern "C" {\n' - '#endif\n'), in_text) - out_txt = in_text[:intl_start.end(0)] - - for folder in os.listdir(intl_dir_path): # intl/_* - if os.path.isdir(os.path.join(intl_dir_path, folder)) and folder.startswith('_')\ - and folder != '_us' and folder != '__pycache__': - translation_path = os.path.join(intl_dir_path, folder, core_name + '.h') # _.h - # all structs: group(0) full struct, group(1) beginning, group(2) content - struct_groups = cor.p_struct.finditer(text) - lang_up = folder.upper() - lang_low = folder.lower() - out_txt = out_txt + f'/* {LANG_CODE_TO_R_LANG[lang_low]} */\n\n' # /* RETRO_LANGUAGE_NAME */ - with open(translation_path, 'r+', encoding='utf-8') as f_in: # .h - out_txt = out_txt + f_in.read() + '\n' - for construct in struct_groups: - declaration = construct.group(1) - struct_type_name = get_struct_type_name(declaration) - 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]: - continue - - p = cor.p_info - if 'retro_core_option_v2_category' == struct_type_name[0]: - p = cor.p_info_cat - offset_construct = construct.start(0) - start = construct.end(1) - offset_construct - end = construct.start(2) - offset_construct - out_txt = out_txt + new_decl + construct.group(0)[start:end] - - content = construct.group(2) - new_content = cor.p_option.sub(replace_option, content) - - start = construct.end(2) - offset_construct - out_txt = out_txt + new_content + construct.group(0)[start:] + '\n' - - if 'retro_core_option_v2_definition' == struct_type_name[0]: - out_txt = out_txt + f'struct retro_core_options_v2 options{lang_low}' \ - ' = {\n' \ - f' option_cats{lang_low},\n' \ - f' option_defs{lang_low}\n' \ - '};\n\n' - # shutil.rmtree(JOINER.join((intl_dir_path, folder))) - - with open(intl_file_path, 'w', encoding='utf-8') as intl: - intl.write(out_txt + '\n#ifdef __cplusplus\n' - '}\n#endif\n' - '\n#endif') - return - - -# -------------------- 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] - TARGET_DIR_PATH = _temp - except IndexError: - TARGET_DIR_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) - print("No path provided, assuming parent directory:\n" + TARGET_DIR_PATH) - - DIR_PATH = os.path.dirname(os.path.realpath(__file__)) - H_FILE_PATH = os.path.join(TARGET_DIR_PATH, 'libretro_core_options.h') - INTL_FILE_PATH = os.path.join(TARGET_DIR_PATH, 'libretro_core_options_intl.h') - - _core_name = 'core_options' - try: - print('Getting texts from libretro_core_options.h') - with open(H_FILE_PATH, 'r+', encoding='utf-8') as _h_file: - _main_text = _h_file.read() - _hash_n_str = get_texts(_main_text) - _files = create_msg_hash(DIR_PATH, _core_name, _hash_n_str) - _source_jsons = h2json(_files) - except Exception as e: - print(e) - - print('Getting texts from libretro_core_options_intl.h') - with open(INTL_FILE_PATH, 'r+', encoding='utf-8') as _intl_file: - _intl_text = _intl_file.read() - _hash_n_str_intl = get_texts(_intl_text) - _intl_files = create_msg_hash(DIR_PATH, _core_name, _hash_n_str_intl) - _intl_jsons = h2json(_intl_files) - - print('\nAll done!') diff --git a/libretro-common/samples/core_options/example_translation/translation scripts/intl/crowdin_intl.py b/libretro-common/samples/core_options/example_translation/translation scripts/intl/crowdin_intl.py deleted file mode 100644 index f4605f73d6..0000000000 --- a/libretro-common/samples/core_options/example_translation/translation scripts/intl/crowdin_intl.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 - -import core_opt_translation as t - - -if __name__ == '__main__': - try: - if t.os.path.isfile(t.sys.argv[1]): - _temp = t.os.path.dirname(t.sys.argv[1]) - else: - _temp = t.sys.argv[1] - while _temp.endswith('/') or _temp.endswith('\\'): - _temp = _temp[:-1] - TARGET_DIR_PATH = _temp - except IndexError: - TARGET_DIR_PATH = t.os.path.dirname(t.os.path.dirname(t.os.path.realpath(__file__))) - print("No path provided, assuming parent directory:\n" + TARGET_DIR_PATH) - - DIR_PATH = t.os.path.dirname(t.os.path.realpath(__file__)) - H_FILE_PATH = t.os.path.join(TARGET_DIR_PATH, 'libretro_core_options.h') - INTL_FILE_PATH = t.os.path.join(TARGET_DIR_PATH, 'libretro_core_options_intl.h') - - _core_name = 'core_options' - _core_name = t.clean_file_name(_core_name) - - print('Getting texts from libretro_core_options.h') - with open(H_FILE_PATH, 'r+', encoding='utf-8') as _h_file: - _main_text = _h_file.read() - _hash_n_str = t.get_texts(_main_text) - _files = t.create_msg_hash(DIR_PATH, _core_name, _hash_n_str) - - print('Converting translations *.json to *.h:') - for _folder in t.os.listdir(DIR_PATH): - if t.os.path.isdir(t.os.path.join(DIR_PATH, _folder))\ - and _folder.startswith('_')\ - and _folder != '__pycache__': - print(_folder) - t.json2h(DIR_PATH, t.os.path.join(DIR_PATH, _folder), _core_name) - - print('Constructing libretro_core_options_intl.h') - t.create_intl_file(INTL_FILE_PATH, DIR_PATH, _main_text, _core_name, _files['_us']) - - print('\nAll done!') diff --git a/libretro-common/samples/core_options/example_translation/translation scripts/intl/crowdin_prep.py b/libretro-common/samples/core_options/example_translation/translation scripts/intl/crowdin_prep.py deleted file mode 100644 index 9c0b41df30..0000000000 --- a/libretro-common/samples/core_options/example_translation/translation scripts/intl/crowdin_prep.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 - -import core_opt_translation as t - - -if __name__ == '__main__': - _core_name = 'core_options' - - try: - if t.os.path.isfile(t.sys.argv[1]): - _temp = t.os.path.dirname(t.sys.argv[1]) - else: - _temp = t.sys.argv[1] - while _temp.endswith('/') or _temp.endswith('\\'): - _temp = _temp[:-1] - TARGET_DIR_PATH = _temp - except IndexError: - TARGET_DIR_PATH = t.os.path.dirname(t.os.path.dirname(t.os.path.realpath(__file__))) - print("No path provided, assuming parent directory:\n" + TARGET_DIR_PATH) - - DIR_PATH = t.os.path.dirname(t.os.path.realpath(__file__)) - H_FILE_PATH = t.os.path.join(TARGET_DIR_PATH, 'libretro_core_options.h') - - _core_name = t.clean_file_name(_core_name) - - print('Getting texts from libretro_core_options.h') - with open(H_FILE_PATH, 'r+', encoding='utf-8') as _h_file: - _main_text = _h_file.read() - _hash_n_str = t.get_texts(_main_text) - _files = t.create_msg_hash(DIR_PATH, _core_name, _hash_n_str) - - _source_jsons = t.h2json(_files) - - print('\nAll done!') diff --git a/libretro-common/samples/core_options/example_translation/translation scripts/intl/v1_to_v2_converter.py b/libretro-common/samples/core_options/example_translation/translation scripts/intl/v1_to_v2_converter.py deleted file mode 100644 index 679e74a981..0000000000 --- a/libretro-common/samples/core_options/example_translation/translation scripts/intl/v1_to_v2_converter.py +++ /dev/null @@ -1,459 +0,0 @@ -#!/usr/bin/env python3 - -"""Core options v1 to v2 converter - -Just run this script as follows, to convert 'libretro_core_options.h' & 'Libretro_coreoptions_intl.h' to v2: -python3 "/path/to/v1_to_v2_converter.py" "/path/to/where/libretro_core_options.h & Libretro_coreoptions_intl.h/are" - -The original files will be preserved as *.v1 -""" -import core_option_regex as cor -import os -import sys - - -def create_v2_code_file(struct_text, file_name): - def replace_option(option_match): - _offset = option_match.start(0) - - if option_match.group(3): - res = option_match.group(0)[:option_match.end(2) - _offset] + ',\n NULL' + \ - option_match.group(0)[option_match.end(2) - _offset:option_match.end(3) - _offset] + \ - 'NULL,\n NULL,\n ' + option_match.group(0)[option_match.end(3) - _offset:] - else: - return option_match.group(0) - - return res - - comment_v1 = '/*\n' \ - ' ********************************\n' \ - ' * VERSION: 1.3\n' \ - ' ********************************\n' \ - ' *\n' \ - ' * - 1.3: Move translations to libretro_core_options_intl.h\n' \ - ' * - libretro_core_options_intl.h includes BOM and utf-8\n' \ - ' * fix for MSVC 2010-2013\n' \ - ' * - Added HAVE_NO_LANGEXTRA flag to disable translations\n' \ - ' * on platforms/compilers without BOM support\n' \ - ' * - 1.2: Use core options v1 interface when\n' \ - ' * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1\n' \ - ' * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1)\n' \ - ' * - 1.1: Support generation of core options v0 retro_core_option_value\n' \ - ' * arrays containing options with a single value\n' \ - ' * - 1.0: First commit\n' \ - '*/\n' - - comment_v2 = '/*\n' \ - ' ********************************\n' \ - ' * VERSION: 2.0\n' \ - ' ********************************\n' \ - ' *\n' \ - ' * - 2.0: Add support for core options v2 interface\n' \ - ' * - 1.3: Move translations to libretro_core_options_intl.h\n' \ - ' * - libretro_core_options_intl.h includes BOM and utf-8\n' \ - ' * fix for MSVC 2010-2013\n' \ - ' * - Added HAVE_NO_LANGEXTRA flag to disable translations\n' \ - ' * on platforms/compilers without BOM support\n' \ - ' * - 1.2: Use core options v1 interface when\n' \ - ' * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1\n' \ - ' * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1)\n' \ - ' * - 1.1: Support generation of core options v0 retro_core_option_value\n' \ - ' * arrays containing options with a single value\n' \ - ' * - 1.0: First commit\n' \ - '*/\n' - - p_intl = cor.p_intl - p_set = cor.p_set - new_set = 'static INLINE void libretro_set_core_options(retro_environment_t environ_cb,\n' \ - ' bool *categories_supported)\n' \ - '{\n' \ - ' unsigned version = 0;\n' \ - '#ifndef HAVE_NO_LANGEXTRA\n' \ - ' unsigned language = 0;\n' \ - '#endif\n' \ - '\n' \ - ' if (!environ_cb || !categories_supported)\n' \ - ' return;\n' \ - '\n' \ - ' *categories_supported = false;\n' \ - '\n' \ - ' if (!environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version))\n' \ - ' version = 0;\n' \ - '\n' \ - ' if (version >= 2)\n' \ - ' {\n' \ - '#ifndef HAVE_NO_LANGEXTRA\n' \ - ' struct retro_core_options_v2_intl core_options_intl;\n' \ - '\n' \ - ' core_options_intl.us = &options_us;\n' \ - ' core_options_intl.local = NULL;\n' \ - '\n' \ - ' if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) &&\n' \ - ' (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH))\n' \ - ' core_options_intl.local = options_intl[language];\n' \ - '\n' \ - ' *categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL,\n' \ - ' &core_options_intl);\n' \ - '#else\n' \ - ' *categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2,\n' \ - ' &options_us);\n' \ - '#endif\n' \ - ' }\n' \ - ' else\n' \ - ' {\n' \ - ' size_t i, j;\n' \ - ' size_t option_index = 0;\n' \ - ' size_t num_options = 0;\n' \ - ' struct retro_core_option_definition\n' \ - ' *option_v1_defs_us = NULL;\n' \ - '#ifndef HAVE_NO_LANGEXTRA\n' \ - ' size_t num_options_intl = 0;\n' \ - ' struct retro_core_option_v2_definition\n' \ - ' *option_defs_intl = NULL;\n' \ - ' struct retro_core_option_definition\n' \ - ' *option_v1_defs_intl = NULL;\n' \ - ' struct retro_core_options_intl\n' \ - ' core_options_v1_intl;\n' \ - '#endif\n' \ - ' struct retro_variable *variables = NULL;\n' \ - ' char **values_buf = NULL;\n' \ - '\n' \ - ' /* Determine total number of options */\n' \ - ' while (true)\n' \ - ' {\n' \ - ' if (option_defs_us[num_options].key)\n' \ - ' num_options++;\n' \ - ' else\n' \ - ' break;\n' \ - ' }\n' \ - '\n' \ - ' if (version >= 1)\n' \ - ' {\n' \ - ' /* Allocate US array */\n' \ - ' option_v1_defs_us = (struct retro_core_option_definition *)\n' \ - ' calloc(num_options + 1, sizeof(struct retro_core_option_definition));\n' \ - '\n' \ - ' /* Copy parameters from option_defs_us array */\n' \ - ' for (i = 0; i < num_options; i++)\n' \ - ' {\n' \ - ' struct retro_core_option_v2_definition *option_def_us = &option_defs_us[i];\n' \ - ' struct retro_core_option_value *option_values = option_def_us->values;\n' \ - ' struct retro_core_option_definition *option_v1_def_us = &option_v1_defs_us[i];\n' \ - ' struct retro_core_option_value *option_v1_values = option_v1_def_us->values;\n' \ - '\n' \ - ' option_v1_def_us->key = option_def_us->key;\n' \ - ' option_v1_def_us->desc = option_def_us->desc;\n' \ - ' option_v1_def_us->info = option_def_us->info;\n' \ - ' option_v1_def_us->default_value = option_def_us->default_value;\n' \ - '\n' \ - ' /* Values must be copied individually... */\n' \ - ' while (option_values->value)\n' \ - ' {\n' \ - ' option_v1_values->value = option_values->value;\n' \ - ' option_v1_values->label = option_values->label;\n' \ - '\n' \ - ' option_values++;\n' \ - ' option_v1_values++;\n' \ - ' }\n' \ - ' }\n' \ - '\n' \ - '#ifndef HAVE_NO_LANGEXTRA\n' \ - ' if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) &&\n' \ - ' (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH) &&\n' \ - ' options_intl[language])\n' \ - ' option_defs_intl = options_intl[language]->definitions;\n' \ - '\n' \ - ' if (option_defs_intl)\n' \ - ' {\n' \ - ' /* Determine number of intl options */\n' \ - ' while (true)\n' \ - ' {\n' \ - ' if (option_defs_intl[num_options_intl].key)\n' \ - ' num_options_intl++;\n' \ - ' else\n' \ - ' break;\n' \ - ' }\n' \ - '\n' \ - ' /* Allocate intl array */\n' \ - ' option_v1_defs_intl = (struct retro_core_option_definition *)\n' \ - ' calloc(num_options_intl + 1, sizeof(struct retro_core_option_definition));\n' \ - '\n' \ - ' /* Copy parameters from option_defs_intl array */\n' \ - ' for (i = 0; i < num_options_intl; i++)\n' \ - ' {\n' \ - ' struct retro_core_option_v2_definition *option_def_intl = &option_defs_intl[i];\n' \ - ' struct retro_core_option_value *option_values = option_def_intl->values;\n' \ - ' struct retro_core_option_definition *option_v1_def_intl = &option_v1_defs_intl[i];\n' \ - ' struct retro_core_option_value *option_v1_values = option_v1_def_intl->values;\n' \ - '\n' \ - ' option_v1_def_intl->key = option_def_intl->key;\n' \ - ' option_v1_def_intl->desc = option_def_intl->desc;\n' \ - ' option_v1_def_intl->info = option_def_intl->info;\n' \ - ' option_v1_def_intl->default_value = option_def_intl->default_value;\n' \ - '\n' \ - ' /* Values must be copied individually... */\n' \ - ' while (option_values->value)\n' \ - ' {\n' \ - ' option_v1_values->value = option_values->value;\n' \ - ' option_v1_values->label = option_values->label;\n' \ - '\n' \ - ' option_values++;\n' \ - ' option_v1_values++;\n' \ - ' }\n' \ - ' }\n' \ - ' }\n' \ - '\n' \ - ' core_options_v1_intl.us = option_v1_defs_us;\n' \ - ' core_options_v1_intl.local = option_v1_defs_intl;\n' \ - '\n' \ - ' environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_v1_intl);\n' \ - '#else\n' \ - ' environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, option_v1_defs_us);\n' \ - '#endif\n' \ - ' }\n' \ - ' else\n' \ - ' {\n' \ - ' /* Allocate arrays */\n' \ - ' variables = (struct retro_variable *)calloc(num_options + 1,\n' \ - ' sizeof(struct retro_variable));\n' \ - ' values_buf = (char **)calloc(num_options, sizeof(char *));\n' \ - '\n' \ - ' if (!variables || !values_buf)\n' \ - ' goto error;\n' \ - '\n' \ - ' /* Copy parameters from option_defs_us array */\n' \ - ' for (i = 0; i < num_options; i++)\n' \ - ' {\n' \ - ' const char *key = option_defs_us[i].key;\n' \ - ' const char *desc = option_defs_us[i].desc;\n' \ - ' const char *default_value = option_defs_us[i].default_value;\n' \ - ' struct retro_core_option_value *values = option_defs_us[i].values;\n' \ - ' size_t buf_len = 3;\n' \ - ' size_t default_index = 0;\n' \ - '\n' \ - ' values_buf[i] = NULL;\n' \ - '\n' \ - ' if (desc)\n' \ - ' {\n' \ - ' size_t num_values = 0;\n' \ - '\n' \ - ' /* Determine number of values */\n' \ - ' while (true)\n' \ - ' {\n' \ - ' if (values[num_values].value)\n' \ - ' {\n' \ - ' /* Check if this is the default value */\n' \ - ' if (default_value)\n' \ - ' if (strcmp(values[num_values].value, default_value) == 0)\n' \ - ' default_index = num_values;\n' \ - '\n' \ - ' buf_len += strlen(values[num_values].value);\n' \ - ' num_values++;\n' \ - ' }\n' \ - ' else\n' \ - ' break;\n' \ - ' }\n' \ - '\n' \ - ' /* Build values string */\n' \ - ' if (num_values > 0)\n' \ - ' {\n' \ - ' buf_len += num_values - 1;\n' \ - ' buf_len += strlen(desc);\n' \ - '\n' \ - ' values_buf[i] = (char *)calloc(buf_len, sizeof(char));\n' \ - ' if (!values_buf[i])\n' \ - ' goto error;\n' \ - '\n' \ - ' strcpy(values_buf[i], desc);\n' \ - ' strcat(values_buf[i], "; ");\n' \ - '\n' \ - ' /* Default value goes first */\n' \ - ' strcat(values_buf[i], values[default_index].value);\n' \ - '\n' \ - ' /* Add remaining values */\n' \ - ' for (j = 0; j < num_values; j++)\n' \ - ' {\n' \ - ' if (j != default_index)\n' \ - ' {\n' \ - ' strcat(values_buf[i], "|");\n' \ - ' strcat(values_buf[i], values[j].value);\n' \ - ' }\n' \ - ' }\n' \ - ' }\n' \ - ' }\n' \ - '\n' \ - ' variables[option_index].key = key;\n' \ - ' variables[option_index].value = values_buf[i];\n' \ - ' option_index++;\n' \ - ' }\n' \ - '\n' \ - ' /* Set variables */\n' \ - ' environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);\n' \ - ' }\n' \ - '\n' \ - 'error:\n' \ - ' /* Clean up */\n' \ - '\n' \ - ' if (option_v1_defs_us)\n' \ - ' {\n' \ - ' free(option_v1_defs_us);\n' \ - ' option_v1_defs_us = NULL;\n' \ - ' }\n' \ - '\n' \ - '#ifndef HAVE_NO_LANGEXTRA\n' \ - ' if (option_v1_defs_intl)\n' \ - ' {\n' \ - ' free(option_v1_defs_intl);\n' \ - ' option_v1_defs_intl = NULL;\n' \ - ' }\n' \ - '#endif\n' \ - '\n' \ - ' if (values_buf)\n' \ - ' {\n' \ - ' for (i = 0; i < num_options; i++)\n' \ - ' {\n' \ - ' if (values_buf[i])\n' \ - ' {\n' \ - ' free(values_buf[i]);\n' \ - ' values_buf[i] = NULL;\n' \ - ' }\n' \ - ' }\n' \ - '\n' \ - ' free(values_buf);\n' \ - ' values_buf = NULL;\n' \ - ' }\n' \ - '\n' \ - ' if (variables)\n' \ - ' {\n' \ - ' free(variables);\n' \ - ' variables = NULL;\n' \ - ' }\n' \ - ' }\n' \ - '}\n' \ - '\n' \ - '#ifdef __cplusplus\n' \ - '}\n' \ - '#endif' - - struct_groups = cor.p_struct.finditer(struct_text) - out_text = struct_text - - for construct in struct_groups: - repl_text = '' - declaration = construct.group(1) - struct_match = cor.p_type_name.search(declaration) - if struct_match: - if struct_match.group(3): - struct_type_name_lang = struct_match.group(1, 2, 3) - declaration_end = declaration[struct_match.end(1):] - elif struct_match.group(4): - struct_type_name_lang = struct_match.group(1, 2, 4) - declaration_end = declaration[struct_match.end(1):] - else: - struct_type_name_lang = sum((struct_match.group(1, 2), ('_us',)), ()) - declaration_end = f'{declaration[struct_match.end(1):struct_match.end(2)]}_us' \ - f'{declaration[struct_match.end(2):]}' - else: - return -1 - - if 'retro_core_option_definition' == struct_type_name_lang[0]: - import shutil - shutil.copy(file_name, file_name + '.v1') - new_declaration = f'\nstruct retro_core_option_v2_category option_cats{struct_type_name_lang[2]}[] = ' \ - '{\n { NULL, NULL, NULL },\n' \ - '};\n\n' \ - + declaration[:struct_match.start(1)] + \ - 'retro_core_option_v2_definition' \ - + declaration_end - offset = construct.start(0) - repl_text = repl_text + cor.re.sub(cor.re.escape(declaration), new_declaration, - construct.group(0)[:construct.start(2) - offset]) - content = construct.group(2) - new_content = cor.p_option.sub(replace_option, content) - - repl_text = repl_text + new_content + cor.re.sub(r'{\s*NULL,\s*NULL,\s*NULL,\s*{\{0}},\s*NULL\s*},\s*};', - '{ NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL },\n};' - '\n\nstruct retro_core_options_v2 options' + - struct_type_name_lang[2] + ' = {\n' - f' option_cats{struct_type_name_lang[2]},\n' - 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) - else: - return -2 - with open(file_name, 'w', encoding='utf-8') as code_file: - out_text = cor.re.sub(cor.re.escape(comment_v1), comment_v2, out_text) - intl = p_intl.search(out_text) - if intl: - new_intl = out_text[:intl.start(1)] \ - + 'struct retro_core_options_v2 *options_intl[RETRO_LANGUAGE_LAST]' \ - + out_text[intl.end(1):intl.start(2)] \ - + '&options_us, /* RETRO_LANGUAGE_ENGLISH */' \ - ' &options_ja, /* RETRO_LANGUAGE_JAPANESE */' \ - ' &options_fr, /* RETRO_LANGUAGE_FRENCH */' \ - ' &options_es, /* RETRO_LANGUAGE_SPANISH */' \ - ' &options_de, /* RETRO_LANGUAGE_GERMAN */' \ - ' &options_it, /* RETRO_LANGUAGE_ITALIAN */' \ - ' &options_nl, /* RETRO_LANGUAGE_DUTCH */' \ - ' &options_pt_br, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */' \ - ' &options_pt_pt, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */' \ - ' &options_ru, /* RETRO_LANGUAGE_RUSSIAN */' \ - ' &options_ko, /* RETRO_LANGUAGE_KOREAN */' \ - ' &options_cht, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */' \ - ' &options_chs, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */' \ - ' &options_eo, /* RETRO_LANGUAGE_ESPERANTO */' \ - ' &options_pl, /* RETRO_LANGUAGE_POLISH */' \ - ' &options_vn, /* RETRO_LANGUAGE_VIETNAMESE */' \ - ' &options_ar, /* RETRO_LANGUAGE_ARABIC */' \ - ' &options_el, /* RETRO_LANGUAGE_GREEK */' \ - ' &options_tr, /* RETRO_LANGUAGE_TURKISH */' \ - ' &options_sv, /* RETRO_LANGUAGE_SLOVAK */' \ - ' &options_fa, /* RETRO_LANGUAGE_PERSIAN */' \ - ' &options_he, /* RETRO_LANGUAGE_HEBREW */' \ - ' &options_ast, /* RETRO_LANGUAGE_ASTURIAN */' \ - ' &options_fi, /* RETRO_LANGUAGE_FINNISH */' \ - + out_text[intl.end(2):] - out_text = p_set.sub(new_set, new_intl) - else: - out_text = p_set.sub(new_set, out_text) - code_file.write(out_text) - - return 1 - - -# -------------------- 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) - - 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') - - for file in (H_FILE_PATH, INTL_FILE_PATH): - if os.path.isfile(file): - with open(file, 'r+', encoding='utf-8') as h_file: - text = h_file.read() - try: - test = create_v2_code_file(text, file) - except Exception as e: - print(e) - test = -1 - if -1 > test: - print('Your file looks like it already is v2? (' + file + ')') - continue - if 0 > test: - print('An error occurred! Please make sure to use the complete v1 struct! (' + file + ')') - continue - else: - print(file + ' not found.') From ce36ea176a1fb405962fe5d8986dae25ac991d61 Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Thu, 17 Apr 2025 06:25:30 +0000 Subject: [PATCH 002/175] Add a few 3DS items --- CHANGES.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 40279c996e..a9ad792ab4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,10 @@ # 1.21.0 - 3DS: Fix unique IDs for newer cores -- 3DS: Fixes +- 3DS: Enable TLS (SSL) +- 3DS: Fix UI freeze when threaded rendering is enabled +- 3DS: Fix crash on load content +- 3DS: Other minor fixes - APPLE: Enable Vulkan emulated mailbox - APPLE: Include b2 core in App Store builds - APPLE: CoreMIDI driver for IOS/MacOS From 597405ba8974b94c9ea0d1f0a354182b0110c0ef Mon Sep 17 00:00:00 2001 From: zoltanvb Date: Thu, 17 Apr 2025 22:27:23 +0200 Subject: [PATCH 003/175] Fix core descriptions not showing In core downloader, description can be brought up by pressing Select. However, for those cores where the description is longer than what would be possible to display, nothing was displayed. Several such cores exist, one example is Dosbox-Core. Since this array is used for the messagebox, it is needless to make it larger than what would be displayed anyway, and it makes other safeguards act reasonably, so now there is info, just truncated. --- menu/menu_driver.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/menu_driver.h b/menu/menu_driver.h index bb0716e3e0..d0de72c588 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -449,7 +449,7 @@ typedef struct char file_name[NAME_MAX_LENGTH]; } last_start_content; - char menu_state_msg[PATH_MAX_LENGTH * 2]; + char menu_state_msg[MENU_LABEL_MAX_LENGTH]; /* Scratchpad variables. These are used for instance * by the filebrowser when having to store intermediary * paths (subdirs/previous dirs/current dir/path, etc). From 0d66d4b1b3cfadc40d1b25c45998601dc02e7425 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 18 Apr 2025 00:15:29 +0000 Subject: [PATCH 004/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 49ebbed08d..da3bc614e9 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2366,6 +2366,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_AUTOSWITCH_REFRESH_RATE_ALL_FULLSCREEN, "Tots els modes de pantalla completa" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_AUTOSWITCH_PAL_THRESHOLD, + "Llindar de freqüència d'actualització PAL" + ) #if defined(DINGUX) && defined(DINGUX_BETA) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE, @@ -3386,6 +3390,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, "Controls del port %u" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_USER_REMAPS, + "Canvia les assignacions d'entrada específiques pel nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ANDROID_INPUT_DISCONNECT_WORKAROUND, "Solució per les desconnexions d’Android" @@ -4245,6 +4253,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, "Carrega automàticament fitxers de remapeig" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTO_REMAPS_ENABLE, + "Carrega els controls personalitzats a l'inici." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, "Carrega els fitxers de shaders automàticament" @@ -4256,6 +4268,10 @@ MSG_HASH( /* Settings > Saving */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, + "Endreça els fitxers desats per carpetes amb el nom del nucli" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, "Interval entre desats automàtics de la SaveRAM" @@ -4264,6 +4280,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REPLAY_CHECKPOINT_INTERVAL, "Interval de punts de control de repetició" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REPLAY_AUTO_INDEX, + "Augmenta automàticament l'índex de repeticions" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_MAX_KEEP, "Màxim de desats ràpids autoincrementats a mantenir" @@ -4759,6 +4779,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_PRESET, "Superposició predefinida" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_PRESET, + "Selecciona una superposició en l'explorador de fitxers." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE_LANDSCAPE, "Escala de superposició (mode horitzontal)" @@ -10680,6 +10704,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_PATH, "Desa la gravació com a..." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, + "Desa les gravacions a la carpeta assignada" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_MATCH_IDX, "Veure coincidència #" @@ -10744,6 +10772,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING, "Solució de problemes d'àudio/vídeo" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD, + "Canvia el controlador virtual superposat" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT, "S’està carregant el contingut" @@ -11938,6 +11970,10 @@ MSG_HASH( MSG_READING_FIRST_DATA_TRACK, "Llegint la primera pista de dades..." ) +MSG_HASH( + MSG_RECORDING_TERMINATED_DUE_TO_RESIZE, + "Gravació acabada pel canvi de mida de la finestra." + ) MSG_HASH( MSG_RECORDING_TO, "Enregistrant a" @@ -12410,6 +12446,10 @@ MSG_HASH( MSG_NETPLAY_BANNED, "No se't permet entrar en aquest servidor." ) +MSG_HASH( + MSG_FAILED_TO_RECEIVE_HEADER_FROM_HOST, + "Error en rebre l'encapçalament del servidor." + ) MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Heu de posar en pausa o desactivar el mode expert d’assoliments per carregar desats ràpids." @@ -12474,6 +12514,10 @@ MSG_HASH( MSG_NO_DISC_INSERTED, "No hi ha un disc dins del lector." ) +MSG_HASH( + MSG_SHADER_PRESET_REMOVED_SUCCESSFULLY, + "S'ha eliminat la configuració de shaders." + ) MSG_HASH( MSG_ERROR_REMOVING_SHADER_PRESET, "Error en eliminar la configuració de shaders." @@ -12896,6 +12940,10 @@ MSG_HASH( MSG_INTERNET_NOT_CONNECTABLE, "Internet (No hi ha connexió)" ) +MSG_HASH( + MSG_READ_WRITE, + "Estat de l'emmagatzematge intern: Lectura/Escriptura" + ) MSG_HASH( MSG_READ_ONLY, "Estat de l'emmagatzematge intern: Només lectura" diff --git a/intl/progress.h b/intl/progress.h index c4f3fac88c..561d6d5640 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 60 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 61 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ From 6160b71ecc50780de523b6b84d2fef8a2beea025 Mon Sep 17 00:00:00 2001 From: zoltanvb Date: Fri, 18 Apr 2025 17:28:22 +0200 Subject: [PATCH 005/175] Avoid format length warning. --- menu/menu_driver.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 8703d052bc..86596d3937 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -3499,25 +3499,25 @@ static int menu_dialog_iterate( s2, sizeof(s2)); snprintf(s, len, - "%s" + "%.250s" "[%s]: " - "%-20s\n" + "%-20.20s\n" "[%s]: " - "%-20s\n" + "%-20.20s\n" "[%s]: " - "%-20s\n" + "%-20.20s\n" "[%s]: " - "%-20s\n" + "%-20.20s\n" "[%s]: " - "%-20s\n" + "%-20.20s\n" "[%s]: " - "%-20s\n" + "%-20.20s\n" "[%s]: " - "%-20s\n" + "%-20.20s\n" "[%s]: " - "%-20s\n" + "%-20.20s\n" "[%s]: " - "%-20s\n", + "%-20.20s\n", s2, From 309c67a205895b5036897e7f0aefc5730750a9a1 Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Fri, 18 Apr 2025 21:12:17 +0000 Subject: [PATCH 006/175] Revert "Define WIN32_LEAN_AND_MEAN to avoid collision with winsock2" The Windows builds have been missing some libraries, notably avdevice-58.dll, avfilter-7.dll, and prostproc-55.dll as reported by a user on Discord. I suspect it's caused by cc842fd, although I don't fully understand why that would happen. --- ui/drivers/ui_qt.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/drivers/ui_qt.cpp b/ui/drivers/ui_qt.cpp index 1fa54da778..5a8cb7170d 100644 --- a/ui/drivers/ui_qt.cpp +++ b/ui/drivers/ui_qt.cpp @@ -14,7 +14,6 @@ * If not, see . */ -#define WIN32_LEAN_AND_MEAN #include #include #include From 76e7c9a3d9838e38ece27bb8e4ff1a887d681d98 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 19 Apr 2025 00:15:24 +0000 Subject: [PATCH 007/175] Fetch translations from Crowdin --- intl/msg_hash_ar.h | 204 +++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 2 files changed, 205 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index de5396deb7..56bfcf7ab7 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -71,6 +71,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LIST, "حدد النواة المستخدمة." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_LIST_UNLOAD, + "إيقاف تشغيل النواة" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_LIST_UNLOAD, + "إلغاء تحميل النواة." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_CORE_LIST, "تصفح لتنفيذ أساسيات ليبرترو. حيث يبدأ المتصفح يعتمد على مسار الدليل الأساسي الخاص بك. إذا كان فارغاً، فسيبدأ في الجذر.\nإذا كان الدليل الأساسي هو الدليل، فستستخدم القائمة ذلك كالمجلد الأعلى. إذا كان الدليل الأساسي هو المسار الكامل، فإنه سيبدأ في المجلد الذي يوجد فيه الملف." @@ -523,6 +531,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_INFO_SAVESTATE_SERIALIZED, "متسلسل (حفظ/تحميل, إعادة)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_SAVESTATE_DETERMINISTIC, + "سلوك الأداء (الحفظ، الرجوع، التشغيل المسبق، اللعب الجماعي)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE, "البرنامج الثابت فيرموير" @@ -531,6 +543,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE_IN_CONTENT_DIRECTORY, "- ملاحظة: تم تمكين 'ملفات النظام في دليل المحتوى' حاليا." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE_PATH, + "البحث في: %s" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MISSING_REQUIRED, "مفقود، مطلوب:" @@ -559,6 +575,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "استبعاد من قائمة 'نوى بلا محتوى'" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SET_STANDALONE_EXEMPT, + "لا تُعرض هذه النواة في تبويب \"النوى غير المرتبطة\"، ويظهر ذلك فقط عند تفعيل وضع العرض المخصص." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_DELETE, "حذف النواة" @@ -634,6 +654,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CPU_CORES, "نَوَيات المُعالِجْ" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_JIT_AVAILABLE, + "يدعم الترجمة الفورية JIT" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_IDENTIFIER, "واجهة Identifier" @@ -714,6 +738,30 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL2_SUPPORT, "SDL 1-2 دعم" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_D3D8_SUPPORT, + "دعم Direct3D 8" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_D3D9_SUPPORT, + "دعم Direct3D 9" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_D3D10_SUPPORT, + "دعم Direct3D 10" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_D3D11_SUPPORT, + "دعم Direct3D 11" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_D3D12_SUPPORT, + "دعم Direct3D 12" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GDI_SUPPORT, + "دعم GDI" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VULKAN_SUPPORT, "دعم vulkan" @@ -794,6 +842,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PULSEAUDIO_SUPPORT, "دعم PulseAudio" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PIPEWIRE_SUPPORT, + "دعم PipeWire" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COREAUDIO_SUPPORT, "دعم CoreAudio" @@ -874,6 +926,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_V4L2_SUPPORT, "دعم Video4Linux2" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SSL_SUPPORT, + "دعم SSL" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "دعم libusb" @@ -916,6 +972,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_REGION, "المنطقة" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CONSOLE_EXCLUSIVE, + "حصري على جهاز الألعاب" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PLATFORM_EXCLUSIVE, + "حصري على المنصة" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SCORE, "النقاط" @@ -928,6 +992,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CONTROLS, "التحكم" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ARTSTYLE, + "النمط الفني" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_GAMEPLAY, "أسلوب اللعب" @@ -936,6 +1004,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_NARRATIVE, "سرد" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PACING, + "نمط الإيقاع" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PERSPECTIVE, "وجهة نظر" @@ -948,6 +1020,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_VISUAL, "بصري" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_VEHICULAR, + "نمط المركبات" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PUBLISHER, "الناشر" @@ -984,6 +1060,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_ISSUE, "مراجعة مجلة edg" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_MONTH, + "شهر الإصدار" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_YEAR, + "سنة الإصدار" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_BBFC_RATING, "تصنيف BBFC" @@ -1039,6 +1123,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RESET_TO_DEFAULT_CONFIG, "إعادة التعيين إلى الافتراضي" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RESET_TO_DEFAULT_CONFIG, + "إعادة الإعدادات للوضع الافتراضي." + ) /* Main Menu > Help */ @@ -1104,6 +1192,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS, "الصوت" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_SETTINGS, + "تعديل إعدادات الصوت والإدخال/الإخراج." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS, "أجهزة الادخال" @@ -1144,14 +1236,94 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVING_SETTINGS, "تغيير اعدادات النواة." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SETTINGS, + "مزامنة سحابية" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SETTINGS, + "تغيير إعدادات المزامنة السحابية." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_ENABLE, + "تفعيل المزامنة السحابية" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_ENABLE, + "محاولة مزامنة الإعدادات، والبيانات المحفوظة، ولقطات الحفظ مع التخزين السحابي." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE, + "مزامنة سحابية تمسح القديم" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_SAVES, + "مزامنة الحفظ والتقدم" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS, + "مزامنة ملفات الإعدادات" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_THUMBS, + "مزامنة الصور المصغّرة للألعاب" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_SYSTEM, + "مزامنة ملفات النظام" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_SAVES, + "عند التفعيل، سيتم مزامنة بيانات الحفظ والحالة مع السحابة." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_CONFIGS, + "عند التفعيل، سيتم مزامنة ملفات الإعدادات مع السحابة." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_THUMBS, + "عند التفعيل، سيتم مزامنة الصور المصغّرة مع السحابة. لا يُنصح بها عادةً إلا عند وجود مجموعة كبيرة من الصور المخصصة. في الحالات الأخرى يُفضّل استخدام أداة تحميل الصور المصغّرة." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_SYSTEM, + "عند التفعيل، تتم مزامنة ملفات النظام للسحابة. قد تؤثر على سرعة المزامنة." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE, + "إذا تم التعطيل، سيتم نقل الملفات إلى مجلد النسخ الاحتياطي قبل الحذف أو الاستبدال." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER, + "خدمة المزامنة السحابية" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_DRIVER, + "اختيار خدمة التخزين السحابي." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_URL, + "عنوان موقع التخزين السحابي" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_URL, + "رابط خدمة التخزين السحابي." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_USERNAME, "اسم المستخدم" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_USERNAME, + "اسم المستخدم في السحابة." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_PASSWORD, "كلمة المرور" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_PASSWORD, + "كلمة المرور لحساب السحابة." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS, "تسجيل الدخول" @@ -1164,6 +1336,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, "مستعرض الملفات" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_CONFIG, + "ملف الإعدادات." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_COMPRESSED_ARCHIVE, + "ملف أرشيف مضغوط." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_RECORD_CONFIG, + "ملف إعدادات التسجيل." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_CURSOR, + "ملف مؤشر قاعدة البيانات." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_FILE_CONFIG, "ملف الإعدادات." @@ -1176,10 +1364,26 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_FILE_BROWSER_SHADER, "مِلف المظلل." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_REMAP, + "ملف تخصيص أزرار التحكم." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_FILE_BROWSER_CHEAT, "ملف الغش." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_OVERLAY, + "ملف التراكب." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_RDB, + "ملف قاعدة البيانات." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_FONT, + "ملف خط TrueType." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_FILE_BROWSER_PLAIN_FILE, "ملف عادي." diff --git a/intl/progress.h b/intl/progress.h index 561d6d5640..36759e4f0a 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -1,5 +1,5 @@ /* Arabic */ -#define LANGUAGE_PROGRESS_ARABIC_TRANSLATED 42 +#define LANGUAGE_PROGRESS_ARABIC_TRANSLATED 43 #define LANGUAGE_PROGRESS_ARABIC_APPROVED 0 /* Asturian */ From a2e512a094a404d45d61812c3a8dc1e2c60709ef Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 20 Apr 2025 00:17:09 +0000 Subject: [PATCH 008/175] Fetch translations from Crowdin --- intl/msg_hash_ar.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++ intl/msg_hash_ca.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 3 files changed, 97 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index 56bfcf7ab7..56b5c1c85d 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -1111,14 +1111,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIGURATIONS, "تحميل ملف التكوين" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONFIGURATIONS, + "تحميل الإعدادات الحالية واستبدال القيم الموجودة" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG, "قراءة إعدادات التكوين الحالية" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG, + "استبدال ملف الإعدادات الحالي" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG, "حفظ الإعدادات" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVE_NEW_CONFIG, + "حفظ الإعدادات الحالية في ملف منفصل" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RESET_TO_DEFAULT_CONFIG, "إعادة التعيين إلى الافتراضي" @@ -1336,6 +1348,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, "مستعرض الملفات" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, + "تعديل إعدادات مستعرض الملفات.مستعرض الملفات" + ) MSG_HASH( MENU_ENUM_LABEL_HELP_FILE_BROWSER_CONFIG, "ملف الإعدادات." @@ -1404,6 +1420,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_FILE_BROWSER_IMAGE_OPEN_WITH_VIEWER, "صورة. حدده لفتح هذا الملف مع عارض الصورة." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION, + "نواة ليبرترو. اختيار هذا سيربط هذا النواة باللعبة." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS, "خنق الإطار" @@ -1671,6 +1691,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_DRIVER, "نظام تشغيل القائمة" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_DRIVER, + "نوع الواجهة الرئيسية. (يتطلب إعادة التشغيل)" + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_MENU_DRIVER_XMB, + "واجهة XMB مستوحاة من قوائم أجهزة الجيل السابع مثل PS3، وتقدم ميزات مشابهة لـ Ozone." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_MENU_DRIVER_OZONE, + "واجهة Ozone هي الواجهة الرئيسية الافتراضية في RetroArch، ومصممة خصيصًا لتسهيل التنقل بيد التحكم." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_MENU_DRIVER_RGUI, + "واجهة RGUI هي واجهة مدمجة وبسيطة في RetroArch. تُعد الأقل من حيث متطلبات الأداء بين جميع مشغّلات القوائم، ويمكن استخدامها على الشاشات منخفضة الدقة." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_MENU_DRIVER_MATERIALUI, + "في الأجهزة المحمولة، يستخدم RetroArch واجهة المستخدم الخاصة بالموبايل بشكل افتراضي، والمعروفة باسم MaterialUI. تم تصميم هذه الواجهة خصيصًا لتناسب أجهزة اللمس والمؤشرات مثل الماوس أو التراكبول." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_DRIVER, "نظام تشغيل التسجيل" @@ -1758,10 +1798,18 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_THREADED, "يحسن الأداء على حساب التأخير والمزيد من مقاطع الفيديو. يستخدم فقط إذا لم يكن من الممكن الحصول على السرعة الكاملة خلاف ذلك." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_THREADED, + "تمكين المعالجة المتعددة للفيديو قد يرفع الأداء، لكن فيه احتمال يصير فيه تأخير أو تقطيع بسيط." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, "إدراج الإطار الأسود" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION, + "تحذير: الوميض السريع قد يسبب أثرًا دائمًا على بعض الشاشات. استخدم هذا الخيار على مسؤوليتك. إدراج إطار أسود بين الفريمات يقلل بشكل كبير من ضبابية الحركة ويحاكي عرض CRT، لكن يقلل من سطوع الشاشة." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "لقطة شاشة GPU" diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index da3bc614e9..0f57e11245 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -4803,6 +4803,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE_PORTRAIT, "Escala de la superposició (mode vertical)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_ASPECT_ADJUST_PORTRAIT, + "Relació d'aspecte de superposició (Mode vertical)" + ) MSG_HASH( MENU_ENUM_SUBLABEL_OVERLAY_ASPECT_ADJUST_PORTRAIT, "Aplica un factor de correcció de la relació d’aspecte a la superposició quan la pantalla està orientada verticalment. Els valors positius augmenten l’alçada efectiva de la superposició mentre que els negatius la redueixen." @@ -4938,6 +4942,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_WIDGETS_ENABLE, "Ginys gràfics" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_WIDGET_SCALE_AUTO, + "Escalar widgets gràfics automàticament" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_WIDGET_SCALE_AUTO, "Canvia automàticament la mida de les notificacions decorades, indicadors i controls segons l’escala actual del menú." @@ -4990,6 +4998,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_REMAP_LOAD, "Notificacions de la càrrega de reassignacions d'entrada" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_CONFIG_OVERRIDE_LOAD, + "Notificacions de càrrega de configuracions personalitzades" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SET_INITIAL_DISK, "Notificacions en restaurar un disc d'inci" @@ -6668,6 +6680,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_PORTABLE_PATHS, "Quan s’activa i també se selecciona el directori del «navegador de fitxers», el valor actual del paràmetre «navegador de fitxers» es desa a la llista de reproducció. Quan es carrega la llista en un altre sistema on s’hagi activat la mateixa opció, el valor del paràmetre «navegador de fitxers» es compara amb el valor de la llista de reproducció; si són diferents els camins de les entrades de la llista s’arreglen automàticament." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_USE_FILENAME, + "Fes servir els noms dels fitxers per cercar miniatures" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGE, "Administrar" @@ -6753,6 +6769,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW, "Permet la localització" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOCATION_ALLOW, + "Permet als nuclis accedir a la teva localització." + ) /* Settings > User > Accounts */ @@ -7133,6 +7153,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST, "Inicia un servidor de joc en xarxa" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_HOST, + "Inicia el joc en xarxa en el mode servirdor." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_DISABLE_HOST, "Atura el servidor de joc en xarxa" @@ -7696,6 +7720,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CORE_OPTIONS, "Canvia les opcions pel contingut." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS, + "Canvia els controls del contingut." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS, "Trucs" @@ -7880,6 +7908,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS, "Anomena i desa el fitxer de trucs" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_FILE_SAVE_AS, + "Desa els trucs actuals en un fitxer de trucs." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_ADD_NEW_TOP, "Afegeix un nou truc a la part superior" @@ -7923,6 +7955,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EXACT, "Cerca valors en la memòria" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_EXACT, + "Clica esquerra o dreta per canviar el valor." + ) MSG_HASH( MENU_ENUM_LABEL_CHEAT_SEARCH_EXACT_VAL, "Igual a %u (%X)" @@ -7979,6 +8015,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EQPLUS, "Cerca valors en la memòria" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_EQPLUS, + "Clica esquerra o dreta per canviar el valor." + ) MSG_HASH( MENU_ENUM_LABEL_CHEAT_SEARCH_EQPLUS_VAL, "Iguals a l'anterior +%u (%X)" @@ -7987,6 +8027,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EQMINUS, "Cerca valors en la memòria" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_EQMINUS, + "Clica esquerra o dreta per canviar el valor." + ) MSG_HASH( MENU_ENUM_LABEL_CHEAT_SEARCH_EQMINUS_VAL, "Iguals a l'anterior -%u (%X)" @@ -9703,6 +9747,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS_OZONE, "Substitueix el plafó de metadades per una altra miniatura." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OZONE_SCROLL_CONTENT_METADATA, + "Mostra metadades de continguts en moviment" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OZONE_THUMBNAIL_SCALE_FACTOR, "Factor d’escala de les miniatures" diff --git a/intl/progress.h b/intl/progress.h index 36759e4f0a..7fabe0e540 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -1,5 +1,5 @@ /* Arabic */ -#define LANGUAGE_PROGRESS_ARABIC_TRANSLATED 43 +#define LANGUAGE_PROGRESS_ARABIC_TRANSLATED 44 #define LANGUAGE_PROGRESS_ARABIC_APPROVED 0 /* Asturian */ From 547d739db43f61e81b500fc5b019c91f0b921f06 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 21 Apr 2025 00:16:40 +0000 Subject: [PATCH 009/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 508 +++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 2 files changed, 509 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 0f57e11245..be55b271c4 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2370,6 +2370,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_AUTOSWITCH_PAL_THRESHOLD, "Llindar de freqüència d'actualització PAL" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_AUTOSWITCH_PAL_THRESHOLD, + "La taxa de refresc màxima considerada com a PAL." + ) #if defined(DINGUX) && defined(DINGUX_BETA) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE, @@ -2711,6 +2715,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_AUTO, "Retard automàtic de fotograma" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY_AUTO, + "Ajusta el retard de fotogrames real de forma dinàmica." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_AUTOMATIC, "Automàtic" @@ -2848,6 +2856,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_REWIND_MUTE, "Silencia l'àudio en rebobinar" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_REWIND_MUTE, + "Silencia automàticament el so quan s’usa el rebobinat ràpid." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME, "Guany de volum (dB)" @@ -2927,6 +2939,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_AUDIO_DEVICE, "Força el dispositiu que fa servir el controlador d’àudio. Això depèn del controlador." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_AUDIO_DEVICE_ALSA, + "Valor personalitzat del dispositiu PCM pel controlador ALSA." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY, "Latència de l'àudio (ms)" @@ -3190,6 +3206,10 @@ MSG_HASH( "Configura automàticament els controladors que tenen un perfil, a l'estil Plug-and-Play." ) #if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_NOWINKEY_ENABLE, + "Deshabilita les combinacions de tecles de Windows (Es requereix reiniciar)" + ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_NOWINKEY_ENABLE, "Manté les combinacions de tecles Windows dins l'aplicació." @@ -3306,6 +3326,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, "Disparador de turbo" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TURBO_ENABLE, + "En desactivar aquesta opció, s'aturaran totes les opcions de turbo/tir automàtic." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, "Període de turbo" @@ -3350,6 +3374,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_BUTTON, "Botó del turbo" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TURBO_BUTTON, + "El botó que es farà servir pel turbo en el mode de botó dedicat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ALLOW_DPAD, "Permet direccions amb la creueta amb turbo" @@ -3583,6 +3611,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, "Avançar fotograma" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_FRAMEADVANCE, + "Avança un fotograma el contingut en pausar." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, @@ -3617,6 +3649,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, "Desa estat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SAVE_STATE_KEY, + "Desa un estat a la posició actualment seleccionada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, "Següent ranura de desat" @@ -3733,6 +3769,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_HALT_REPLAY_KEY, "Atura l'enregistrament/repetició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_HALT_REPLAY_KEY, + "Atura la gravació/reproducció de la repetició actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_REPLAY_SLOT_PLUS, "Següent posició de repetició" @@ -3896,6 +3936,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_TYPE, "Tipus de dispositiu" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DEVICE_TYPE, + "Específica el tipus de controlador a emular." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE, "Tipus d’analògic a digital" @@ -4184,6 +4228,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_INFO_CACHE_ENABLE, "Memòria cau d'arxius d'informació de nuclis" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_SAVESTATE_BYPASS, + "Ometent la informació del nucli sobre desats ràpids" + ) #ifndef HAVE_DYNAMIC MSG_HASH( MENU_ENUM_LABEL_VALUE_ALWAYS_RELOAD_CORE_ON_RUN_CONTENT, @@ -4249,6 +4297,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, "Carrega els fitxers de personalització automàticament" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTO_OVERRIDES_ENABLE, + "Carrega la configuració personalitzada en arrancar." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, "Carrega automàticament fitxers de remapeig" @@ -4257,6 +4309,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUTO_REMAPS_ENABLE, "Carrega els controls personalitzats a l'inici." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INITIAL_DISK_CHANGE_ENABLE, + "Carrega automàticament els fitxers d'índexs de disc inicial" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, "Carrega els fitxers de shaders automàticament" @@ -4272,6 +4328,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, "Endreça els fitxers desats per carpetes amb el nom del nucli" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, + "Ordena els estats desats en carpetes amb el nom del nucli" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_BY_CONTENT_ENABLE, + "Endreça els fitxers desats per carpetes amb el nom del contingut" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, "Interval entre desats automàtics de la SaveRAM" @@ -4280,6 +4344,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REPLAY_CHECKPOINT_INTERVAL, "Interval de punts de control de repetició" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX, + "Augmenta automàticament l'índex de l'estat desat" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REPLAY_AUTO_INDEX, "Augmenta automàticament l'índex de repeticions" @@ -4292,6 +4360,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_MAX_KEEP, "Limita el nombre de desats ràpids que es crearan quan s’habiliti l’opció «Incrementa l’índex de desat ràpid automàticament». Si se sobrepassa el límit quan es crea un nou desat ràpid s’esborrarà el desat ràpid amb l'índex més baix. Un valor de «0» significa que es crearan desats ràpids sense límit." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REPLAY_MAX_KEEP, + "Nombre màxim de repeticions automàtiques a conservar" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE, "Desat ràpid automàtic" @@ -4637,6 +4709,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ONSCREEN_OVERLAY_SETTINGS, "Superposició en Pantalla" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ONSCREEN_OVERLAY_SETTINGS, + "Ajustant els marcs i els controls en pantalla." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ONSCREEN_VIDEO_LAYOUT_SETTINGS, "Disposició del vídeo" @@ -4787,10 +4863,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE_LANDSCAPE, "Escala de superposició (mode horitzontal)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_ASPECT_ADJUST_LANDSCAPE, + "Relació d'aspecte de la superposició (mode horitzontal)" + ) MSG_HASH( MENU_ENUM_SUBLABEL_OVERLAY_ASPECT_ADJUST_LANDSCAPE, "Aplica un factor de correcció de la relació d’aspecte a la superposició quan la pantalla està orientada horitzontalment. Els valors positius augmenten l’amplada efectiva de la superposició mentre que els negatius la redueixen." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_X_SEPARATION_LANDSCAPE, + "Separació horitzontal de superposició (mode horitzontal)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_Y_SEPARATION_LANDSCAPE, + "Separació vertical de superposició (mode horitzontal)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_X_OFFSET_LANDSCAPE, "Desplaçament X de superposició (mode horitzontal)" @@ -4811,6 +4899,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_OVERLAY_ASPECT_ADJUST_PORTRAIT, "Aplica un factor de correcció de la relació d’aspecte a la superposició quan la pantalla està orientada verticalment. Els valors positius augmenten l’alçada efectiva de la superposició mentre que els negatius la redueixen." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_X_SEPARATION_PORTRAIT, + "Separació vertical de superposició (mode vertical)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_Y_SEPARATION_PORTRAIT, + "Separació vertical de superposició (mode vertical)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_X_OFFSET_PORTRAIT, "Desplaçament X de superposició (mode vertical)" @@ -4823,6 +4919,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OSK_OVERLAY_SETTINGS, "Superposició de teclat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OSK_OVERLAY_SETTINGS, + "Selecciona i ajusta una superposició de teclat." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_POINTER_ENABLE, + "Activa la superposició per lightgun, ratolí i punter" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_LIGHTGUN_SETTINGS, "Superposa la pistola de llum" @@ -4838,6 +4942,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OSK_OVERLAY_PRESET, "Ajustament de la superposició del teclat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OSK_OVERLAY_PRESET, + "Selecciona una superposició de teclat en l'explorador de fitxers." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OSK_OVERLAY_AUTO_SCALE, "Escala automàticament la posició del teclat" @@ -4861,6 +4969,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_LIGHTGUN_TRIGGER_ON_TOUCH, "Dispara en tocar" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_LIGHTGUN_TRIGGER_ON_TOUCH, + "Envia un senyal del joystick en conjunt a la del punter." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_LIGHTGUN_TRIGGER_DELAY, "Retard en el tret (fotogrames)" @@ -4923,10 +5035,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_LAYOUT_PATH, "Ruta de les disposicions del vídeo" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_LAYOUT_PATH, + "Selecciona una disposició de vídeo des de l'explorador de fitxers." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_LAYOUT_SELECTED_VIEW, "Seleccionar la vista" ) +MSG_HASH( /* FIXME Unused */ + MENU_ENUM_SUBLABEL_VIDEO_LAYOUT_SELECTED_VIEW, + "Selecciona una vista de la disposició carregada." + ) /* Settings > On-Screen Display > On-Screen Notifications */ @@ -4950,10 +5070,18 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_WIDGET_SCALE_AUTO, "Canvia automàticament la mida de les notificacions decorades, indicadors i controls segons l’escala actual del menú." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_WIDGET_SCALE_FACTOR_FULLSCREEN, + "Personalitza l'escala dels widgets gràfics (pantalla completa)" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_WIDGET_SCALE_FACTOR_FULLSCREEN, "Força un factor d’escalat manual quan es dibuixen ginys de visualització en mode de pantalla completa. Només s’aplica quan l’opció «Escala automàticament els ginys gràfics» està desactivada. Es pot fer servir per augmentar o disminuir la mida de les notificacions decorades, indicadors i controls independentment del menú." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_WIDGET_SCALE_FACTOR_WINDOWED, + "Personalitza l'escala dels widgets gràfics (finestra)" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_WIDGET_SCALE_FACTOR_WINDOWED, "Força un factor d’escalat manual quan es dibuixen ginys de visualització en mode de finestra. Només s’aplica quan l’opció «Escala automàticament els ginys gràfics» està desactivada. Es pot fer servir per augmentar o disminuir la mida de les notificacions decorades, indicadors i controls independentment del menú." @@ -4962,18 +5090,38 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_FPS_SHOW, "Mostra la velocitat de fotogrames" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FPS_SHOW, + "Mostra el nombre actual de fotogrames per segon." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FPS_UPDATE_INTERVAL, + "Interval d'actualització de fotogrames (en fps)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, "Mostra el comptador de fotogrames" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FRAMECOUNT_SHOW, + "Mostra en pantalla el comptador de fotogrames." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_STATISTICS_SHOW, "Mostra les estadístiques" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STATISTICS_SHOW, + "Mostrar les estadístiques tècniques en pantalla." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MEMORY_SHOW, "Mostrar l'ús de la memòria " ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MEMORY_UPDATE_INTERVAL, + "Interval d'actualització de l'ús de memòria (en fotogrames)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_PING_SHOW, "Mostra el ping del joc en línia" @@ -4986,6 +5134,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT_ANIMATION, "Notificació d'inici en carregar contingut" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_AUTOCONFIG, + "Notificacions de connexions d'entrada (configuració automàtica)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_AUTOCONFIG_FAILS, + "Notificacions dels errors d'entrada (autoconfiguració)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_CHEATS_APPLIED, "Notificacions dels trucs" @@ -5130,6 +5286,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE, "Fons de les notificacions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_BGCOLOR_ENABLE, + "Activa un color de fons pels missatges en pantalla." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_RED, "Color de fons de les notificacions (vermell)" @@ -5178,6 +5338,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_BOTTOM_SETTINGS, "Aparença de la pantalla inferior de 3DS" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_BOTTOM_SETTINGS, + "Canvia l'ajustament de l'aparença de la pantalla inferior." + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, @@ -5191,6 +5355,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE, "Mode Quiosc" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, + "Estableix una contrasenya per desactivar el mode quiosc" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NAVIGATION_WRAPAROUND, "Navegació en bucle" @@ -5199,6 +5367,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO, "Posa en pausa el contingut quan el menú estigui actiu" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PAUSE_LIBRETRO, + "Pausa el contingut si el menú està actiu." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SAVESTATE_RESUME, "Reprendre contingut després d'utilitzar un desat ràpid" @@ -5719,6 +5891,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, "Mostra «Desa els nuclis forçats»" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CONTENT_DIR_OVERRIDES, + "Mostra l'opció 'Desar la personalització de carpetes de continguts'" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, "Mostra desar les personalitzacions del joc" @@ -5990,6 +6166,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER_OPACITY, "Opacitat del fons" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY, + "Modifica l'opacitat de la imatge de fons." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_FRAMEBUFFER_OPACITY, "Opacitat" @@ -6358,6 +6538,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS, "Direcció del servidor" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_IP_ADDRESS, + "Indica l'adreça IP del servidor al qual cal connectar." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT, "Port TCP per al joc en línia" @@ -6462,6 +6646,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_REQUEST_DEVICE_I, "Sol·licita el dispositiu %u" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_REQUEST_DEVICE_I, + "Sol·licitud per jugar amb el dispositiu d'entrada indicat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETWORK_CMD_ENABLE, "Ordres de xarxa" @@ -6513,6 +6701,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_BUILDBOT_ASSETS_URL, "Adreça web de recursos de buildbot" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, + "Extreu automàticament els fitxers descarregats" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SHOW_EXPERIMENTAL_CORES, "Mostra els nuclis experimentals" @@ -6544,10 +6736,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Permet reanomenar els elements" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, + "Permet canviar el nom dels elements de les llistes de reproducció." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE, "Permet eliminar els elements" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, + "Permet eliminar els elements de les llistes de reproducció." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SORT_ALPHABETICAL, "Ordena les llistes de reproducció alfabèticament" @@ -6664,6 +6864,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SCAN_WITHOUT_CORE_MATCH, "Permet cercar contingut i afegir-lo a una llista de reproducció encara que no hi hagi un nucli instal·lat que l’admeti." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_SERIAL_AND_CRC, + "Comprova els duplicats mitjançant les sumes de verificació CRC" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_LIST, "Gestiona les llistes de reproducció" @@ -6738,6 +6942,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST, "Compte" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ACCOUNTS_LIST, + "Administra els comptes d'usuari configurats." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_NICKNAME, "Nom d’usuari" @@ -6867,6 +7075,10 @@ MSG_HASH( /* FIXME Not RGUI specific */ MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY, "Directori d'inici" ) +MSG_HASH( /* FIXME Not RGUI specific */ + MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, + "Selecciona la carpeta inicial de l'explorador de fitxers." + ) MSG_HASH( /* FIXME Not RGUI specific */ MENU_ENUM_LABEL_VALUE_RGUI_CONFIG_DIRECTORY, "Fitxers de configuració" @@ -6899,6 +7111,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH, "Arxius de trucs" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_DATABASE_PATH, + "En aquesta carpeta es desaran els fitxers de trucs." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR, "Filtres de vídeo" @@ -6919,6 +7135,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, "Enregistraments" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RECORDING_OUTPUT_DIRECTORY, + "Les gravacions es desaran en aquesta carpeta." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, "Configuracions dels enregistraments" @@ -7114,6 +7334,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT, "Desconnecta de l'amfitrió del joc en línia" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, + "Desconecta una sessió activa del joc en xarxa." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_LOBBY_FILTERS, "Filtres de vestíbul" @@ -7616,10 +7840,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RESUME_CONTENT, "Continua" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RESUME_CONTENT, + "Reprèn el contingut i abandona el Menú Ràpid." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RESTART_CONTENT, "Reinicia" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RESTART_CONTENT, + "Reinicia el contingut des del principi." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT, "Tanca contingut" @@ -7636,10 +7868,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_STATE_SLOT, "Posició de desat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STATE_SLOT, + "Canvia la posició actual de desat ràpid." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_STATE, "Desa estat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVE_STATE, + "Desa un estat a la posició actualment seleccionada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Carrega estat" @@ -7656,6 +7896,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REPLAY_SLOT, "Posició de repitició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REPLAY_SLOT, + "Canvia la posició actual de desat ràpid." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAY_REPLAY, "Reproduir repetició" @@ -7668,6 +7912,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HALT_REPLAY, "Atura l'enregistrament/repetició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_HALT_REPLAY, + "Atura la gravació/reproducció de la repetició actual" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Afegeix als favorits" @@ -7696,6 +7944,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_START_STREAMING, "Inicia la transmissió" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_START_STREAMING, + "Inicia una retransmissió en el destí seleccionat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_STOP_STREAMING, "Atura la retransmissió" @@ -7842,6 +8094,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD, "Carrega el fitxer de reassignació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_LOAD, + "Carrega i substitueix les assignacions actuals d'entrada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_AS, "Anomena i desa el fitxer de reassignació" @@ -7858,6 +8114,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CONTENT_DIR, "Desa la personalització a la carpeta de fitxers" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CONTENT_DIR, + "Elimina el fitxer d'assignació de les carpetes de contingut" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, "Desa el fitxer de mapeig del nucli" @@ -7936,10 +8196,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_AFTER_TOGGLE, "Aplica en activar" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_APPLY_AFTER_TOGGLE, + "Aplica els trucs immediatament després d'activar-los." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_CHANGES, "Aplica els canvis" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_APPLY_CHANGES, + "Els canvis en els trucs tindran efecte immediat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT, "Trucs" @@ -7951,6 +8219,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_START_OR_RESTART, "Inicia o reinicia una cerca de trucs" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_START_OR_RESTART, + "Clica esquerra o dreta per canviar la mida en bits." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EXACT, "Cerca valors en la memòria" @@ -8368,6 +8640,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERRIDE_FILE_LOAD, "Carrega un fitxer personalitzat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERRIDE_FILE_LOAD, + "Carrega i substitueix la configuració actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERRIDE_FILE_SAVE_AS, "Anomena i desa les personalitzacions" @@ -8404,6 +8680,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERRIDE_UNLOAD, "Descarrega la personalització" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERRIDE_UNLOAD, + "Reinicia totes les opcions als valors de la configuració global." + ) /* Quick Menu > Achievements */ @@ -8435,6 +8715,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_RESUME, "Reprèn el mode expert d’assoliments" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_SERVER_UNREACHABLE, + "El servidor de RetroAchievements no està disponible" +) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_IDENTIFYING_GAME, "S'està identificant el joc" @@ -8712,6 +8996,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY, "" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_USE_THIS_DIRECTORY, + "Selecciona aquesta opció per establir aquesta carpeta." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT, "" @@ -9481,6 +9769,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ICON_THUMBNAILS, "Miniatura de icona" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ICON_THUMBNAILS, + "El tipus de miniatura que es mostrarà com a icona en les llistes de reproducció." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, "Fons dinàmic" @@ -9541,6 +9833,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_THEME, "Tema d'icones" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_THEME, + "Selecciona un tema d'icones per RetroArch." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_SWITCH_ICONS, "Icones d'interruptors" @@ -9557,6 +9853,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, "Color del tema" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_MENU_COLOR_THEME, + "Selecciona un tema de colors de fons diferent." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_VERTICAL_THUMBNAILS, "Disposició vertical de miniatures" @@ -9589,6 +9889,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_XMB_TITLE_MARGIN_HORIZONTAL_OFFSET, "Desplaçament horitzontal del marge del títol" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MAIN_MENU_ENABLE_SETTINGS, + "Mostra la selecció d'ajustaments (Es requereix reiniciar)" + ) MSG_HASH( MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, "Mostra la pestanya de configuració que conté els paràmetres del programa." @@ -9739,6 +10043,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_OZONE_COLLAPSE_SIDEBAR, "Manté la barra lateral sempre replegada." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OZONE_TRUNCATE_PLAYLIST_NAME, + "Parteix els noms de la llista de reproducció (Es requereix reiniciar)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_OZONE, "Segona miniatura" @@ -9832,6 +10140,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_PLAYLIST_ICONS_ENABLE, "Icones de les llistes de reproducció (Es requereix reinici)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_PLAYLIST_ICONS_ENABLE, + "Mostra icones del sistema a les llistes de reproducció." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION, "Optimitza la disposició en mode horitzontal" @@ -9848,6 +10160,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME, "Color del tema" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_MENU_COLOR_THEME, + "Selecciona un tema de colors de fons diferent." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_TRANSITION_ANIMATION, "Animació de transició" @@ -9860,6 +10176,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_THUMBNAIL_VIEW_LANDSCAPE, "Miniatures en mode horitzontal" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, + "Mostra les miniatures secundàries en les llistes" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Genera fons de les miniatures" @@ -10577,6 +10897,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY, "Historial" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOAD_CONTENT_HISTORY, + "Selecciona el contingut des d'una llista de reproducció recent." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MULTIMEDIA_SETTINGS, "Multimèdia" @@ -10788,10 +11112,18 @@ MSG_HASH( /* FIXME Still exists in a comment about being removed */ MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY, "Opacitat del peu de pàgina" ) +MSG_HASH( /* FIXME Still exists in a comment about being removed */ + MENU_ENUM_SUBLABEL_MATERIALUI_MENU_FOOTER_OPACITY, + "Modifica l'opacitat del peu de pàgina." + ) MSG_HASH( /* FIXME Still exists in a comment about being removed */ MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_HEADER_OPACITY, "Opacitat de l'encapçalament" ) +MSG_HASH( /* FIXME Still exists in a comment about being removed */ + MENU_ENUM_SUBLABEL_MATERIALUI_MENU_HEADER_OPACITY, + "Modifica l'opacitat de la capçalera de la pàgina." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE, "Joc en línia" @@ -11161,6 +11493,10 @@ MSG_HASH( MSG_UNKNOWN_NETPLAY_COMMAND_RECEIVED, "S’ha rebut una ordre de joc en línia desconeguda" ) +MSG_HASH( + MSG_FILE_ALREADY_EXISTS_SAVING_TO_BACKUP_BUFFER, + "Aquest fitxer ja existeix. Desant-lo a la memòria cau de còpia de seguretat" + ) MSG_HASH( MSG_GOT_CONNECTION_FROM, "S’ha rebut una connexió de: «%s»" @@ -11193,6 +11529,10 @@ MSG_HASH( MSG_NETPLAY_YOU_HAVE_JOINED_AS_PLAYER_N, "T'has unit com a jugador %u" ) +MSG_HASH( + MSG_NETPLAY_YOU_HAVE_JOINED_WITH_INPUT_DEVICES_S, + "Has accedit amb el dispositiu d'entrada %.*s" + ) MSG_HASH( MSG_NETPLAY_PLAYER_S_LEFT, "El jugador %.*s ha deixat el joc" @@ -11201,6 +11541,10 @@ MSG_HASH( MSG_NETPLAY_S_HAS_JOINED_AS_PLAYER_N, "%.*s s'ha unit com el jugador %u" ) +MSG_HASH( + MSG_NETPLAY_S_HAS_JOINED_WITH_INPUT_DEVICES_S, + "%.*s ha accedit amb el dispositiu %.*s" + ) MSG_HASH( MSG_NETPLAY_ENTER_PASSWORD, "Introdueix la contrasenya del servidor de joc:" @@ -11209,6 +11553,10 @@ MSG_HASH( MSG_NETPLAY_ENTER_CHAT, "Escriu el missatge per iniciar la sessió:" ) +MSG_HASH( + MSG_DISCORD_CONNECTION_REQUEST, + "Vols permetre la connexió de l'usuari:" + ) MSG_HASH( MSG_NETPLAY_INCORRECT_PASSWORD, "Contrasenya incorrecta" @@ -11410,10 +11758,18 @@ MSG_HASH( MSG_ADDED_TO_FAVORITES, "S'ha afegit als favorits" ) +MSG_HASH( + MSG_ADD_TO_FAVORITES_FAILED, + "Error en afegir preferits: la llista de reproducció està plena" + ) MSG_HASH( MSG_ADDED_TO_PLAYLIST, "S'ha afegit a la llista de reproducció" ) +MSG_HASH( + MSG_ADD_TO_PLAYLIST_FAILED, + "Error en afegir a la llista de reproducció: la llista de reproducció està plena" + ) MSG_HASH( MSG_SET_CORE_ASSOCIATION, "Nucli definit: " @@ -11654,6 +12010,10 @@ MSG_HASH( MSG_FAILED_SAVING_CONFIG_TO, "Error desant la configuració a" ) +MSG_HASH( + MSG_FAILED_TO_ACCEPT_INCOMING_SPECTATOR, + "Error en acceptar a l'espectador." + ) MSG_HASH( MSG_FAILED_TO_ALLOCATE_MEMORY_FOR_PATCHED_CONTENT, "No s’ha pogut assignar memòria pel contingut apedaçat..." @@ -11942,6 +12302,10 @@ MSG_HASH( MSG_LOADING, "Carregant" ) +MSG_HASH( + MSG_FIRMWARE, + "Falten diversos fitxers de firmware" + ) MSG_HASH( MSG_LOADING_CONTENT_FILE, "Carregant el contingut del fitxer" @@ -11982,6 +12346,10 @@ MSG_HASH( MSG_NO_CONTENT_STARTING_DUMMY_CORE, "No hi ha contingut, iniciant un nucli buit." ) +MSG_HASH( + MSG_NO_SAVE_STATE_HAS_BEEN_OVERWRITTEN_YET, + "No s'ha sobreescrit cap desat ràpid." + ) MSG_HASH( MSG_NO_STATE_HAS_BEEN_LOADED_YET, "No s'ha carregat encara el desat ràpid." @@ -12006,6 +12374,10 @@ MSG_HASH( MSG_OVERRIDES_UNLOADED_SUCCESSFULLY, "S'han descarregat les personalitzacions correctament." ) +MSG_HASH( + MSG_OVERRIDES_NOT_SAVED, + "No hi ha res a desar. No s'han desat les personalitzacions." + ) MSG_HASH( MSG_OVERRIDES_ACTIVE_NOT_SAVING, "La funció desat està bloquejada. Les personalitzacions estan actives." @@ -12058,10 +12430,18 @@ MSG_HASH( MSG_RESET, "Reiniciar" ) +MSG_HASH( + MSG_RESTARTING_RECORDING_DUE_TO_DRIVER_REINIT, + "Reiniciant la gravació a causa del reinici del controlador." + ) MSG_HASH( MSG_RESTORED_OLD_SAVE_STATE, "Restaurant un estat desat anterior." ) +MSG_HASH( + MSG_RESTORING_DEFAULT_SHADER_PRESET_TO, + "Shaders: Restaurant l'ajust predeterminat a" + ) MSG_HASH( MSG_REVERTING_SAVEFILE_DIRECTORY_TO, "Revertint la carpeta de fitxers de desat a" @@ -12078,6 +12458,10 @@ MSG_HASH( MSG_REWIND_UNSUPPORTED, "No està disponible el rebobinat perquè aquest nucli no té suport d'estat desats serialitzats." ) +MSG_HASH( + MSG_REWIND_INIT, + "Inicialitzant la memòria cau de rebobinat amb la mida" + ) MSG_HASH( MSG_REWIND_REACHED_END, "S'ha arribat al final de la memòria intermèdia de rebobinat." @@ -12242,6 +12626,10 @@ MSG_HASH( MSG_UNPAUSED, "Fi de la pausa." ) +MSG_HASH( + MSG_UNRECOGNIZED_COMMAND, + "S'ha rebut una comanda no reconeguda: \"%s\". \n" + ) MSG_HASH( MSG_USING_CORE_NAME_FOR_NEW_CONFIG, "Fes servir el nom del nucli per la nova configuració." @@ -12278,6 +12666,14 @@ MSG_HASH( MSG_AUTOLOADING_SAVESTATE_FROM, "Carrega automàticament el desat ràpid des de" ) +MSG_HASH( + MSG_AUTOLOADING_SAVESTATE_FAILED, + "Error en carregar automàticament l'estat desat des de \"%s\"." + ) +MSG_HASH( + MSG_AUTOLOADING_SAVESTATE_SUCCEEDED, + "S'ha carregat correctament l'estat desat des de \"%s\"." + ) MSG_HASH( MSG_DEVICE_CONFIGURED_IN_PORT, "configurat al port" @@ -12382,6 +12778,10 @@ MSG_HASH( MSG_GAME_REMAP_FILE_LOADED, "S'ha carregat el fitxer d'assignacions del joc." ) +MSG_HASH( + MSG_DIRECTORY_REMAP_FILE_LOADED, + "Carregat el fitxer d'assignació de la carpeta de continguts." + ) MSG_HASH( MSG_CORE_REMAP_FILE_LOADED, "S'ha carregat el fitxer d'assignacions del nucli." @@ -12390,6 +12790,10 @@ MSG_HASH( MSG_REMAP_FILE_FLUSHED, "Les opcions d'assignació d'entrada s'han desat a:" ) +MSG_HASH( + MSG_REMAP_FILE_FLUSH_FAILED, + "Error en desar les opcions d'assignació d'entrada a:" + ) MSG_HASH( MSG_RUNAHEAD_DISABLED, "Desactiva l'execució anticipada." @@ -12410,6 +12814,10 @@ MSG_HASH( MSG_CHEAT_INIT_FAIL, "No és possible iniciar la cerca de trucs." ) +MSG_HASH( + MSG_CHEAT_SEARCH_NOT_INITIALIZED, + "No s'ha iniciat la cerca." + ) MSG_HASH( MSG_CHEAT_SEARCH_FOUND_MATCHES, "Nou nombre de coincidències = %u" @@ -12498,6 +12906,10 @@ MSG_HASH( MSG_FAILED_TO_RECEIVE_HEADER_FROM_HOST, "Error en rebre l'encapçalament del servidor." ) +MSG_HASH( + MSG_CHEEVOS_LOGGED_IN_AS_USER, + "Assoliments: Has iniciat sessió com a \"%s\"." + ) MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Heu de posar en pausa o desactivar el mode expert d’assoliments per carregar desats ràpids." @@ -12510,6 +12922,10 @@ MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED_CHEAT, "S’ha activat un truc. S’ha desactivat el mode expert d’assoliments per la sessió actual." ) +MSG_HASH( + MSG_CHEEVOS_HARDCORE_MODE_CHANGED_BY_HOST, + "Assoliments Hardcore canviats pel servidor." + ) MSG_HASH( MSG_CHEEVOS_COMPLETED_GAME, "Completat %s" @@ -12522,6 +12938,14 @@ MSG_HASH( MSG_CHEEVOS_GAME_HAS_NO_ACHIEVEMENTS, "Aquest joc no té assoliments." ) +MSG_HASH( + MSG_CHEEVOS_UNOFFICIAL_ACHIEVEMENTS_ACTIVATED, + "S'han activat els %d assoliments no oficials" +) +MSG_HASH( + MSG_CHEEVOS_NUMBER_ACHIEVEMENTS_UNLOCKED, + "Has desbloquejat %d de %d assoliments" +) MSG_HASH( MSG_CHEEVOS_UNSUPPORTED_COUNT, "%d no compatible" @@ -12530,6 +12954,18 @@ MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Expectant %s" ) +MSG_HASH( + MSG_CHEEVOS_HARDCORE_PAUSED_SETTING_NOT_ALLOWED, + "Mode Hardcore pausat. No es pot canviar: %s=%s" + ) +MSG_HASH( + MSG_CHEEVOS_GAME_LOAD_FAILED, + "Error en carregar el joc a Assoliments: %s" + ) +MSG_HASH( + MSG_CHEEVOS_CHANGE_MEDIA_FAILED, + "Error en canviar els medis a RetroAchievements: %s" + ) MSG_HASH( MSG_RESAMPLER_QUALITY_LOWEST, "Més baix" @@ -12558,6 +12994,14 @@ MSG_HASH( MSG_LOAD_CORE_FIRST, "Carrega un nucli en primer lloc, si us plau." ) +MSG_HASH( + MSG_DISC_DUMP_FAILED_TO_READ_FROM_DRIVE, + "Error en llegir des de la unitat. S'ha avortat el procés." + ) +MSG_HASH( + MSG_DISC_DUMP_FAILED_TO_WRITE_TO_DISK, + "Error en escriure al disc. S'ha avortat el procés." + ) MSG_HASH( MSG_NO_DISC_INSERTED, "No hi ha un disc dins del lector." @@ -12606,6 +13050,10 @@ MSG_HASH( MSG_CORE_BACKUP_SCANNING_CORE, "Cercant al nucli: " ) +MSG_HASH( + MSG_CORE_BACKUP_ALREADY_EXISTS, + "Ja existeix una còpia de seguretat del nucli instal·lat: " + ) MSG_HASH( MSG_BACKING_UP_CORE, "Còpia de seguretat del nucli: " @@ -12618,6 +13066,10 @@ MSG_HASH( MSG_CORE_BACKUP_COMPLETE, "Còpia de seguretat del nucli completada: " ) +MSG_HASH( + MSG_CORE_RESTORATION_ALREADY_INSTALLED, + "La còpia de seguretat del nucli seleccionat ja està instal·lada: " + ) MSG_HASH( MSG_RESTORING_CORE, "Restaurant els nuclis: " @@ -12626,6 +13078,10 @@ MSG_HASH( MSG_CORE_RESTORATION_COMPLETE, "S'ha restaurat el nucli: " ) +MSG_HASH( + MSG_CORE_INSTALLATION_ALREADY_INSTALLED, + "El nucli seleccionat ja està instal·lat: " + ) MSG_HASH( MSG_INSTALLING_CORE, "Instal·lant el nucli: " @@ -12650,6 +13106,10 @@ MSG_HASH( MSG_CORE_INSTALLATION_FAILED, "Ha fallat la instal·lació del nucli: " ) +MSG_HASH( + MSG_CORE_RESTORATION_DISABLED, + "Restauració de nucli desactivada, el nucli està protegit: " + ) MSG_HASH( MSG_CORE_LOCK_FAILED, "Error en bloquejar el nucli: " @@ -12666,6 +13126,10 @@ MSG_HASH( MSG_CORE_UNSET_STANDALONE_EXEMPT_FAILED, "No s'ha pogut afegir el nucli a la llista «Nuclis sense continguts»: " ) +MSG_HASH( + MSG_CORE_DELETE_DISABLED, + "S’ha inhabilitat l’eliminació del nucli. El nucli està bloquejat: " + ) MSG_HASH( MSG_UNSUPPORTED_VIDEO_MODE, "El mode de vídeo no és compatible" @@ -12724,6 +13188,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_WIDGET_SCALE_FACTOR, "Personalitza l'escala de widgets gràfics" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_WIDGET_SCALE_FACTOR, + "Força un factor d’escalat manual quan es dibuixen ginys de visualització en mode de finestra. Només s’aplica quan l’opció «Escala automàticament els ginys gràfics» està desactivada. Es pot fer servir per augmentar o disminuir la mida de les notificacions decorades, indicadors i controls independentment del menú." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SCREEN_RESOLUTION, "Resolució de pantalla" @@ -12756,6 +13224,10 @@ MSG_HASH( MSG_SCREEN_RESOLUTION_APPLYING_NO_DESC, "Aplicant: %dx%d\nINICI per reiniciar" ) +MSG_HASH( + MSG_SCREEN_RESOLUTION_APPLYING_DESC, + "Aplicant: %dx%d - %s\nSTART per reiniciar" + ) MSG_HASH( MSG_SCREEN_RESOLUTION_RESETTING_DEFAULT, "Reiniciant a: Predeterminat" @@ -12768,6 +13240,10 @@ MSG_HASH( MSG_SCREEN_RESOLUTION_RESETTING_DESC, "Restablint a: %dx%d - %s" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCREEN_RESOLUTION, + "Selecciona el mode de vídeo (Es requereix reiniciar)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHUTDOWN, "Apagar" @@ -12792,6 +13268,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SOFT_FILTER, "Filtre suau" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BLUETOOTH_SETTINGS, + "Escaneja dispositius bluetooth i connecta-hi." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_WIFI_ENABLED, "Activant la WIFI" @@ -13056,6 +13536,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LAKKA_SWITCH_OPTIONS, "Opcions per a Nintendo Switch" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LAKKA_SWITCH_OPTIONS, + "Administra les opcions específiques per la Nintendo Switch." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SWITCH_OC_ENABLE, "Força la CPU" @@ -13068,6 +13552,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SWITCH_CEC_ENABLE, "Suport CEC" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_CEC_ENABLE, + "Habilita el protocol de senyals CEC amb el televisor en el mode televisor" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BLUETOOTH_ERTM_DISABLE, "Deshabilitar bluetooth ERTM" @@ -13162,6 +13650,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_CTX_SCALING, "Escalat segons el context" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_CTX_SCALING, + "Escalat segons el context de maquinari (si està disponible)." + ) #endif #ifdef _3DS MSG_HASH( @@ -13220,14 +13712,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_BOTTOM_FONT_COLOR_RED, "Color vermell de la font" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BOTTOM_FONT_COLOR_RED, + "Ajustant el color vermell de la font de la pantalla inferior." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BOTTOM_FONT_COLOR_GREEN, "Color de text verd" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BOTTOM_FONT_COLOR_GREEN, + "Ajusta el color verd de la font de la pantalla inferior." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BOTTOM_FONT_COLOR_BLUE, "Color blau de la font" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BOTTOM_FONT_COLOR_BLUE, + "Ajusta el color blau de la font de la pantalla inferior." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BOTTOM_FONT_COLOR_OPACITY, "Opacitat del color de text" @@ -13255,6 +13759,10 @@ MSG_HASH( MSG_IOS_TOUCH_MOUSE_DISABLED, "Ús del ratolí amb la pantalla tàctil desactivat" ) +MSG_HASH( + MSG_SDL2_MIC_NEEDS_SDL2_AUDIO, + "El micròfon sdl2 necessita un controlador d'àudio sdl2" + ) MSG_HASH( MSG_AI_SERVICE_STOPPED, "aturat." diff --git a/intl/progress.h b/intl/progress.h index 7fabe0e540..b26a2a5520 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 61 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 64 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ From 03525ffd5f179b60e996dfc1d91dde82c62b27c2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 22 Apr 2025 00:15:59 +0000 Subject: [PATCH 010/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 424 +++++++++++++++++++++++++++++++++++++++++++++ intl/msg_hash_sv.h | 132 ++++++++++++++ intl/progress.h | 6 +- 3 files changed, 559 insertions(+), 3 deletions(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index be55b271c4..1b130bdd6c 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2612,6 +2612,22 @@ MSG_HASH( "Compensa l'eix Y del punt d'anclatge" ) #if defined(RARCH_MOBILE) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Compensació de l'eix X del punt d'ancoratge de l'àrea de visualització (orientació vertical)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Compensació de l'eix X del punt d'ancoratge de l'àrea de visualització (orientació vertical)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Compensació de l'eix Y del punt d'ancoratge de l'àrea de visualització (orientació vertical)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Compensació de l'eix Y del punt d'ancoratge de l'àrea de visualització (orientació vertical)" + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, @@ -2943,6 +2959,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_AUDIO_DEVICE_ALSA, "Valor personalitzat del dispositiu PCM pel controlador ALSA." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_AUDIO_DEVICE_OSS, + "Valor personalitzat per la ruta del controlador OSS." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY, "Latència de l'àudio (ms)" @@ -3484,10 +3504,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Deshabilita analògic esquerre en el menú" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, + "Impedeix que el joystick esquerra pugui navegar pels menús." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Deshabilita l'analògic dret en els menus" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, + "Impedeix que el joystick dret pugui navegar pels menús." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "El menú inverteix els botons d'OK i Cancel·la" @@ -3519,6 +3547,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BLOCK_DELAY, "Retard de l'activació de les dreceres de teclat (fotogrames)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_HOTKEY_BLOCK_DELAY, + "Afegeix un retard en fotogrames abans que l'entrada normal es bloquegi després de polsar la tecla 'Activa dreceres de teclat' assignada. Permet que es capturi l'entrada normal de la tecla 'Activa dreceres de teclat' quan es mapeja a una altra acció (ex. Selecciona al RetroPad)." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_DEVICE_MERGE, "Fusionar tipus de dispositiu per a tecles ràpides" @@ -3535,6 +3567,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Commuta el menú" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_MENU_TOGGLE, + "Alterna entre mostrar el menú o el contingut." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_QUIT_GAMEPAD_COMBO, "Sortir (combinació de botons)" @@ -3607,6 +3643,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, "Fer pausa" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_PAUSE_TOGGLE, + "Alterna entre pausar o reanudar el contingut." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, "Avançar fotograma" @@ -3645,6 +3685,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Carrega estat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_LOAD_STATE_KEY, + "Carrega un estat desat de la posició actualment seleccionada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, "Desa estat" @@ -3691,6 +3735,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_TOGGLE, "Shaders (Alternar)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, + "Activa o desactiva el shader seleccionat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Següent shader" @@ -3761,10 +3809,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_PLAY_REPLAY_KEY, "Reproduir repetició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_PLAY_REPLAY_KEY, + "Reprodueix el fitxer de repetició des de la posició seleccionada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_RECORD_REPLAY_KEY, "Enregistrar la repetició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_RECORD_REPLAY_KEY, + "Enregistra un fitxer de repetició a la posició seleccionada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_HALT_REPLAY_KEY, "Atura l'enregistrament/repetició" @@ -3777,10 +3833,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_REPLAY_SLOT_PLUS, "Següent posició de repetició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_REPLAY_SLOT_PLUS, + "Augmenta l'índex de la posició de la repetició seleccionada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_REPLAY_SLOT_MINUS, "Ranura prèvia de desat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_REPLAY_SLOT_MINUS, + "Disminueix l'índex de la posició de la repetició seleccionada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_TURBO_FIRE_TOGGLE, "Pulsació de turbo (alternar)" @@ -3948,6 +4012,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX, "Índex del dispositiu" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DEVICE_INDEX, + "El controlador físic tal qual el reconeix RetroArch." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_RESERVED_DEVICE_NAME, "Dispositiu reservat per aquest jugador" @@ -3980,6 +4048,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, "Restableix els controls per defecte" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_BIND_DEFAULTS, + "Restableix la configuració de les assignacions als valors predeterminats." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, "Desa el perfil de controlador" @@ -3988,6 +4060,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX, "Índex del ratolí" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_MOUSE_INDEX, + "El ratolí físic tal qual el reconeix RetroArch." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, "Botó B (avall)" @@ -4252,6 +4328,10 @@ MSG_HASH( "Gestionar nuclis" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_MANAGER_STEAM_LIST, + "Instal·la o desinstal·la nuclis distribuïts a través de Steam." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_STEAM_INSTALL, @@ -4277,6 +4357,10 @@ MSG_HASH( "Instal·lant el nucli: " ) +MSG_HASH( + MSG_CORE_STEAM_UNINSTALLED, + "El nucli serà desinstal·lat quan es tanqui RetroArch." +) MSG_HASH( MSG_CORE_STEAM_CURRENTLY_DOWNLOADING, @@ -4289,10 +4373,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Desa la configuració en sortir" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONFIG_SAVE_ON_EXIT, + "S'han desat els canvis al fitxer de configuració en tancar RetroArch." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_SAVE_ON_EXIT, "Desa els fitxers d'assignació en sortir" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS, + "Carrega automàticament les opcions del nucli pel contingut" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_GAME_SPECIFIC_OPTIONS, + "Carrega les opcions personalitzades del nucli per defecte en iniciar." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, "Carrega els fitxers de personalització automàticament" @@ -4332,10 +4428,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, "Ordena els estats desats en carpetes amb el nom del nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SORT_SAVESTATES_ENABLE, + "Ordena els estats desats en carpetes amb el nom del nucli utilitzat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_BY_CONTENT_ENABLE, "Endreça els fitxers desats per carpetes amb el nom del contingut" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_BY_CONTENT_ENABLE, + "Endreça els estats desats en carpetes amb el nom del contingut" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE, + "No sobreescriguis la SaveRAM en carregar un desat ràpid" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, "Interval entre desats automàtics de la SaveRAM" @@ -4412,18 +4520,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVEFILES_IN_CONTENT_DIR_ENABLE, "Desa les partides al directori del contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVEFILES_IN_CONTENT_DIR_ENABLE, + "Fes servir la carpeta de continguts com a carpeta per desar fitxers." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATES_IN_CONTENT_DIR_ENABLE, "Desa els estats al directori del contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATES_IN_CONTENT_DIR_ENABLE, + "Fes servir la carpeta de contingut com a carpeta d'estats desats." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEMFILES_IN_CONTENT_DIR_ENABLE, "Els fitxers de sistema són al directori del contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SYSTEMFILES_IN_CONTENT_DIR_ENABLE, + "Fes servir la carpeta de contingut com a carpeta pel Sistema/BIOS." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, "Desa les captures al directori del contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, + "Fes servir la carpeta de contingut com a carpeta de captures de pantalla." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_RUNTIME_LOG, "Desa un registre de temps d’execució (per nucli)" @@ -4510,6 +4634,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES, "Mostra fitxers i carpetes ocults" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SHOW_HIDDEN_FILES, + "Mostra fitxers ocults i carpetes ocultes en l'explorador de fitxers." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, "Filtrar extensions desconegudes" @@ -4595,14 +4723,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_FRAME_TIME_COUNTER_RESET_AFTER_FASTFORWARDING, "Reiniciar després d'utilitzar l'avançament ràpid" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FRAME_TIME_COUNTER_RESET_AFTER_FASTFORWARDING, + "Reinicia el comptador de duració de fotogrames després d'un avançament ràpid." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FRAME_TIME_COUNTER_RESET_AFTER_LOAD_STATE, "Reiniciar després de carregar un desat ràpid" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FRAME_TIME_COUNTER_RESET_AFTER_LOAD_STATE, + "Reinicia el comptador de duració de fotogrames després de carregar un estat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FRAME_TIME_COUNTER_RESET_AFTER_SAVE_STATE, "Reiniciar després de generar un desat ràpid" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FRAME_TIME_COUNTER_RESET_AFTER_SAVE_STATE, + "Reinicia el comptador de duració de fotogrames després de desar un estat." + ) /* Settings > Recording */ @@ -4658,6 +4798,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_RECORD, "Fes servir l'enregistrament per GPU" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_GPU_RECORD, + "Enregistra la sortida de la GPU amb shaders, si està disponible." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_STREAMING_MODE, "Mode de retransmissió" @@ -4931,6 +5075,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_LIGHTGUN_SETTINGS, "Superposa la pistola de llum" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_LIGHTGUN_SETTINGS, + "Configura l'entrada de la pistola de llum enviada a través de la superposició." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_MOUSE_SETTINGS, "Superposa el ratolí" @@ -4954,6 +5102,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OSK_OVERLAY_OPACITY, "Opacitat del teclat superposat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OSK_OVERLAY_OPACITY, + "Opacitat dels elements de la interfície de la superposició de teclat." + ) /* Settings > On-Screen Display > On-Screen Overlay > Overlay Lightgun */ @@ -5008,10 +5160,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_MOUSE_HOLD_TO_DRAG, "Mantén polsat per arrossegar" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_MOUSE_HOLD_TO_DRAG, + "Fes un clic llarg a la pantalla per mantenir clicat el botó." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_MOUSE_HOLD_MSEC, "Llindar de la pulsació llarga (ms)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_MOUSE_HOLD_MSEC, + "Ajusta el temps necessari per considerar una pulsació llarga." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_MOUSE_DTAP_TO_DRAG, "Doble toc per arrossegar" @@ -5031,6 +5191,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_LAYOUT_ENABLE, "Activa la disposició de vídeo" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_LAYOUT_ENABLE, + "Les disposicions de vídeo es fan servir per posar marcs i altres imatges." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_LAYOUT_PATH, "Ruta de les disposicions del vídeo" @@ -5150,6 +5314,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_PATCH_APPLIED, "Notificacions de correccions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_PATCH_APPLIED, + "Mostra un missatge en pantalla al corregir ROM al vol." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_REMAP_LOAD, "Notificacions de la càrrega de reassignacions d'entrada" @@ -5632,6 +5800,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Mostrar 'Música'" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, + "Mostra el menú 'Música' (Es requereix reiniciar a Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Mostra «Vídeos»" @@ -6158,6 +6330,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SCALE_FACTOR, "Factor d'escala" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SCALE_FACTOR, + "Escala la mida dels elements de la interfície d'usuari en el menú." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, "Imatge de fons" @@ -6174,6 +6350,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_FRAMEBUFFER_OPACITY, "Opacitat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_FRAMEBUFFER_OPACITY, + "Modifica l'opacitat de fons del menú." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, "Fes servir el tema de colors del sistema" @@ -6198,6 +6378,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_SPEED, "Velocitat dels texts en moviment" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_TICKER_SPEED, + "La velocitat de l'animació del text en moure's en el menú." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_SMOOTH, "Suavitza el textos en moviment" @@ -6447,6 +6631,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_UNLOCK, "Desbloqueja les notificacions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_UNLOCK, + "Mostra una notificació si un assoliment es desbloqueja." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_MASTERY, "Notificacions de jocs" @@ -6471,6 +6659,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_LBOARD_CANCEL, "Missatges d'error en la taula de classificació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_LBOARD_CANCEL, + "Mostra un missatge si falla un intent d'entrar en una taula de classificació." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_LBOARD_TRACKERS, "Seguiment de la taula de classificació" @@ -6483,6 +6675,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, "Missatges detallats" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE, + "Mostra diagnòstic addicional i missatges d'error." + ) /* Settings > Network */ @@ -6558,6 +6754,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_PASSWORD, "Contrasenya del servidor" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_PASSWORD, + "Indica la contrasenya que han de fer servir els clients que es connecten al servidor." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATE_PASSWORD, "Contrasenya del servidor per espectadors" @@ -6768,6 +6968,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_SUBLABELS, "Mostra subetiquetes de les llistes" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_HISTORY_ICONS, + "Mostra icones específiques dels continguts a l'historial i als preferits" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_CORE, "Nucli:" @@ -6888,6 +7092,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_USE_FILENAME, "Fes servir els noms dels fitxers per cercar miniatures" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_ALLOW_NON_PNG, + "Permet tots els tipus d'matge per les miniatures" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGE, "Administrar" @@ -6911,6 +7119,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_SORT_MODE, "Mètode d'ordenació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_MANAGER_SORT_MODE, + "Determina com les entrades s'ordenen en aquesta llista de reproducció." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_CLEAN_PLAYLIST, "Neteja la llista de reproducció" @@ -7119,10 +7331,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR, "Filtres de vídeo" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FILTER_DIR, + "Els filtres de vídeo basats en CPU es desen en aquesta carpeta." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR, "Filtres d'àudio" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_FILTER_DIR, + "Els filtres d'àudio DSP s'emmagatzemen en aquesta carpeta." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR, "Shaders de Vídeo" @@ -7159,6 +7379,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OSK_OVERLAY_DIRECTORY, "Superposicions del teclat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OSK_OVERLAY_DIRECTORY, + "En aquesta carpeta es desen les superposicions de teclat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_LAYOUT_DIRECTORY, "Disposicions de vídeo" @@ -7263,6 +7487,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LOG_DIR, "Registres d'esdeveniments del sistema" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOG_DIR, + "El registre d'esdeveniments del sistema es desen en aquesta carpeta." + ) #ifdef HAVE_MIST /* Settings > Steam */ @@ -7271,6 +7499,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_ENABLE, "Activa Rich Presence" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STEAM_RICH_PRESENCE_ENABLE, + "Comparteix el teu estat actual dins de RetroArch a través de Steam." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT, @@ -7389,10 +7621,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_KICK, "Expulsar client" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_KICK, + "Expulsa al client de la teva sala." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_BAN, "Vetar client" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_BAN, + "Prohibeix l'accés a un client a la teva sala." + ) /* Import Content */ @@ -7856,6 +8096,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT, "Tanca contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOSE_CONTENT, + "Tanca el contingut. Es perdrà qualsevol progrés no desat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT, "Fes una captura de pantalla" @@ -7884,6 +8128,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Carrega estat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOAD_STATE, + "Carrega un estat desat des de la posició actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Desfer càrrega ràpida" @@ -7904,10 +8152,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAY_REPLAY, "Reproduir repetició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAY_REPLAY, + "Reprodueix el fitxer de repetició des de la posició seleccionada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_REPLAY, "Enregistrar la repetició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RECORD_REPLAY, + "Enregistra un fitxer de repetició a la posició seleccionada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_HALT_REPLAY, "Atura l'enregistrament/repetició" @@ -8102,6 +8358,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_AS, "Anomena i desa el fitxer de reassignació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_AS, + "Desa la configuració actual d'assignacions d'entrada en un nou fitxer d'assignacions." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, "Desa el fitxer de mapeig del nucli" @@ -8130,6 +8390,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_RESET, "Reinicia les assignacions d'entrada" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_RESET, + "Estableix totes les opcions de les assignacions als valors predeterminats." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_FLUSH, "Actualitza el fitxer d'assignacions d'entrada" @@ -8156,10 +8420,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD, "Carrega el fitxer de trucs (Reemplaça)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD, + "Carrega un fitxer de trucs i reemplaça els trucs existents." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD_APPEND, "Carrega fitxers de trucs (afegir)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD_APPEND, + "Carrega un fitxer de trucs i afegeix-los als trucs actuals." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_RELOAD_CHEATS, "Torna a carregar els trucs específics del joc" @@ -8384,6 +8656,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_ADDRESS_BIT_POSITION, "Adreça de memòria" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_ADDRESS_BIT_POSITION, + "Màscara de bits de la direcció si la mida de la cerca en memòria és menor a 8 bits." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_REPEAT_COUNT, "Nombre d'iteracions" @@ -8498,10 +8774,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PREPEND, "Anteposar el preajust" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_PREPEND, + "Anteposa el preajust actual al preajust carregat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_APPEND, "Afegeix el preajust" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_APPEND, + "Annexa l'ajustament actual en carregar-lo." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE, "Desar ajust predeterminat" @@ -8743,6 +9027,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_UNKNOWN_GAME, "Joc desconegut" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CANNOT_ACTIVATE_ACHIEVEMENTS_WITH_THIS_CORE, + "No es pot activar els assoliments amb aquest nucli" +) /* Quick Menu > Information */ @@ -8754,6 +9042,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DETAIL, "Element de la base de dades" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RDB_ENTRY_DETAIL, + "Mostra informació de la base de dades pel contingut actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY, "No hi ha elements disponibles" @@ -9463,6 +9755,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, "Bruix de la vora" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, + "Augmenta les dimensions de la quadrïcula de la vora del menú." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_RGUI_BORDER_FILLER_ENABLE, "Mostra la vora del menú." @@ -9503,6 +9799,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RGUI_MENU_THEME_PRESET, "Tema predefinit predeterminat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RGUI_MENU_THEME_PRESET, + "Selecciona un ajustament del tema del menú en l'explorador de fitxers." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_TRANSPARENCY, "Transparència" @@ -9797,10 +10097,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_XMB_ANIMATION_MOVE_UP_DOWN, "Animació de pujada/baixada" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_XMB_ANIMATION_MOVE_UP_DOWN, + "Indica l'animació que apareix en el desplaçament vertical." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_XMB_ANIMATION_OPENING_MAIN_MENU, "Animació d'obertura i tancament del menú principal" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_XMB_ANIMATION_OPENING_MAIN_MENU, + "Indica l'animació que apareix en obrir un submenú." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_ALPHA_FACTOR, "Transparència del tema de colors" @@ -9829,6 +10137,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_LAYOUT, "Disposició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_LAYOUT, + "Selecciona la disposició de la interfície XMB." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_THEME, "Tema d'icones" @@ -10618,6 +10930,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_RENAME_PLAYLIST, "Reanomena la llista de reproducció" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_CONFIRM_DELETE_PLAYLIST, + "Estàs segur que vols esborrar la llista de reproducció \"%1\"?" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_QUESTION, "Qüestió" @@ -10909,6 +11225,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SUBSYSTEM_SETTINGS, "Subsistemes" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SUBSYSTEM_SETTINGS, + "Accedeix a la configuració dels subsistemes pel contingut actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SUBSYSTEM_CONTENT_INFO, "Contingut actual: %s" @@ -11140,6 +11460,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_OUTPUT_DISPLAY_ID, "ID de la pantalla de sortida" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_OUTPUT_DISPLAY_ID, + "Selecciona el port de sortida connectat a la pantalla CRT." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP, "Ajuda" @@ -11433,6 +11757,10 @@ MSG_HASH( /* FIXME Should be MSG_ */ MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED, "El joc en línia començarà quan s’hagi carregat el contingut." ) +MSG_HASH( + MSG_NETPLAY_NEED_CONTENT_LOADED, + "El contingut s'ha de carregar abans d'iniciar el joc en xarxa." + ) MSG_HASH( /* FIXME Should be MSG_ */ MENU_ENUM_LABEL_VALUE_NETPLAY_LOAD_CONTENT_MANUALLY, "No s’ha pogut trobar cap nucli o fitxer de contingut adequats, carregueu-los manualment." @@ -11521,6 +11849,10 @@ MSG_HASH( MSG_WAITING_FOR_CLIENT, "Esperant al client..." ) +MSG_HASH( + MSG_ROOM_NOT_CONNECTABLE, + "No es pot connectar a la teva sala des d'internet." + ) MSG_HASH( MSG_NETPLAY_YOU_HAVE_LEFT_THE_GAME, "Has deixat el joc" @@ -11581,6 +11913,10 @@ MSG_HASH( MSG_NETPLAY_CANNOT_PLAY_NO_SLOTS, "No hi ha lloc per més jugadors" ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY_NOT_AVAILABLE, + "Els dispositius d'entrada sol·licitats no estan disponibles" + ) MSG_HASH( MSG_NETPLAY_CANNOT_PLAY, "No es pot canviar el mode de joc" @@ -11774,6 +12110,10 @@ MSG_HASH( MSG_SET_CORE_ASSOCIATION, "Nucli definit: " ) +MSG_HASH( + MSG_RESET_CORE_ASSOCIATION, + "S'ha restablert l'associació del nucli amb l'element de la llista." + ) MSG_HASH( MSG_APPENDED_DISK, "Disc afegit" @@ -12326,6 +12666,10 @@ MSG_HASH( MSG_MEMORY, "Memòria" ) +MSG_HASH( + MSG_MOVIE_FILE_IS_NOT_A_VALID_REPLAY_FILE, + "El fitxer de repetició d'entrada no és un fitxer vàlid." + ) MSG_HASH( MSG_MOVIE_PLAYBACK_ENDED, "La reproducció s'ha acabat." @@ -12418,6 +12762,10 @@ MSG_HASH( MSG_REMAP_FILE_REMOVED_SUCCESSFULLY, "S'ha eliminat el fitxer d'assignació." ) +MSG_HASH( + MSG_REMAP_FILE_RESET, + "Totes les opcions d'entrada han sigut restablertes." + ) MSG_HASH( MSG_REMOVED_DISK_FROM_TRAY, "Disc eliminat de la safata." @@ -12634,6 +12982,10 @@ MSG_HASH( MSG_USING_CORE_NAME_FOR_NEW_CONFIG, "Fes servir el nom del nucli per la nova configuració." ) +MSG_HASH( + MSG_USING_LIBRETRO_DUMMY_CORE_RECORDING_SKIPPED, + "Fent servir un nucli buit. Ometent la gravació." + ) MSG_HASH( MSG_VALUE_CONNECT_DEVICE_FROM_A_VALID_PORT, "Connecta el dispositiu a un port vàlid." @@ -12794,14 +13146,30 @@ MSG_HASH( MSG_REMAP_FILE_FLUSH_FAILED, "Error en desar les opcions d'assignació d'entrada a:" ) +MSG_HASH( + MSG_RUNAHEAD_ENABLED, + "Reducció predictiva de latència activada. Fotogrames de latència eliminats: %u." + ) MSG_HASH( MSG_RUNAHEAD_DISABLED, "Desactiva l'execució anticipada." ) +MSG_HASH( + MSG_RUNAHEAD_FAILED_TO_SAVE_STATE, + "Error en desar l'estat. La reducció predictiva de latència ha sigut desactivada." + ) +MSG_HASH( + MSG_RUNAHEAD_FAILED_TO_LOAD_STATE, + "Error en carregar l'estat. La reducció predictiva de latència ha sigut desactivada." + ) MSG_HASH( MSG_PREEMPT_DISABLED, "Sistemes de fotogrames preventiu desactivat." ) +MSG_HASH( + MSG_PREEMPT_FAILED_TO_ALLOCATE, + "Error en assignar memòria pel sistema de fotogrames preventius." + ) MSG_HASH( MSG_SCANNING_OF_FILE_FINISHED, "Cerca de fitxers finalitzada." @@ -12938,6 +13306,10 @@ MSG_HASH( MSG_CHEEVOS_GAME_HAS_NO_ACHIEVEMENTS, "Aquest joc no té assoliments." ) +MSG_HASH( + MSG_CHEEVOS_ALL_ACHIEVEMENTS_ACTIVATED, + "S'han activat tots els assoliments %d en aquesta sessió" +) MSG_HASH( MSG_CHEEVOS_UNOFFICIAL_ACHIEVEMENTS_ACTIVATED, "S'han activat els %d assoliments no oficials" @@ -12954,10 +13326,18 @@ MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Expectant %s" ) +MSG_HASH( + MSG_CHEEVOS_HARDCORE_PAUSED_BLACK_FRAME_INSERTION, + "Mode Hardcore en pausa. No es poden inserir fotogrames negres." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_PAUSED_SETTING_NOT_ALLOWED, "Mode Hardcore pausat. No es pot canviar: %s=%s" ) +MSG_HASH( + MSG_CHEEVOS_GAME_NOT_IDENTIFIED, + "RetroAchievements: No es pot identificar el joc." + ) MSG_HASH( MSG_CHEEVOS_GAME_LOAD_FAILED, "Error en carregar el joc a Assoliments: %s" @@ -12982,6 +13362,10 @@ MSG_HASH( MSG_RESAMPLER_QUALITY_HIGHEST, "Més alt" ) +MSG_HASH( + MSG_RGUI_INVALID_LANGUAGE, + "Avís: Llengua no suportada - Canviant a anglès." + ) MSG_HASH( MSG_DUMPING_DISC, "Abocant el disc..." @@ -13018,6 +13402,10 @@ MSG_HASH( MSG_MANUAL_CONTENT_SCAN_DAT_FILE_INVALID, "Has seleccionat un fitxer DAT de arcade no vàlid." ) +MSG_HASH( + MSG_MANUAL_CONTENT_SCAN_DAT_FILE_LOAD_ERROR, + "Error en carregar el fitxer DAT (format invàlid?)" + ) MSG_HASH( MSG_MANUAL_CONTENT_SCAN_INVALID_CONFIG, "Configuració de cerca manual no vàlida." @@ -13110,6 +13498,10 @@ MSG_HASH( MSG_CORE_RESTORATION_DISABLED, "Restauració de nucli desactivada, el nucli està protegit: " ) +MSG_HASH( + MSG_CORE_INSTALLATION_DISABLED, + "S’ha inhabilitat la instal·lació del nucli. El nucli està bloquejat: " + ) MSG_HASH( MSG_CORE_LOCK_FAILED, "Error en bloquejar el nucli: " @@ -13252,10 +13644,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_FILE_BROWSER_OPEN_UWP_PERMISSIONS, "Permet l'accés a fitxers externs" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FILE_BROWSER_OPEN_UWP_PERMISSIONS, + "Obre la configuració de permisos d'accés de fitxers a Windows" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FILE_BROWSER_OPEN_PICKER, "Obrir..." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FILE_BROWSER_OPEN_PICKER, + "Obre una altra carpeta mitjançant l'explorador de fitxers del sistema" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, "Filtre de parpelleig" @@ -13272,6 +13672,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_BLUETOOTH_SETTINGS, "Escaneja dispositius bluetooth i connecta-hi." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_WIFI_SETTINGS, + "Escaneja per xarxes wifi i estableix la connexió." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_WIFI_ENABLED, "Activant la WIFI" @@ -13560,6 +13964,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_BLUETOOTH_ERTM_DISABLE, "Deshabilitar bluetooth ERTM" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BLUETOOTH_ERTM_DISABLE, + "Desactiva el ERTM del senyal Bluetooth per corregir l'emparellament d'alguns dispositius" + ) #endif MSG_HASH( MSG_LOCALAP_SWITCHING_OFF, @@ -13645,6 +14053,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_RGA_SCALING, "Escalat RGA" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_RGA_SCALING, + "Escalat d'imatge que fa servir RGA i filtratge bicúbic. Pot fer malbé els widgets." + ) #else MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_CTX_SCALING, @@ -13660,6 +14072,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NEW3DS_SPEEDUP_ENABLE, "Activa l'acceleració de CPU de New3DS i memòria intermèdia L2" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NEW3DS_SPEEDUP_ENABLE, + "Activa la velocitat màxima de la CPU de New3DS (804 MHz) i la memòria intermèdia L2." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "Pantalla inferior de la 3DS" @@ -13676,6 +14092,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_800X240, "2D (Alta resolució)" ) +MSG_HASH( + MSG_3DS_BOTTOM_MENU_DEFAULT, + "Toca aquí per anar al menú de RetroArch" + ) MSG_HASH( MSG_3DS_BOTTOM_MENU_ASSET_NOT_FOUND, "No s'han trobat els recursos" @@ -13763,6 +14183,10 @@ MSG_HASH( MSG_SDL2_MIC_NEEDS_SDL2_AUDIO, "El micròfon sdl2 necessita un controlador d'àudio sdl2" ) +MSG_HASH( + MSG_ACCESSIBILITY_STARTUP, + "L'accessibilitat de RetroArch està activada. Menú principal, carregar nucli." + ) MSG_HASH( MSG_AI_SERVICE_STOPPED, "aturat." diff --git a/intl/msg_hash_sv.h b/intl/msg_hash_sv.h index a3e0f46cac..0ed2cd79cc 100644 --- a/intl/msg_hash_sv.h +++ b/intl/msg_hash_sv.h @@ -3567,6 +3567,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Visa/dölj meny" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_MENU_TOGGLE, + "Växlar den aktuella skärmen mellan meny och innehåll." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_QUIT_GAMEPAD_COMBO, "Avsluta (spelkontroll kombo)" @@ -4224,6 +4228,10 @@ MSG_HASH( /* Settings > Core */ +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, + "Ge hårdvarurenderade kärnor en egen privat kontext. Undviker att behöva anta att hårdvaran ändrar tillstånd mellan bildrutor." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DRIVER_SWITCH_ENABLE, "Tillåt kärnor att byta videodrivrutin" @@ -4725,6 +4733,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, "Slow motion hastighet" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO, + "Den hastighet som innehållet spelas upp i när slowmotion används." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_ENUM_THROTTLE_FRAMERATE, "Säkerställer att bildfrekvensen begränsas när du är inne i menyn." @@ -5470,6 +5482,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE, "Notis-storlek" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, + "Ange teckenstorleken i punkter. När widgetar används har denna storlek endast effekt på statistikvisningen på skärmen." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, "Notisposition (horisontellt)" @@ -5542,6 +5558,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_BGCOLOR_BLUE, "Ställer in det blåa värdet för bakgrundsfärgen för skärm-notiser. Giltiga värden är mellan 0 och 255." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_BGCOLOR_OPACITY, + "Ställer in opaciteten för OSD-bakgrundsfärgen. Giltiga värden ligger mellan 0,0 och 1,0." + ) /* Settings > User Interface */ @@ -7120,10 +7140,18 @@ MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_INLINE_CORE_NAME, "Ange när poster i spellistan ska taggas med den aktuella associerade kärnan (om någon).\nDen här inställningen ignoreras när underetiketter för spellistor är aktiverade." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_SUBLABELS, + "Visa underetiketter för spellista" + ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_SUBLABELS, "Visa ytterligare information för varje spellistepost, t. ex. aktuell kärnassociation och körtid (om tillgänglig). Har en varierande prestandapåverkan." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_HISTORY_ICONS, + "Visa innehållsspecifika ikoner i historik och favoriter" + ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_HISTORY_ICONS, "Visa specifika ikoner för varje post i historik- och favoritspellistan. Har en varierande prestandapåverkan." @@ -7611,6 +7639,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_DIRECTORY, "Historikspellista" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_HISTORY_DIRECTORY, + "Spara historikspellistan till denna katalog." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_IMAGE_HISTORY_DIRECTORY, "Bildspellista" @@ -9027,17 +9059,33 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_PARENT, "Spara de aktuella shaderinställningarna som standard för alla filer i den aktuella innehållskatalogen." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GAME, + "Spara de aktuella shaderinställningarna som standardinställningar för innehållet." + ) /* Quick Menu > Shaders > Remove */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_PRESETS_FOUND, + "Inga automatiska shader-förinställningar hittades" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_REMOVE_GLOBAL, "Ta bort globalt förval" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_REMOVE_GLOBAL, + "Ta bort den globala förinställningen, som används av allt innehåll och alla kärnor." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_REMOVE_CORE, "Ta bort kärnförval" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_REMOVE_CORE, + "Ta bort förinställningen för kärna, som används av allt innehåll som körs med den för närvarande inlästa kärnan." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_REMOVE_PARENT, "Ta bort förval för innehållskatalog" @@ -9046,6 +9094,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_REMOVE_GAME, "Ta bort spelförval" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_REMOVE_GAME, + "Ta bort förinställningen för spel, som endast används för det specifika spelet i fråga." + ) /* Quick Menu > Shaders > Shader Parameters */ @@ -9807,10 +9859,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME, "Färgtema" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RGUI_MENU_COLOR_THEME, + "Välj ett annat färgtema. Om du väljer ”Anpassad” kan du använda förinställda filer för menyteman." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RGUI_MENU_THEME_PRESET, "Anpassat temaförval" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RGUI_MENU_THEME_PRESET, + "Välj ett förinställt menytema från filbläddraren." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_TRANSPARENCY, "Genomskinlighet" @@ -9827,10 +9887,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT, "Animerad bakgrund" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_PARTICLE_EFFECT, + "Aktivera animeringseffekt för bakgrundspartiklar. Har en betydande prestandapåverkan." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT_SPEED, "Animerad bakgrunds hastighet" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_PARTICLE_EFFECT_SPEED, + "Justera hastigheten på animationseffekterna för bakgrundspartiklar." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT_SCREENSAVER, + "Bakgrundsanimering för skärmsläckare" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_INLINE_THUMBNAILS, "Visa miniatyrbilder för spellista" @@ -10057,10 +10129,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, "Dynamisk bakgrund" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPER, + "Läs in en ny bakgrundsbild dynamiskt beroende på kontext." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION, "Horisontell animering" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Aktivera horisontell animering för menyn. Detta kommer att påverka prestandan." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_FONT, "Typsnitt" @@ -10271,6 +10351,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_OZONE_TRUNCATE_PLAYLIST_NAME, "Ta bort tillverkarens namn från spellistorna. Till exempel, 'Sony - PlayStation' blir 'PlayStation'." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME, + "Sortera spellistor efter avkortat namn (omstart krävs)" + ) MSG_HASH( MENU_ENUM_SUBLABEL_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME, "Spellistorna kommer att sorteras om i alfabetisk ordning efter att tillverkarkomponenten i deras namn har tagits bort." @@ -10902,6 +10986,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_EXTENSIONS, "Tillägg:" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_EXTENSIONS_PLACEHOLDER, + "(blankstegsseparerade; inkluderar alla som standard)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_FILTER_INSIDE_ARCHIVES, "Filtrera inuti arkiv" @@ -11109,6 +11197,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY, "Historik" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOAD_CONTENT_HISTORY, + "Välj innehåll från spellistan med senaste historik." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_LOAD_CONTENT_HISTORY, "När innehåll läses in sparas innehåll och libretro core-kombinationer i historiken.\nHistoriken sparas i en fil i samma katalog som konfigurationsfilen för RetroArch. Om ingen konfigurationsfil lästs in vid uppstart sparas eller läses inte historiken in och den finns inte i huvudmenyn." @@ -11241,6 +11333,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_NO_PLAYLISTS, "Inga spellistor hittades" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_FOUND, + "Kompatibelt innehåll hittades" + ) /* Unused (Only Exist in Translation Files) */ @@ -11312,6 +11408,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, "Starta innehåll" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_PATH, + "Sökväg för innehållshistorik" + ) MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_OUTPUT_DISPLAY_ID, "Välj utgångsporten som är ansluten till CRT-skärmen." @@ -11974,6 +12074,10 @@ MSG_HASH( MSG_AUTOCONFIG_FILE_ERROR_SAVING, "Fel vid sparande av handkontrollerprofil." ) +MSG_HASH( + MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, + "Kontrollerprofilen sparades." + ) MSG_HASH( MSG_AUTOSAVE_FAILED, "Kunde inte initiera automatisk sparning." @@ -12050,6 +12154,10 @@ MSG_HASH( MSG_COULD_NOT_READ_CONTENT_FILE, "Kunde inte läsa innehållsfilen" ) +MSG_HASH( + MSG_COULD_NOT_READ_STATE_FROM_MOVIE, + "Kunde inte läsa tillstånd från film." + ) MSG_HASH( MSG_CRC32_CHECKSUM_MISMATCH, "CRC32-kontrollsumman stämmer inte överens mellan innehållsfilen och kontrollsumman för sparat innehåll i uppspelningsfilens huvud. Uppspelningen kommer med stor sannolikhet att desynkroniseras vid uppspelning." @@ -12074,6 +12182,14 @@ MSG_HASH( MSG_DISCONNECT_DEVICE_FROM_A_VALID_PORT, "Koppla från enhet från en giltig port." ) +MSG_HASH( + MSG_DISK_CLOSED, + "Stängde virtuell skivsläde." + ) +MSG_HASH( + MSG_DISK_EJECTED, + "Matade ut virtuell skivsläde." + ) MSG_HASH( MSG_DOWNLOADING, "Hämtar ner" @@ -12250,6 +12366,10 @@ MSG_HASH( MSG_FAILED_TO_TAKE_SCREENSHOT, "Misslyckades med att ta skärmbild." ) +MSG_HASH( + MSG_FAILED_TO_UNDO_LOAD_STATE, + "Misslyckades med att ångra inläst tillstånd." + ) MSG_HASH( MSG_FAILED_TO_UNDO_SAVE_STATE, "Misslyckades att få sparad status ogjord." @@ -12274,6 +12394,10 @@ MSG_HASH( MSG_FOUND_FIRST_DATA_TRACK_ON_FILE, "Hittade första dataspåret på fil" ) +MSG_HASH( + MSG_FOUND_LAST_STATE_SLOT, + "Hittade senaste tillståndsplats" + ) MSG_HASH( MSG_REPLAY_LOAD_STATE_FAILED_INCOMPAT, "Inte från aktuell inspelning" @@ -12458,6 +12582,10 @@ MSG_HASH( MSG_REDIRECTING_SAVESTATE_TO, "Omdirigerar sparad status till" ) +MSG_HASH( + MSG_REMOVED_DISK_FROM_TRAY, + "Tog bort skiva från släde." + ) MSG_HASH( MSG_REMOVING_TEMPORARY_CONTENT_FILE, "Tar bort temporär innehållsfil" @@ -12498,6 +12626,10 @@ MSG_HASH( MSG_SAVING_RAM_TYPE, "Sparar RAM-typ" ) +MSG_HASH( + MSG_SAVING_STATE, + "Sparar tillstånd" + ) MSG_HASH( MSG_SCANNING, "Skannar" diff --git a/intl/progress.h b/intl/progress.h index b26a2a5520..1482deac87 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 64 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 68 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -131,8 +131,8 @@ #define LANGUAGE_PROGRESS_SERBIAN_LATIN_APPROVED 0 /* Swedish */ -#define LANGUAGE_PROGRESS_SWEDISH_TRANSLATED 85 -#define LANGUAGE_PROGRESS_SWEDISH_APPROVED 48 +#define LANGUAGE_PROGRESS_SWEDISH_TRANSLATED 86 +#define LANGUAGE_PROGRESS_SWEDISH_APPROVED 49 /* Turkish */ #define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 100 From ab515cd22d2a0fdb1f22dfc93c62c63eb5a72eea Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 23 Apr 2025 00:15:54 +0000 Subject: [PATCH 011/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 166 +++++++++++++++++++++++++++++++++++++++++++-- intl/progress.h | 2 +- 2 files changed, 162 insertions(+), 6 deletions(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 1b130bdd6c..7ba25d1723 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2046,6 +2046,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES, "Subfotogrames d'ombreig" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_SUBFRAMES, + "AVÍS: El parpelleig ràpid pot causar errors gràfics en algunes pantalles. Fes servir aquesta opció sota la teva responsabilitat // Simula una línia d'escaneig en moviment bàsica sobre múltiples subfotogrames dividint la pantalla en vertical i renderitzant cada part d'acord amb quants subfotogrames hi ha." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Insereix fotogrames d'ombreig extra entre fotogrames per a qualsevol efecte d'ombreig que estigui designat per a executar-se més ràpid que la freqüència del contingut. Useu només l'opció designada per a la freqüència d'actualització actual de la pantalla. No ho feu servir per a freqüències d'actualització que no siguin múltiples de 60 Hz, com ara 144 Hz, 165 Hz, etc. No ho combineu amb intervals d'intercanvi > 1, BFI, retard dels fotogrames ni amb la sincronització a la velocitat d[...]" @@ -2118,6 +2122,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SCAN_SUBFRAMES, "Simulació de la línia d'escaneig en moviment" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SCAN_SUBFRAMES, + "AVÍS: El parpelleig ràpid pot causar errors gràfics en algunes pantalles. Fes servir aquesta opció sota la teva responsabilitat // Simula una línia d'escaneig en moviment bàsica sobre múltiples subfotogrames dividint la pantalla en vertical i renderitzant cada part d'acord amb quants subfotogrames hi ha." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SCAN_SUBFRAMES, "Simula una línia d'escaneig en moviment bàsica sobre múltiples subfotogrames dividint la pantalla en vertical i renderitzant cada part d'acord amb quants subfotogrames hi ha des del capdamunt cap avall." @@ -3510,7 +3518,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Deshabilita l'analògic dret en els menus" + "Deshabilita l'analògic dret en els menús" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, @@ -3645,7 +3653,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_PAUSE_TOGGLE, - "Alterna entre pausar o reanudar el contingut." + "Alterna entre aturar o reprendre el contingut." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, @@ -4409,6 +4417,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INITIAL_DISK_CHANGE_ENABLE, "Carrega automàticament els fitxers d'índexs de disc inicial" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INITIAL_DISK_CHANGE_ENABLE, + "En executar contingut de diversos dics, es carregarà l'últim disc utilitzat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, "Carrega els fitxers de shaders automàticament" @@ -4424,6 +4436,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, "Endreça els fitxers desats per carpetes amb el nom del nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SORT_SAVEFILES_ENABLE, + "Endreça els fitxers desats en carpetes que continguin el nom del nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, "Ordena els estats desats en carpetes amb el nom del nucli" @@ -4646,6 +4662,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE, "Filtra pel nucli actual" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FILTER_BY_CURRENT_CORE, + "Filtra els fitxers que es mostren a l'explorador de fitxers pel nucli actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_LAST_START_DIRECTORY, "Recorda l'última carpeta on has desat" @@ -4689,6 +4709,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, "Velocitat de càmera lenta" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO, + "Ajusta la velocitat a la qual es reprodueix el contingut si es fa servir càmera lenta." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ENUM_THROTTLE_FRAMERATE, "Limita la velocitat de fotogrames al menú" @@ -4877,6 +4901,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_VIEWS_SETTINGS, "Visibilitat de les notificacions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ONSCREEN_NOTIFICATIONS_VIEWS_SETTINGS, + "Canvia la visibilitat de determinades notificacions." + ) /* Settings > On-Screen Display > On-Screen Overlay */ @@ -5282,6 +5310,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MEMORY_SHOW, "Mostrar l'ús de la memòria " ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MEMORY_SHOW, + "Mostra la quantitat de memòria que es fa servir i la memòria total del sistema." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MEMORY_UPDATE_INTERVAL, "Interval d'actualització de l'ús de memòria (en fotogrames)" @@ -5310,6 +5342,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_CHEATS_APPLIED, "Notificacions dels trucs" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_CHEATS_APPLIED, + "Mostra un missatge en pantalla en aplicar trucs." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_PATCH_APPLIED, "Notificacions de correccions" @@ -5780,6 +5816,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Mostra 'Opcions'" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, + "Mostra el menú 'Configuració'. (Es requereix reiniciar per Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Establir contrasenya per activar la secció 'Opcions'" @@ -5792,10 +5832,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Mostra «Favorits»" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, + "Mostra el menú 'Preferits'. (Es requereix reiniciar per Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Mostrar Imatges" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, + "Mostra el menú 'Imatges'. (Es requereix reiniciar per Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Mostrar 'Música'" @@ -5808,10 +5856,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Mostra «Vídeos»" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, + "Mostra el menú 'Vídeos'. (Es requereix reiniciar per Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Mostra «Joc en línia»" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, + "Mostra el menú 'Joc en xarxa'. (Es requereix reiniciar per Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Mostra «Historial»" @@ -5971,6 +6027,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_REPLAY, "Mostra els controls de repetició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_REPLAY, + "Mostra les opcions per enregistrar o reproduir fitxers de repetició." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, "Mostra “Desfés el desament/càrrega d’estat”" @@ -6671,6 +6731,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_ACCOUNT, "Missatges d'inici de sessió" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_ACCOUNT, + "Mostra missatges relacionats amb l'inici de sessió al compte de RetroAchievements." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, "Missatges detallats" @@ -6897,10 +6961,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_UPDATER_BUILDBOT_URL, "URL dels nuclis del Buildbot" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_UPDATER_BUILDBOT_URL, + "Indica l'adreça web URL per actualitzar els nuclis de buildbot de libretro." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BUILDBOT_ASSETS_URL, "Adreça web de recursos de buildbot" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BUILDBOT_ASSETS_URL, + "Indica l'adreça web URL per actualitzar els nuclis de buildbot de libretro." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, "Extreu automàticament els fitxers descarregats" @@ -7111,6 +7183,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_RESET_CORES, "Reinicia les associacions de nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_MANAGER_RESET_CORES, + "Eliminar totes les associacions als nuclis existents pels elements de les llistes de reproducció." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_LABEL_DISPLAY_MODE, "Presentació d'etiquetes" @@ -7295,6 +7371,10 @@ MSG_HASH( /* FIXME Not RGUI specific */ MENU_ENUM_LABEL_VALUE_RGUI_CONFIG_DIRECTORY, "Fitxers de configuració" ) +MSG_HASH( /* FIXME Not RGUI specific */ + MENU_ENUM_SUBLABEL_RGUI_CONFIG_DIRECTORY, + "El fitxer de configuració predeterminat s'ha desat en aquesta carpeta." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH, "Nuclis" @@ -7568,7 +7648,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, - "Desconecta una sessió activa del joc en xarxa." + "Desconnecta una sessió activa del joc en xarxa." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_LOBBY_FILTERS, @@ -7648,6 +7728,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SCAN_THIS_DIRECTORY, "" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SCAN_THIS_DIRECTORY, + "Selecciona aquesta opció per cerca contingut a la carpeta actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SCAN_FILE, "Cerca en un fitxer" @@ -8003,6 +8087,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CREATE_NEW_PLAYLIST, "Crea una nova llista de reproducció" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CREATE_NEW_PLAYLIST, + "Crea una nova llista de reproducció i afegeix aquest element a la nova llista." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SET_CORE_ASSOCIATION, "Estableix l’associació del nucli" @@ -8310,6 +8398,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_OPTIONS_RESET, "Reinicia les opcions del nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_OPTIONS_RESET, + "Reinicia totes les opcions del nucli als valors predeterminats." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_OPTIONS_FLUSH, "Escriu les opcions al disc" @@ -8674,7 +8766,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_TYPE, - "Vibra si la memoria..." + "Vibra si la memòria" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_VALUE, @@ -8758,6 +8850,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SHADER_WATCH_FOR_CHANGES, "Comprova els canvis en els shaders" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SHADER_WATCH_FOR_CHANGES, + "Aplica els canvis al fitxer de shaders en el disc de manera automàtica." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_REMEMBER_LAST_DIR, "Recorda l'última carpeta de shaders que s'ha fet servir" @@ -8932,6 +9028,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERRIDE_FILE_SAVE_AS, "Anomena i desa les personalitzacions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERRIDE_FILE_SAVE_AS, + "Desa la configuració actual en un nou fitxer de personalització." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, "Desa les excepcions del nucli" @@ -9402,7 +9502,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_CHEAT_TYPE_RUN_NEXT_IF_NEQ, - "Executa el següent truc si el valor és diferent al de la memòria" + "Executa el següent truc si el valor és diferent del de la memòria" ) MSG_HASH( MENU_ENUM_LABEL_CHEAT_TYPE_RUN_NEXT_IF_LT, @@ -9771,6 +9871,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, "Filtre lineal" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_LINEAR_FILTER, + "Suavitza lleugerament el menú per no es notin les vores pixelades." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_INTERNAL_UPSCALE_LEVEL, "Reescalat intern" @@ -9819,6 +9923,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT_SPEED, "Velocitat de l'animació de fons" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_PARTICLE_EFFECT_SPEED, + "Ajusta la velocitat dels efectes d'animació de les partícules de fons." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT_SCREENSAVER, "Animació d'estalvi de pantalla" @@ -10093,6 +10201,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_XMB_ANIMATION_HORIZONTAL_HIGHLIGHT, "Ressalta les icones horitzontals en fer animacions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_XMB_ANIMATION_HORIZONTAL_HIGHLIGHT, + "Indica l'animació que apareix en moure's entre pestanyes." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_XMB_ANIMATION_MOVE_UP_DOWN, "Animació de pujada/baixada" @@ -10359,6 +10471,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OZONE_TRUNCATE_PLAYLIST_NAME, "Parteix els noms de la llista de reproducció (Es requereix reiniciar)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME, + "Endreça les llistes de reproducció després de truncar els noms (Cal reiniciar)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_OZONE, "Segona miniatura" @@ -10802,6 +10918,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_NETWORK_ERROR, "Error de xarxa" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_RESTART_TO_TAKE_EFFECT, + "Cal reiniciar el programa per a què els canvis tinguin efecte." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_LOG, "Registre" @@ -11877,6 +11997,10 @@ MSG_HASH( MSG_NETPLAY_S_HAS_JOINED_WITH_INPUT_DEVICES_S, "%.*s ha accedit amb el dispositiu %.*s" ) +MSG_HASH( + MSG_NETPLAY_ENDIAN_DEPENDENT, + "Aquest nucli no suporta el joc en xarxa entre aquestes plataformes" + ) MSG_HASH( MSG_NETPLAY_ENTER_PASSWORD, "Introdueix la contrasenya del servidor de joc:" @@ -12810,6 +12934,10 @@ MSG_HASH( MSG_REWIND_INIT, "Inicialitzant la memòria cau de rebobinat amb la mida" ) +MSG_HASH( + MSG_REWIND_INIT_FAILED_THREADED_AUDIO, + "La implementació de l'àudio fa servir multifil. No es pot rebobinar." + ) MSG_HASH( MSG_REWIND_REACHED_END, "S'ha arribat al final de la memòria intermèdia de rebobinat." @@ -12850,6 +12978,10 @@ MSG_HASH( MSG_SENDING_COMMAND, "Enviant comanda" ) +MSG_HASH( + MSG_SEVERAL_PATCHES_ARE_EXPLICITLY_DEFINED, + "Hi ha diversos trucs definits explícitament, ignorant-los tots..." + ) MSG_HASH( MSG_SHADER_PRESET_SAVED_SUCCESSFULLY, "S'ha desat la personalització de shaders correctament." @@ -13162,6 +13294,10 @@ MSG_HASH( MSG_RUNAHEAD_FAILED_TO_LOAD_STATE, "Error en carregar l'estat. La reducció predictiva de latència ha sigut desactivada." ) +MSG_HASH( + MSG_PREEMPT_ENABLED, + "Sistema de fotogrames preventiu activat. Fotogrames de latència eliminats: %u." + ) MSG_HASH( MSG_PREEMPT_DISABLED, "Sistemes de fotogrames preventiu desactivat." @@ -13170,6 +13306,14 @@ MSG_HASH( MSG_PREEMPT_FAILED_TO_ALLOCATE, "Error en assignar memòria pel sistema de fotogrames preventius." ) +MSG_HASH( + MSG_PREEMPT_FAILED_TO_SAVE_STATE, + "Error en desar estat. El sistema de fotogrames preventius s'ha desactivat." + ) +MSG_HASH( + MSG_PREEMPT_FAILED_TO_LOAD_STATE, + "Error en carregar estat. El sistema de fotogrames preventius s'ha desactivat." + ) MSG_HASH( MSG_SCANNING_OF_FILE_FINISHED, "Cerca de fitxers finalitzada." @@ -13326,6 +13470,10 @@ MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Expectant %s" ) +MSG_HASH( + MSG_CHEEVOS_HARDCORE_PAUSED_VSYNC_SWAP_INTERVAL, + "Mode Hardcore en pausa. No es permet un valor d'intercanvi de sincronització vertical superior a 1." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_PAUSED_BLACK_FRAME_INSERTION, "Mode Hardcore en pausa. No es poden inserir fotogrames negres." @@ -14031,10 +14179,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_VMOUSE_POINTER, "Fes servir el ratolí virtual (VMouse) com a punter" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TOUCH_VMOUSE_POINTER, + "Activa aquesta opció per enviar els tocs a la pantalla tàctil." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_VMOUSE_MOUSE, "Empra el ratolí virtual (VMouse) com a ratolí" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TOUCH_VMOUSE_MOUSE, + "Activa l'emulació de ratolí virtual fent servir els tocs a la pantalla tàctil." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_VMOUSE_TOUCHPAD, "Mode 'Touchpad' pel ratolí virtual" diff --git a/intl/progress.h b/intl/progress.h index 1482deac87..6f6db1cbc5 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 68 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 69 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ From b2a5e9792362c44409dd780e9b0f57050cc59d3d Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 24 Apr 2025 00:16:04 +0000 Subject: [PATCH 012/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 152 +++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 2 files changed, 153 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 7ba25d1723..70b00dd045 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2735,6 +2735,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY, "Retard dels fotogrames" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, + "Redueix la latència a canvi d'augmentar la probabilitat que es produeixen estrebades de vídeo." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_AUTO, "Retard automàtic de fotograma" @@ -2971,6 +2975,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_AUDIO_DEVICE_OSS, "Valor personalitzat per la ruta del controlador OSS." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_AUDIO_DEVICE_RSOUND, + "Direcció IP personalitzada en un servidor RSound pel controlador RSound." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY, "Latència de l'àudio (ms)" @@ -3248,6 +3256,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SELECT_PHYSICAL_KEYBOARD, "Selecciona el teclat físic" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_SELECT_PHYSICAL_KEYBOARD, + "Fes servir aquest dispositiu per un teclat físic i no per un controlador." + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSORS_ENABLE, @@ -3362,6 +3374,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, "Període de turbo" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD, + "Indica la duració entre fotogrames quan els botons amb turbo es cliquen." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_DUTY_CYCLE, "Cicle de treball del turbo" @@ -4658,6 +4674,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, "Filtrar extensions desconegudes" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, + "Mostra només fitxers que tinguin extensions conegudes a l'explorador de fitxers." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE, "Filtra pel nucli actual" @@ -5141,6 +5161,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_LIGHTGUN_PORT, "Port de la pistola de llum" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_LIGHTGUN_PORT, + "Selecciona el port del nucli que rebrà les accions d'entrada de la pistola de llum." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_LIGHTGUN_PORT_ANY, "Qualsevol" @@ -5254,6 +5278,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_WIDGETS_ENABLE, "Ginys gràfics" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_WIDGETS_ENABLE, + "Utilitza animacions, notificacions, indicacions i controls decoratius." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_WIDGET_SCALE_AUTO, "Escalar widgets gràfics automàticament" @@ -5290,6 +5318,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_FPS_UPDATE_INTERVAL, "Interval d'actualització de fotogrames (en fps)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FPS_UPDATE_INTERVAL, + "El comptador de fotogrames en pantalla s'actualitzarà a la velocitat assignada en fotogrames." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, "Mostra el comptador de fotogrames" @@ -5330,6 +5362,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT_ANIMATION, "Notificació d'inici en carregar contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CONTENT_ANIMATION, + "Mostra una breu animació per indicar que s'ha iniciat un contingut." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_AUTOCONFIG, "Notificacions de connexions d'entrada (configuració automàtica)" @@ -5358,6 +5394,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_REMAP_LOAD, "Notificacions de la càrrega de reassignacions d'entrada" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_REMAP_LOAD, + "Mostra un missatge en pantalla en carregar fitxers d'assignació d'entrada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_CONFIG_OVERRIDE_LOAD, "Notificacions de càrrega de configuracions personalitzades" @@ -5374,10 +5414,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_DISK_CONTROL, "Notificacions de control de disc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_DISK_CONTROL, + "Mostra un missatge en pantalla en inserir o extreure discs." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SAVE_STATE, "Notificacions dels estat desats" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_SAVE_STATE, + "Mostra un missatge en pantalla en desar i carregar desats ràpids." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_FAST_FORWARD, "Notificacions d’avanç ràpid" @@ -5559,6 +5607,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE, "Mode Quiosc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_ENABLE_KIOSK_MODE, + "Protegeix la configuració amagant la configuració relacionada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, "Estableix una contrasenya per desactivar el mode quiosc" @@ -5679,6 +5731,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_UI_COMPANION_START_ON_BOOT, "Executa la interfície d'usuari en iniciar" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_UI_COMPANION_START_ON_BOOT, + "Inicia el controlador de l'assistent de la interfície en iniciar (si està disponible)." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DESKTOP_MENU_ENABLE, "Menú d'escriptori (Es requereix reinici)" @@ -5872,10 +5928,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Mostra «Historial»" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, + "Mostra l'historial d'elements recents (Es requereix reiniciar per Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, "Mostra «Importa contingut»" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, + "Mostra el menú 'Importar contingut'. (Es requereix reiniciar per Ozone/XMB)" + ) MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostra «Importa contingut»" @@ -5904,6 +5968,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Mostra «Explora»" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, + "Mostra l'opció de l'explorador de continguts (És necessari reiniciar a Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Mostra «Nuclis sense continguts»" @@ -6123,6 +6191,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, "Mostra «Desa els nuclis forçats»" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, + "Mostra l'opció 'Desar personalitzacions del nucli' dins del menú Personalitzacions." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CONTENT_DIR_OVERRIDES, "Mostra l'opció 'Desar la personalització de carpetes de continguts'" @@ -6131,6 +6203,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, "Mostra desar les personalitzacions del joc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, + "Mostra l'opció 'Desar personalitzacions del nucli' dins del menú Personalitzacions." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CHEATS, "Mostrar trucs" @@ -6711,6 +6787,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_LBOARD_START, "Missatges d'inici de la taula de classificació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_LBOARD_START, + "Mostra una descripció d'una taula de classificació quan s'activi." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_LBOARD_SUBMIT, "Missatges enviats a la taula de classificació" @@ -6806,6 +6886,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT, "Port TCP per al joc en línia" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_TCP_UDP_PORT, + "Indica el port del servidor a connectar. Pot ser TCP o UDP." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_MAX_CONNECTIONS, "Nombre màxim de connexions" @@ -7191,6 +7275,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_LABEL_DISPLAY_MODE, "Presentació d'etiquetes" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_MANAGER_LABEL_DISPLAY_MODE, + "Canvia la forma de presentar les etiquetes de contingut per aquesta llista." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_SORT_MODE, "Mètode d'ordenació" @@ -7588,6 +7676,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT, "Format de continguts de presència enriquida" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STEAM_RICH_PRESENCE_FORMAT, + "Decideix quina informació dels continguts es compartirà." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT, @@ -8374,6 +8466,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_CORE_OPTIONS_CREATE, "Desa les opcions del joc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_GAME_SPECIFIC_CORE_OPTIONS_CREATE, + "Desa les opcions del nucli que s'aplicarà al contingut actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_CORE_OPTIONS_REMOVE, "Elimina les opcions del joc" @@ -8427,6 +8523,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_MANAGER_LIST, "Gestiona els fitxers de reassignació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_MANAGER_LIST, + "Carrega, desa o elimina els fitxers d'assignació d'entrada del contingut actual." + ) /* Quick Menu > Controls > Manage Remap Files */ @@ -8474,6 +8574,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, "Desa el fitxer de mapeig del nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_GAME, + "Desa un fitxer d'assignació que s'aplicarà al contingut actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_GAME, "Elimina els fitxers d'assignació del joc" @@ -8947,10 +9051,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GLOBAL, "Desa com a predefinició global" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GLOBAL, + "Desa la configuració actual de shaders com a configuració global predeterminada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, "Desa com a predefinició del nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_CORE, + "Desa la configuració actual del shader com a predeterminada per aquest nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_PARENT, "Desa com a predefinició del directori de contingut" @@ -9847,6 +9959,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, "Gruix del fons" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, + "Augmenta les dimensions de la quadrícula de fons del menú." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_ENABLE, "Filtre de vores" @@ -9943,6 +10059,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_RGUI, "Miniatura inferior" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS_RGUI, + "Tipus de miniatura a mostrar a la part superior dreta de la llista de reproducció." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_SWAP_THUMBNAILS, "Intercanvia miniatures" @@ -11437,6 +11557,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MAX_FRAME_LATENCY, "Latència de fotograma màxima" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_PARAMETERS, + "Modifica el preajust de shaders que utilitza el menú actualment." + ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO, "Shader predefinit" @@ -11481,6 +11605,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_FOUND, "S'ha trobat contingut compatible" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_NOT_FOUND, + "Error en localitzar el contingut corresponent segons el seu CRC o el nom del fitxer" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_START_GONG, "Iniciar gong" @@ -11961,6 +12089,10 @@ MSG_HASH( MSG_UPNP_FAILED, "Error en assignar ports UPnP pel joc en xarxa" ) +MSG_HASH( + MSG_NO_ARGUMENTS_SUPPLIED_AND_NO_MENU_BUILTIN, + "No s'ha introduït arguments i no hi ha menú integrant, mostrant ajuda..." + ) MSG_HASH( MSG_SETTING_DISK_IN_TRAY, "Introduint disc a la safata" @@ -11997,10 +12129,18 @@ MSG_HASH( MSG_NETPLAY_S_HAS_JOINED_WITH_INPUT_DEVICES_S, "%.*s ha accedit amb el dispositiu %.*s" ) +MSG_HASH( + MSG_NETPLAY_DIFFERENT_CORES, + "Un client del joc en xarxa està fent servir un nucli diferent. No es pot connectar amb el client." + ) MSG_HASH( MSG_NETPLAY_ENDIAN_DEPENDENT, "Aquest nucli no suporta el joc en xarxa entre aquestes plataformes" ) +MSG_HASH( + MSG_NETPLAY_PLATFORM_DEPENDENT, + "Aquest nucli no és compatible amb el joc en xarxa entre diferents plataformes" + ) MSG_HASH( MSG_NETPLAY_ENTER_PASSWORD, "Introdueix la contrasenya del servidor de joc:" @@ -12934,6 +13074,10 @@ MSG_HASH( MSG_REWIND_INIT, "Inicialitzant la memòria cau de rebobinat amb la mida" ) +MSG_HASH( + MSG_REWIND_INIT_FAILED, + "Error en iniciar la memòria intermèdia de rebobinat. La funció de rebobinat es desactivarà." + ) MSG_HASH( MSG_REWIND_INIT_FAILED_THREADED_AUDIO, "La implementació de l'àudio fa servir multifil. No es pot rebobinar." @@ -13470,6 +13614,10 @@ MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Expectant %s" ) +MSG_HASH( + MSG_CHEEVOS_HARDCORE_PAUSED_MANUAL_FRAME_DELAY, + "Mode Hardcore en pausa. No es pot ajustar manualment el retard entre fotogrames de vídeo." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_PAUSED_VSYNC_SWAP_INTERVAL, "Mode Hardcore en pausa. No es permet un valor d'intercanvi de sincronització vertical superior a 1." @@ -13510,6 +13658,10 @@ MSG_HASH( MSG_RESAMPLER_QUALITY_HIGHEST, "Més alt" ) +MSG_HASH( + MSG_MISSING_ASSETS, + "Avís: falten recursos, fes servir l'actualitzador en línia si està disponible." + ) MSG_HASH( MSG_RGUI_INVALID_LANGUAGE, "Avís: Llengua no suportada - Canviant a anglès." diff --git a/intl/progress.h b/intl/progress.h index 6f6db1cbc5..a68a2e6c9a 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 69 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 71 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ From 1a5eb6e8b9cb470358d505c48cfcc548d30ab69a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=9A=93?= Date: Wed, 23 Apr 2025 22:12:10 -0400 Subject: [PATCH 013/175] Implement `get_proc_address` for emscriptenwebgl_ctx --- gfx/drivers_context/emscriptenwebgl_ctx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gfx/drivers_context/emscriptenwebgl_ctx.c b/gfx/drivers_context/emscriptenwebgl_ctx.c index 26e5304015..a2e659ba27 100644 --- a/gfx/drivers_context/emscriptenwebgl_ctx.c +++ b/gfx/drivers_context/emscriptenwebgl_ctx.c @@ -239,6 +239,11 @@ static uint32_t gfx_ctx_emscripten_webgl_get_flags(void *data) static void gfx_ctx_emscripten_webgl_set_flags(void *data, uint32_t flags) { } +static gfx_ctx_proc_t gfx_ctx_emscripten_webgl_get_proc_address(const char *symbol) +{ + return emscripten_webgl_get_proc_address(symbol); +} + const gfx_ctx_driver_t gfx_ctx_emscripten_webgl = { gfx_ctx_emscripten_webgl_init, gfx_ctx_emscripten_webgl_destroy, @@ -261,7 +266,7 @@ const gfx_ctx_driver_t gfx_ctx_emscripten_webgl = { false, gfx_ctx_emscripten_webgl_swap_buffers, gfx_ctx_emscripten_webgl_input_driver, - NULL, + gfx_ctx_emscripten_webgl_get_proc_address, NULL, NULL, NULL, From 55f9f92eaf74560b6ebbad90a949b8dd453ca0b5 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Thu, 24 Apr 2025 10:14:16 -0700 Subject: [PATCH 014/175] Fixes an uninitialized variable in extra wasmfs/fetchfs feature Under some optimizations, this would lead to games using fetchfs backend just crashing due to calling wasmfs functions on a garbage pointer. --- frontend/drivers/platform_emscripten.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/drivers/platform_emscripten.c b/frontend/drivers/platform_emscripten.c index fdefe8d74b..ff2cb3ec6f 100644 --- a/frontend/drivers/platform_emscripten.c +++ b/frontend/drivers/platform_emscripten.c @@ -628,7 +628,7 @@ static void platform_emscripten_mount_filesystems(void) char *base_url = strdup(line); base_url[strcspn(base_url, "\r\n")] = '\0'; // drop newline base_url[len-1] = '\0'; // drop newline - backend_t fetch; + backend_t fetch = NULL; len = max_line_len; // Don't create fetch backend unless manifest actually has entries while (getline(&line, &len, file) != -1) @@ -636,6 +636,10 @@ static void platform_emscripten_mount_filesystems(void) if (!fetch) { fetch = wasmfs_create_fetch_backend(base_url, 16*1024*1024); + if(!fetch) { + printf("[FetchFS] couldn't create fetch backend for %s\n", base_url); + abort(); + } wasmfs_create_directory(fetch_base_dir, 0777, fetch); } char *realfs_path = strstr(line, " "), *url = line; From 8af10c25a1d77263e5144c1e3aa4b3c1953de676 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 25 Apr 2025 00:16:20 +0000 Subject: [PATCH 015/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 24 +++++++++++++++++ intl/msg_hash_chs.h | 48 ++++++++++++++++++++++++++++++++++ intl/msg_hash_it.h | 64 +++++++++++++++++++++++++++++++++++++++++++-- intl/progress.h | 4 +-- 4 files changed, 136 insertions(+), 4 deletions(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 70b00dd045..b0e82873d1 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2362,6 +2362,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_AUTOSWITCH_REFRESH_RATE, "Canvia automàticament la freqüència d'actualització" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_AUTOSWITCH_REFRESH_RATE, + "Canvia automàticament la freqüència d'actualització de la pantalla en funció del contingut actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_AUTOSWITCH_REFRESH_RATE_EXCLUSIVE_FULLSCREEN, "Només en mode de pantalla completa exclusiva" @@ -3414,6 +3418,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_BIND, "Assignació del turbo" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TURBO_BIND, + "L'assignació que activarà el turbo en el RetroPad. Si està buit, s'utilitzarà l'assignació específica del port." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_BUTTON, "Botó del turbo" @@ -5019,6 +5027,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, "Sensibilitat diagonal de la creueta" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, + "Ajusta la mida de les zones diagonals. Per tenir una simetría en les 8 direccions, selecciona 100%." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, "Sensibilitat de la sobreposició ABXY" @@ -5518,6 +5530,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, "Posició de les notificacions (horitzontal)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_X, + "Especifica una posició x personalitzada del text en pantalla respecte a l'eix X. 0 és la vora esquerra." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y, "Posició de les notificacions (vertical)" @@ -7651,6 +7667,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY, "Memòria cau" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, + "En aquesta carpeta es desen temporalment els continguts dels fitxers comprimits." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOG_DIR, "Registres d'esdeveniments del sistema" @@ -13702,6 +13722,10 @@ MSG_HASH( MSG_MANUAL_CONTENT_SCAN_DAT_FILE_INVALID, "Has seleccionat un fitxer DAT de arcade no vàlid." ) +MSG_HASH( + MSG_MANUAL_CONTENT_SCAN_DAT_FILE_TOO_LARGE, + "El fitxer de dades DAT seleccionat és massa gran (memòria lliure insuficient)." + ) MSG_HASH( MSG_MANUAL_CONTENT_SCAN_DAT_FILE_LOAD_ERROR, "Error en carregar el fitxer DAT (format invàlid?)" diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 7dfe5064d6..240d4eb98e 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -71,6 +71,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LIST, "选择使用的模拟器核心。" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_LIST_UNLOAD, + "卸载核心" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_LIST_UNLOAD, + "释放已加载核心。" + ) MSG_HASH( MENU_ENUM_LABEL_HELP_CORE_LIST, "浏览 libretro 核心实现。浏览器的起始位置取决于你的「核心目录」路径。若空,则从根目录开始。\n如果「核心目录」是一个目录,菜单会将其作为顶级文件夹使用。如果「核心目录」是一个完整路径,它将从路径所指文件所在的文件夹开始。" @@ -730,6 +738,30 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL2_SUPPORT, "SDL 2 支持" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_D3D8_SUPPORT, + "Direct3D 8 支持" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_D3D9_SUPPORT, + "Direct3D 9 支持" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_D3D10_SUPPORT, + "Direct3D 10 支持" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_D3D11_SUPPORT, + "Direct3D 11 支持" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_D3D12_SUPPORT, + "Direct3D 12 支持" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GDI_SUPPORT, + "GDI 支持" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VULKAN_SUPPORT, "Vulkan 支持" @@ -810,6 +842,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PULSEAUDIO_SUPPORT, "PulseAudio 支持" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PIPEWIRE_SUPPORT, + "PipeWire 支持" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COREAUDIO_SUPPORT, "CoreAudio 支持" @@ -890,6 +926,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_V4L2_SUPPORT, "Video4Linux2 支持" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SSL_SUPPORT, + "SSL 支持" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "libusb 支持" @@ -1749,6 +1789,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_AUDIO_DRIVER_PULSE, "PulseAudio 音频驱动。如果系统有 PulseAudio,请不要使用其他驱动,比如 ALSA。" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_AUDIO_DRIVER_PIPEWIRE, + "PipeWire 驱动。如果系统使用 PipeWire,请确保使用此驱动程序而不是 PulseAudio。" + ) MSG_HASH( MENU_ENUM_LABEL_HELP_AUDIO_DRIVER_JACK, "Jack 音频驱动。" @@ -1942,6 +1986,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, "黑帧补间" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION, + "警告:快速闪烁可能在某些显示器上造成图像持续。使用风险//在帧之间插入黑帧。 可以通过模拟CRT扫描来大幅降低移动侦测模糊,但以亮度为代价。" + ) MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "为增强运动清晰度在帧之间插入黑帧。仅使用为您当前显示刷新率指定的选项。 不以非倍数60赫兹的刷新速率使用,例如144赫兹,165赫兹等。 不要与Swap Interval > 1, sub-frames, Frame Delay, 或者 Sync to Exact Content Framerate功能同时使用. 可以打开系统的 VRR 选项,仅仅不是那个设置。 如果你注意到-任何-临时图像保留, 你应该在 120hz 处禁用, 对于更高的hz 则调整下面的暗色帧设置。" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 90243a38c1..89cc6b4cf2 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -67,6 +67,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LIST, "Seleziona il core da utilizzare." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_LIST_UNLOAD, + "Scollega Core" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_LIST_UNLOAD, + "Rilascia il Core caricato." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_CORE_LIST, "Sfoglia l'implementazione di un core libretro. Quando il browser si avvia dipende dal percorso della directory principale. Se vuoto, verrà avviato in root.\nSe la directory principale è una directory, il menu la userà come cartella in alto. Se Core Directory è un percorso completo, verrà avviato nella cartella in cui si trova il file." @@ -3715,6 +3723,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Attiva/Disattiva Menu" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_MENU_TOGGLE, + "Cambia la visualizzazione attuale tra il menu e il contenuto in esecuzione." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_QUIT_GAMEPAD_COMBO, "Esci (Controller Combo)" @@ -3791,6 +3803,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, "Pausa" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_PAUSE_TOGGLE, + "Alterna lo stato del contenuto tra in pausa e non in pausa." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, "Avanzamento fotogrammi" @@ -6079,6 +6095,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO, "Pausa il contenuto quando il menu è attivo" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PAUSE_LIBRETRO, + "Metti in pausa il contenuto se il menu è attivo." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SAVESTATE_RESUME, "Riprendi il contenuto dopo aver utilizzato i salvataggi di stato" @@ -6436,6 +6456,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLISTS, "Mostra 'Playlists'" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLISTS, + "Mostra le playlist nel menu principale. Ignorato in GLUI se le schede della playlist e della barra di navigazione sono abilitate." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, + "Mostra le schede delle Playlist" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, + "Mostra le schede della playlist. Non influisce su RGUI. La barra della navigazione deve essere abilitata in GLUI. (Riavvio richiesto su Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Mostra 'Esplora'" @@ -8360,6 +8392,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT, "Formato Del Contenuto Rich Presence" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STEAM_RICH_PRESENCE_FORMAT, + "Scegli quali informazioni relative al contenuto in esecuzione saranno condivise." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT, @@ -8944,6 +8980,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RESUME_CONTENT, "Riprendi" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RESUME_CONTENT, + "Riprendi il contenuto corrente e chiude il Menu Rapido." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RESTART_CONTENT, "Riavvia" @@ -8956,6 +8996,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT, "Chiudi contenuto" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOSE_CONTENT, + "Chiude il contenuto corrente. Eventuali modifiche non salvate potrebbero andare perse." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT, "Effettua uno screenshot" @@ -9088,10 +9132,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_OPTIONS, "Opzioni Core" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_OPTIONS, + "Cambia le opzioni per il contenuto." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS, "Controlli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS, + "Cambia le opzioni degli input per il contenuto." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS, "Trucchi" @@ -9714,6 +9766,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SHADER_WATCH_FOR_CHANGES, "Applicare automaticamente le modifiche apportate ai file shader sul disco." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SHADER_WATCH_FOR_CHANGES, + "Monitora i file shader per le nuove modifiche. Dopo aver salvato le modifiche a uno shader sul disco, verrà automaticamente ricompilato e applicato al contenuto in esecuzione." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_REMEMBER_LAST_DIR, "Ricorda L'Ultima Directory Shader usata" @@ -10378,11 +10434,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_HOLD_SELECT, - "Mantieni Seelect (2 secondi)" + "Mantieni Select (2 secondi)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DOWN_SELECT, - "Giù + Seleziona" + "Giù + Select" ) MSG_HASH( MENU_ENUM_LABEL_RUMBLE_TYPE_DISABLED, @@ -10875,6 +10931,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_TRANSPARENCY, "Trasparenza" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_TRANSPARENCY, + "Abilita la visualizzazione dello sfondo dei contenuti in esecuzione mentre il Menu Rapido è attivo. La disabilitazione della trasparenza può alterare i colori dei temi." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_SHADOWS, "Effetti Ombra" diff --git a/intl/progress.h b/intl/progress.h index a68a2e6c9a..9905c48cb5 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -83,7 +83,7 @@ #define LANGUAGE_PROGRESS_INDONESIAN_APPROVED 0 /* Italian */ -#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_ITALIAN_APPROVED 0 /* Japanese */ @@ -155,7 +155,7 @@ #define LANGUAGE_PROGRESS_VIETNAMESE_APPROVED 0 /* Chinese Simplified */ -#define LANGUAGE_PROGRESS_CHINESE_SIMPLIFIED_TRANSLATED 94 +#define LANGUAGE_PROGRESS_CHINESE_SIMPLIFIED_TRANSLATED 95 #define LANGUAGE_PROGRESS_CHINESE_SIMPLIFIED_APPROVED 43 /* Chinese Traditional */ From 30aad19fae5c5abe3d5808fc891d7a5f6a605665 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 26 Apr 2025 00:15:12 +0000 Subject: [PATCH 016/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 156 +++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 2 files changed, 157 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index b0e82873d1..bc4087bfc7 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -3010,6 +3010,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_INPUT_RATE, "Freqüència d'entrada predeterminada (Hz)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MICROPHONE_INPUT_RATE, + "Indica la freqüència de mostreig de l'entrada d'àudio. S'utilitzarà si els nuclis no demanen un valor concret." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_LATENCY, "Latència de l'entrada de so (ms)" @@ -3237,6 +3241,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_REMAP_SORT_BY_CONTROLLER_ENABLE, "Endreça les assignacions per cada controlador" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_REMAP_SORT_BY_CONTROLLER_ENABLE, + "Les assignacions s'aplicaran només al controlador actiu en el qual s'han desat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Auto-configura" @@ -5244,6 +5252,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_MOUSE_DTAP_MSEC, "Llindar de la doble pulsació (ms)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_MOUSE_DTAP_MSEC, + "Ajusta el marge de temps entre clics pel qual es detectarà un doble clic." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_MOUSE_SWIPE_THRESHOLD, "Llindar de lliscament" @@ -5362,6 +5374,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MEMORY_UPDATE_INTERVAL, "Interval d'actualització de l'ús de memòria (en fotogrames)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MEMORY_UPDATE_INTERVAL, + "El comptador de memòria en pantalla s'actualitzarà a la velocitat assignada a fotogrames." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_PING_SHOW, "Mostra el ping del joc en línia" @@ -5402,6 +5418,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_PATCH_APPLIED, "Mostra un missatge en pantalla al corregir ROM al vol." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_AUTOCONFIG, + "Mostra un missatge en pantalla quan es connectin o desconnectin dispositiu d'entrada." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_AUTOCONFIG_FAILS, + "Mostra un missatge en pantalla quan el dispositiu d'entrda no es pot configurar." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_REMAP_LOAD, "Notificacions de la càrrega de reassignacions d'entrada" @@ -5414,6 +5438,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_CONFIG_OVERRIDE_LOAD, "Notificacions de càrrega de configuracions personalitzades" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_CONFIG_OVERRIDE_LOAD, + "Mostra un missatge en pantalla en carregar fitxers de configuració." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SET_INITIAL_DISK, "Notificacions en restaurar un disc d'inci" @@ -5538,6 +5566,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y, "Posició de les notificacions (vertical)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, + "Especifica una posició personalitzada del text en pantalla respecte a l'eix Y. 0 és la vora inferior." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED, "Color de les notificacions (vermell)" @@ -6215,6 +6247,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CONTENT_DIR_OVERRIDES, "Mostra l'opció 'Desar la personalització de carpetes de continguts'" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_CONTENT_DIR_OVERRIDES, + "Mostra l'opció 'Desa la personalització de les carpetes de contingut' dins del menú Personalitzacions." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, "Mostra desar les personalitzacions del joc" @@ -6510,6 +6546,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, "Fes servir el tema de colors del sistema" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, + "Fes servir el tema de color del sistema operatiu (si n'hi ha). S'ignoraran la configuració del tema." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_THUMBNAILS, "Miniatura principal" @@ -6526,6 +6566,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Animació de text en moviment" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_TICKER_TYPE, + "Selecciona el mètode desplaçament horitzontal pels texts del menú que siguin molt llargs." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_SPEED, "Velocitat dels texts en moviment" @@ -6791,10 +6835,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_MASTERY, "Notificacions de jocs" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_MASTERY, + "Mostra una notificació quan s'hagin desbloquejat tots els assoliments d'un joc." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_CHALLENGE_INDICATORS, "Activa els indicadors de desafiament" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_CHALLENGE_INDICATORS, + "Mostra indicadors en pantalla quan es puguin desbloquejar certs assoliments." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_PROGRESS_TRACKER, "Indicador de progrés" @@ -6823,6 +6875,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_LBOARD_TRACKERS, "Seguiment de la taula de classificació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_LBOARD_TRACKERS, + "Mostra informació del seguiment en pantalla amb el valor actualitzat de les taules de classifcació actives." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_ACCOUNT, "Missatges d'inici de sessió" @@ -6926,6 +6982,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATE_PASSWORD, "Contrasenya del servidor per espectadors" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_SPECTATE_PASSWORD, + "Indica la contrasenya que han de fer servir els clients que es connecten al sevidor com a espectadors." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_START_AS_SPECTATOR, "Mode espectador del joc en línia" @@ -7096,6 +7156,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HISTORY_LIST_ENABLE, "Historial" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_HISTORY_LIST_ENABLE, + "Permet tenir llistes de jocs, imatges, música i vídeos utilitzats recentment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, "Mida del historial" @@ -7307,6 +7371,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_CLEAN_PLAYLIST, "Neteja la llista de reproducció" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_MANAGER_CLEAN_PLAYLIST, + "Confirma les associacions a nuclis i elimina els elements invàlids i duplicats." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_REFRESH_PLAYLIST, "Actualitza la llista de reproducció" @@ -8336,10 +8404,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Desfer càrrega ràpida" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE, + "Si s'ha carregat un estat desat, el contingut tornarà a l'estat previ a la càrrega." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE, "Desfer desat ràpid" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, + "Si s'ha sobreescrit un desat ràpid, tornarà a tenir les dades prèvies." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REPLAY_SLOT, "Posició de repitició" @@ -8494,6 +8570,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_CORE_OPTIONS_REMOVE, "Elimina les opcions del joc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_GAME_SPECIFIC_CORE_OPTIONS_REMOVE, + "Elimina les opcions del nucli que s'aplicaran només al contingut actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE, "Desa les opcions del directori de contingut" @@ -8578,6 +8658,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, "Desa el fitxer de mapeig del nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_CORE, + "Desa un fitxer d'assignació que s'aplicarà a tots els continguts que es carreguin amb aquest nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CORE, "Elimina els fitxers d'assignació del nucli" @@ -8602,6 +8686,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_GAME, "Elimina els fitxers d'assignació del joc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_REMOVE_GAME, + "Elimina el fitxer d'assignació que s'aplicarà al contingut actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_RESET, "Reinicia les assignacions d'entrada" @@ -8614,6 +8702,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_FLUSH, "Actualitza el fitxer d'assignacions d'entrada" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_FLUSH, + "Sobreescriu el fitxer d'assignació actiu amb les opcions actuals d'assignació d'entrada." + ) /* Quick Menu > Controls > Manage Remap Files > Load Remap File */ @@ -8888,6 +8980,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_REPEAT_ADD_TO_VALUE, "Augmentar el valor en cada iteració" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_REPEAT_ADD_TO_VALUE, + "Després de cada iteració, el 'Valor' augmentarà en aquesta quantitat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_TYPE, "Vibra si la memòria" @@ -9091,6 +9187,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME, "Desa com a predefinició del joc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GAME, + "Desa la configuració actual de shaders per aquest contingut." + ) /* Quick Menu > Shaders > Remove */ @@ -10087,10 +10187,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_SWAP_THUMBNAILS, "Intercanvia miniatures" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_SWAP_THUMBNAILS, + "Intercanvia la posició de les miniatures superior e inferior." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_THUMBNAIL_DOWNSCALER, "Mètode d'escalat de miniatures" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER, + "Selecciona el mètode de redimensionat perquè les miniatures entrin a la pantalla." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_THUMBNAIL_DELAY, "Retard en les miniatures (ms)" @@ -11521,6 +11629,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PORT_DEVICE_NAME, "Port %d Nom dispositiu: %s (#%d)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PORT_DEVICE_INFO, + "Nom per mostrar del dispositiu: %s\nNom de configuració del dispositiu: %s\n VID/PID del dispositiu: %d/%d" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_SETTINGS, "Configuració dels trucs" @@ -11565,6 +11677,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES, "Nombre màxim d'imatges en la cadena d'intercanvi" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, + "Avisa al controlador de vídeo que faci servir un mode de búfer concret." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_WAITABLE_SWAPCHAINS, "Cadenes d'intercanvi en espera" @@ -11577,6 +11693,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MAX_FRAME_LATENCY, "Latència de fotograma màxima" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MAX_FRAME_LATENCY, + "Avisa al controlador de vídeo que faci servir un mode de búfer concret." + ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_PARAMETERS, "Modifica el preajust de shaders que utilitza el menú actualment." @@ -12149,6 +12269,10 @@ MSG_HASH( MSG_NETPLAY_S_HAS_JOINED_WITH_INPUT_DEVICES_S, "%.*s ha accedit amb el dispositiu %.*s" ) +MSG_HASH( + MSG_NETPLAY_OUT_OF_DATE, + "Un client del joc en xarxa fa servir una versió antiga de RetroArch. No es pot connectar amb el client." + ) MSG_HASH( MSG_NETPLAY_DIFFERENT_CORES, "Un client del joc en xarxa està fent servir un nucli diferent. No es pot connectar amb el client." @@ -12438,6 +12562,10 @@ MSG_HASH( MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, "S’ha desat correctament el perfil del controlador." ) +MSG_HASH( + MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY_NAMED, + "El perfil de controlador s'ha desat a la carpeta corresponent com:\n\"%s\"" + ) MSG_HASH( MSG_AUTOSAVE_FAILED, "No s’ha pogut inicialitzar el desament automàtic." @@ -12854,6 +12982,10 @@ MSG_HASH( MSG_GAME_FOCUS_OFF, "Focus al joc desactivat" ) +MSG_HASH( + MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING, + "La renderització d'aquest nucli es fa per maquinari. Els enregistraments han de tenir shaders aplicats." + ) MSG_HASH( MSG_INFLATED_CHECKSUM_DID_NOT_MATCH_CRC32, "La suma de verificació inflada no coincideix amb el CRC32." @@ -13446,6 +13578,10 @@ MSG_HASH( MSG_RUNAHEAD_ENABLED, "Reducció predictiva de latència activada. Fotogrames de latència eliminats: %u." ) +MSG_HASH( + MSG_RUNAHEAD_ENABLED_WITH_SECOND_INSTANCE, + "La reducció predictiva de latència predictiva s'ha activat mitjançant una segona instància. Fotogrames de latència eliminats: %u." + ) MSG_HASH( MSG_RUNAHEAD_DISABLED, "Desactiva l'execució anticipada." @@ -13650,6 +13786,10 @@ MSG_HASH( MSG_CHEEVOS_HARDCORE_PAUSED_SETTING_NOT_ALLOWED, "Mode Hardcore pausat. No es pot canviar: %s=%s" ) +MSG_HASH( + MSG_CHEEVOS_HARDCORE_PAUSED_SYSTEM_NOT_FOR_CORE, + "Mode Hardcore en pausa. No pots desbloquejar assoliments Hardcore de %s amb %s" + ) MSG_HASH( MSG_CHEEVOS_GAME_NOT_IDENTIFIED, "RetroAchievements: No es pot identificar el joc." @@ -13850,6 +13990,10 @@ MSG_HASH( MSG_UNSUPPORTED_VIDEO_MODE, "El mode de vídeo no és compatible" ) +MSG_HASH( + MSG_CORE_INFO_CACHE_UNSUPPORTED, + "No es pot escriure a la carpeta d'informació del nucli: es desactivarà la memòria intermèdia d'informació del nucli" + ) MSG_HASH( MSG_FOUND_ENTRY_STATE_IN, "S'ha trobat un desat ràpid a" @@ -13862,6 +14006,10 @@ MSG_HASH( MSG_FAILED_TO_ENTER_GAMEMODE, "Error en entrar al GameMode" ) +MSG_HASH( + MSG_FAILED_TO_ENTER_GAMEMODE_LINUX, + "Error en entrar a GameMode - comprova que el servei de GameMode està instal·lat i en funcionament" + ) MSG_HASH( MSG_VRR_RUNLOOP_ENABLED, "S'ha activat la sincronització a la velocitat de fotogrames del contingut exacta." @@ -14371,6 +14519,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_VMOUSE_TOUCHPAD, "Mode 'Touchpad' pel ratolí virtual" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TOUCH_VMOUSE_TOUCHPAD, + "Activa aquesta opció juntament amb el ratolí per utilitzar la pantalla tàctil com a panell tàctil." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_VMOUSE_TRACKBALL, "Mode 'Trackball' del ratolí virtual" @@ -14456,6 +14608,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_BOTTOM_ASSETS_DIRECTORY, "Directori de recursos de la pantalla inferior" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BOTTOM_ASSETS_DIRECTORY, + "Indica la carpeta de recursos de la pantalla inferior. La carpeta ha de tenir un fitxer \"bottom_menu.png\"." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BOTTOM_FONT_ENABLE, "Habilitar la font" diff --git a/intl/progress.h b/intl/progress.h index 9905c48cb5..3023a439b2 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 71 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 73 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ From 57845fd3cf8c74b5d67b0be34c186da95e15d33f Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Sat, 26 Apr 2025 01:10:16 +0000 Subject: [PATCH 017/175] Remove commented-out needless HAVE_ features --- Makefile.ctr | 2 -- 1 file changed, 2 deletions(-) diff --git a/Makefile.ctr b/Makefile.ctr index d00b4f388c..71760232df 100644 --- a/Makefile.ctr +++ b/Makefile.ctr @@ -98,9 +98,7 @@ else HAVE_NETWORKING = 1 HAVE_IFINFO = 1 HAVE_CHEEVOS = 1 - #HAVE_SOCKET_LEGACY = 1 HAVE_THREADS = 1 - #HAVE_SSL = 1 HAVE_BUILTINMBEDTLS = 1 HAVE_CORE_INFO_CACHE = 1 From fdcd4e78e883ea6f4e7873445998ed0d0ca8cf9c Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Sat, 26 Apr 2025 01:11:11 +0000 Subject: [PATCH 018/175] 3DS: enable Cloud Sync --- Makefile.ctr | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.ctr b/Makefile.ctr index 71760232df..ad4093bc9c 100644 --- a/Makefile.ctr +++ b/Makefile.ctr @@ -101,6 +101,7 @@ else HAVE_THREADS = 1 HAVE_BUILTINMBEDTLS = 1 HAVE_CORE_INFO_CACHE = 1 + HAVE_CLOUDSYNC = 1 include Makefile.common CFLAGS += $(DEF_FLAGS) From ebd79bfa72c71f9c75d202950ffc67b455294751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=9A=93?= Date: Sat, 26 Apr 2025 19:11:19 -0400 Subject: [PATCH 019/175] Fix feature test for `GL_CAPS_ARGB8` in Emscripten builds --- libretro-common/gfx/gl_capabilities.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libretro-common/gfx/gl_capabilities.c b/libretro-common/gfx/gl_capabilities.c index 1829eb490f..7603af9efb 100644 --- a/libretro-common/gfx/gl_capabilities.c +++ b/libretro-common/gfx/gl_capabilities.c @@ -190,11 +190,15 @@ bool gl_check_capability(enum gl_capability_enum enum_idx) break; #endif case GL_CAPS_ARGB8: -#ifdef HAVE_OPENGLES +#if defined(HAVE_OPENGLES) && !defined(EMSCRIPTEN) if (gl_query_extension("OES_rgb8_rgba8") || gl_query_extension("ARM_rgba8") || major >= 3) return true; +#elif defined(HAVE_OPENGLES) && defined(EMSCRIPTEN) + if (gl_query_extension("EXT_sRGB") + || major >= 3) + return true; #else /* TODO/FIXME - implement this for non-GLES? */ #endif From 633ee296e7c34633912f5d9605cba9ac664b8c27 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 27 Apr 2025 00:17:17 +0000 Subject: [PATCH 020/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 136 +++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 2 files changed, 137 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index bc4087bfc7..7c550849e1 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2603,10 +2603,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Relació d'aspecte personalitzat (posició X)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, + "Desplaçament personalitzat per definir la posició en l'eix X de l'àrea de visualització." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Relació d'aspecte personalitzat (posició Y)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, + "Desplaçament personalitzat per definir la posició en l'eix Y de l'àrea de visualització." + ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, "Compensa l'eix X del punt d'anclatge" @@ -3026,6 +3034,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_WASAPI_FLOAT_FORMAT, "Format WASAPI de coma flotant" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MICROPHONE_WASAPI_FLOAT_FORMAT, + "Fes servir el format de coma flotant pel controlador WASAPI, si és compatible amb el teu dispositiu d'àudio." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_WASAPI_SH_BUFFER_LENGTH, "Mida de la memòria intermèdia compartida de WASAPI" @@ -3679,6 +3691,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, "Rebobina" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_REWIND_HOTKEY, + "Rebobina el contingut actual mentre es polsa la tecla. Ha d'estar activat 'Suporta rebobinat'." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, "Fer pausa" @@ -3766,10 +3782,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, "Disc Següent" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_DISK_NEXT, + "Incrementa l'índex del disc seleccionat actualment. La safata de disc virtual ha d'estar oberta." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, "Disc Anterior" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_DISK_PREV, + "Disminueix l'índex del disc seleccionat actualment. La safata de disc virtual ha d'estar oberta." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_TOGGLE, @@ -4060,6 +4084,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_RESERVED_DEVICE_NAME, "Dispositiu reservat per aquest jugador" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DEVICE_RESERVED_DEVICE_NAME, + "Aquest controlador serà assignat a aquest jugador seguint el mode de reserva." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DEVICE_RESERVATION_NONE, "Sense reserva" @@ -4080,6 +4108,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_REMAP_PORT, "Port assignat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_REMAP_PORT, + "Especifica quin dels ports del nucli rebrà els senyals d'entrada del port del comandament %u." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, "Configura tots els controls" @@ -4496,6 +4528,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, "Interval entre desats automàtics de la SaveRAM" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTOSAVE_INTERVAL, + "Desa automàticament la SaveRAM no volàtil a intervals marcats (en segons)." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REPLAY_CHECKPOINT_INTERVAL, "Interval de punts de control de repetició" @@ -4768,6 +4804,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY, "Rebobinar fotogrames" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_GRANULARITY, + "El nombre de fotogrames a rebobinar en cada pas. Valors alts augmenten la velocitat de rebobinat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE, "Mida de la memòria intermèdia del rebobinat (MB)" @@ -5047,6 +5087,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ANALOG_RECENTER_ZONE, "Zona de centrat dels gatells analògics" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ANALOG_RECENTER_ZONE, + "El senyal d'entrada dels joysticks analògics serà relativa a la posició del primer clic si es fa dins d'aquesta zona." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY, "Superposició" @@ -5075,6 +5119,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE_LANDSCAPE, "Escala de superposició (mode horitzontal)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_SCALE_LANDSCAPE, + "Dimensiona els elements de la interfície d'usuari quan es fa servir una orientació horitzontal de la pantalla." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_ASPECT_ADJUST_LANDSCAPE, "Relació d'aspecte de la superposició (mode horitzontal)" @@ -5103,6 +5151,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE_PORTRAIT, "Escala de la superposició (mode vertical)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_SCALE_PORTRAIT, + "Dimensiona els elements de la interfície d'usuari quan es fa servir una orientació vertical de la pantalla." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_ASPECT_ADJUST_PORTRAIT, "Relació d'aspecte de superposició (Mode vertical)" @@ -5574,14 +5626,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED, "Color de les notificacions (vermell)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_COLOR_RED, + "Ajusta el valor del vermell del color del text en els missatges en pantalla. Els valors vàlids són de 0 a 255." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN, "Color de les notificacions (verd)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_COLOR_GREEN, + "Ajusta el valor del verd del color del text en els missatges en pantalla. Els valors vàlids són de 0 a 255." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE, "Color de les notificacions (blau)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_COLOR_BLUE, + "Ajusta el valor del blau del color del text en els missatges en pantalla. Els valors vàlids són de 0 a 255." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE, "Fons de les notificacions" @@ -5594,14 +5658,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_RED, "Color de fons de les notificacions (vermell)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_BGCOLOR_RED, + "Ajusta el valor del vermell del fons dels missatges en pantalla. Els valors vàlids són de 0 a 255." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_GREEN, "Color de fons de les notificacions (verd)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_BGCOLOR_GREEN, + "Ajusta el valor del verd del fons dels missatges en pantalla. Els valors vàlids són de 0 a 255." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_BLUE, "Color de fons de les notificacions (blau)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_BGCOLOR_BLUE, + "Ajusta el valor del blau del fons dels missatges en pantalla. Els valors vàlids són de 0 a 255." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY, "Opacitat del fons de les notificacions" @@ -5759,6 +5835,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_DISABLE_COMPOSITION, "Els gestors de finestres usen la composició per aplicar efectes visuals i detectar finestres que no responen, entre altres coses." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_DISABLE_COMPOSITION, + "Força la desactivació de la composició. Només funciona per Windows Vista o Windows 7." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SCROLL_FAST, "Acceleració del desplaçament del menú" @@ -6851,6 +6931,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_PROGRESS_TRACKER, "Indicador de progrés" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_PROGRESS_TRACKER, + "Mostra un indicador en pantalla quan es facin progressos per aconseguir certs assoliments." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_LBOARD_START, "Missatges d'inici de la taula de classificació" @@ -8666,6 +8750,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CORE, "Elimina els fitxers d'assignació del nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_REMOVE_CORE, + "Elimina el fitxer d'assignació que s'aplicarà a tots els cotinguts que es carreguin amb aquest nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CONTENT_DIR, "Desa la personalització a la carpeta de fitxers" @@ -9126,6 +9214,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Paràmetres del shader" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PARAMETERS, + "Modifica el shader actual directament. Els canvis no es desaran en el fitxer d'ajustament." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES, "Nombre de passades del shader" @@ -10167,6 +10259,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT_SCREENSAVER, "Animació d'estalvi de pantalla" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_PARTICLE_EFFECT_SCREENSAVER, + "Mostra un efecte d'animació de partícules en el fons mentre l'estalvi de pantalla del menú estigui actiu." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_INLINE_THUMBNAILS, "Mostra miniatures de les llistes de reproducció" @@ -10848,10 +10944,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_THUMBNAIL_VIEW_PORTRAIT, "Visualització de les miniatures en mode vertical" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_MENU_THUMBNAIL_VIEW_PORTRAIT, + "Especifica la forma de mostra les miniatures de les llistes de reproducció amb l'orientació vertical." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_THUMBNAIL_VIEW_LANDSCAPE, "Miniatures en mode horitzontal" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_MENU_THUMBNAIL_VIEW_LANDSCAPE, + "Especifica la forma de mostra les miniatures de les llistes de reproducció amb l'orientació horitzontal." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Mostra les miniatures secundàries en les llistes" @@ -12225,6 +12329,10 @@ MSG_HASH( MSG_PUBLIC_ADDRESS, "L'assignació de ports pel joc en xarxa s'ha completat" ) +MSG_HASH( + MSG_PRIVATE_OR_SHARED_ADDRESS, + "La xarxa externa té una adreça privada o compartida. Podries utilitzar un servidor intermedi." + ) MSG_HASH( MSG_UPNP_FAILED, "Error en assignar ports UPnP pel joc en xarxa" @@ -13378,6 +13486,10 @@ MSG_HASH( MSG_NO_THUMBNAIL_AVAILABLE, "No hi ha miniatures disponibles" ) +MSG_HASH( + MSG_NO_THUMBNAIL_DOWNLOAD_POSSIBLE, + "Ja s'han cercat totes les possibles caràtules descarregables per aquest element de la llista de reproducció." + ) MSG_HASH( MSG_PRESS_AGAIN_TO_QUIT, "Premeu una altra vegada per sortir..." @@ -13586,6 +13698,14 @@ MSG_HASH( MSG_RUNAHEAD_DISABLED, "Desactiva l'execució anticipada." ) +MSG_HASH( + MSG_RUNAHEAD_CORE_DOES_NOT_SUPPORT_SAVESTATES, + "La reducció predictiva de latència ha sigut desactivada perquè aquest nucli no és compatible amb els desats ràpids." + ) +MSG_HASH( + MSG_RUNAHEAD_CORE_DOES_NOT_SUPPORT_RUNAHEAD, + "La reducció predictiva de latència no està disponible perquè el nucli no suporta els desats ràpids." + ) MSG_HASH( MSG_RUNAHEAD_FAILED_TO_SAVE_STATE, "Error en desar l'estat. La reducció predictiva de latència ha sigut desactivada." @@ -13594,6 +13714,10 @@ MSG_HASH( MSG_RUNAHEAD_FAILED_TO_LOAD_STATE, "Error en carregar l'estat. La reducció predictiva de latència ha sigut desactivada." ) +MSG_HASH( + MSG_RUNAHEAD_FAILED_TO_CREATE_SECONDARY_INSTANCE, + "Error en carregar la segona instància. La reducció predictiva de latència només farà servir una instància a partir d'ara." + ) MSG_HASH( MSG_PREEMPT_ENABLED, "Sistema de fotogrames preventiu activat. Fotogrames de latència eliminats: %u." @@ -13822,6 +13946,10 @@ MSG_HASH( MSG_MISSING_ASSETS, "Avís: falten recursos, fes servir l'actualitzador en línia si està disponible." ) +MSG_HASH( + MSG_RGUI_MISSING_FONTS, + "Atenció: falten tipografies per la llengua seleccionada, useu l’actualitzador en línia si està disponible." + ) MSG_HASH( MSG_RGUI_INVALID_LANGUAGE, "Avís: Llengua no suportada - Canviant a anglès." @@ -14120,6 +14248,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_FILE_BROWSER_OPEN_UWP_PERMISSIONS, "Obre la configuració de permisos d'accés de fitxers a Windows" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_OPEN_UWP_PERMISSIONS, + "Obre la finestra de configuració de permisos de Windows per activar el permís a broadFileSystemAccess." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FILE_BROWSER_OPEN_PICKER, "Obrir..." @@ -14531,6 +14663,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_VMOUSE_GESTURE, "Empra els gestos pel ratolí virtual" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TOUCH_VMOUSE_GESTURE, + "Activa els gestos a la pantalla tàctil, incloent-hi clicar, arrossegar i combinacions de dits." + ) #endif #ifdef HAVE_ODROIDGO2 MSG_HASH( diff --git a/intl/progress.h b/intl/progress.h index 3023a439b2..8ad94be111 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 73 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 75 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ From 54af661d95567a67d712cd976c111764423e0fc1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 28 Apr 2025 00:16:34 +0000 Subject: [PATCH 021/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 160 +++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 2 files changed, 161 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 7c550849e1..6cdaad3641 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2987,6 +2987,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_AUDIO_DEVICE_OSS, "Valor personalitzat per la ruta del controlador OSS." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_AUDIO_DEVICE_JACK, + "Valor personalitzat del nom del port pel controlador JACK (per exemple: system:playback1,system:playback_2)." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_AUDIO_DEVICE_RSOUND, "Direcció IP personalitzada en un servidor RSound pel controlador RSound." @@ -3002,10 +3006,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_ENABLE, "Micròfon" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MICROPHONE_ENABLE, + "Activa l'entrada d'àudio en aquells nuclis que siguin compatibles. Si el nucli no fa servir el micròfon, no augmenta la càrrega de la CPU." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_DEVICE, "Dispositiu" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MICROPHONE_DEVICE, + "Força el dispositiu que fa servir el controlador de micròfon. Això depèn del controlador." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_MICROPHONE_DEVICE, + "Força el dispositiu que fa servir el controlador de micròfon. Això depèn del controlador." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_RESAMPLER_QUALITY, "Qualitat del re-sampleig" @@ -3454,6 +3470,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ALLOW_DPAD, "Permet direccions amb la creueta amb turbo" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TURBO_ALLOW_DPAD, + "Permet que els botons digitals de direcció (coneguts com a creueta) puguin fer servir el mode turbo." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_FIRE_SETTINGS, "Disparador de turbo" @@ -3482,6 +3502,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS, "Dreceres de teclat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_HOTKEY_BINDS, + "Canvia la configuració i l'assignació de tecles d'accés ràpid, així com les combinacions de tecles per mostrar o amagar el menú durant la partida." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_RETROPAD_BINDS, "Assignacions dels RetroPad" @@ -4453,6 +4477,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_SAVE_ON_EXIT, "Desa els fitxers d'assignació en sortir" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_SAVE_ON_EXIT, + "Desa els canvis de qualsevol fitxer d'assignació d'entrada actiu en tancar un contingut o en sortir de RetroArch." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS, "Carrega automàticament les opcions del nucli pel contingut" @@ -4516,10 +4544,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_BY_CONTENT_ENABLE, "Endreça els fitxers desats per carpetes amb el nom del contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SORT_SAVEFILES_BY_CONTENT_ENABLE, + "Endreça els fitxers de desat mitjançant carpetes amb els noms on es troba el contingut." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_BY_CONTENT_ENABLE, "Endreça els estats desats en carpetes amb el nom del contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SORT_SAVESTATES_BY_CONTENT_ENABLE, + "Endreça els desats ràpids mitjançant carpetes amb el nom on es troba el contingut." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE, "No sobreescriguis la SaveRAM en carregar un desat ràpid" @@ -5083,6 +5119,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, "Sensibilitat de la sobreposició ABXY" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, + "Ajusta la mida de les zones superposades en el bloc dels botons d'acció. Per obtenir una simetria en les 8 direccions, selecciona el 100%." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ANALOG_RECENTER_ZONE, "Zona de centrat dels gatells analògics" @@ -5218,6 +5258,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OSK_OVERLAY_AUTO_SCALE, "Escala automàticament la posició del teclat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OSK_OVERLAY_AUTO_SCALE, + "Ajusta la superposició de teclat a la relació d'aspecte original. Desactiva aquesta opció per estirar el teclat per tota la pantalla." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OSK_OVERLAY_OPACITY, "Opacitat del teclat superposat" @@ -5269,6 +5313,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_LIGHTGUN_ALLOW_OFFSCREEN, "Permet apuntar fora de la pantalla" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_LIGHTGUN_ALLOW_OFFSCREEN, + "Permet apuntar fora dels límits de la pantalla. Desactiva aquesta opció per limitar l'apuntat a la vora de la pantalla." + ) /* Settings > On-Screen Display > On-Screen Overlay > Overlay Mouse */ @@ -5682,6 +5730,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY, "Opacitat del fons de les notificacions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_BGCOLOR_OPACITY, + "Ajusta l'opacitat del fons dels missatges en pantalla. Els valors vàlids estan entre 0,0 i 1,0." + ) /* Settings > User Interface */ @@ -5759,6 +5811,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INSERT_DISK_RESUME, "Reprendre contingut al canviar de disc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_INSERT_DISK_RESUME, + "Tanca el menú i reprèn el contingut automàticament després d'inserir o carregar un nou disc." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUIT_ON_CLOSE_CONTENT, "Surt en tancar el contingut" @@ -6088,6 +6144,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLISTS, "Mostra «Llistes de reproducció»" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLISTS, + "Mostra les llistes de reproducció en el menú principal. S'ignorarà aquesta opció a GLUI si s'activen les seccions de la llista de reproducció i de la barra de navegació." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Mostra les pestanyes de les llistes de reproducció" @@ -6891,6 +6951,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_SETTINGS, "Visibilitat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_SETTINGS, + "Canvia quins missatges i elements de pantalla es mostraran. Aquesta opció no desactiva la funcionalitat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_SUMMARY, "Resum d'inici" @@ -6947,6 +7011,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_LBOARD_SUBMIT, "Missatges enviats a la taula de classificació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_LBOARD_SUBMIT, + "Mostra un missatge amb el valor enviat en completar l'intent d'entrar en una taula de classificació." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_LBOARD_CANCEL, "Missatges d'error en la taula de classificació" @@ -7006,6 +7074,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_CUSTOM_MITM_SERVER, "Direcció del servidor intermediari personalitzat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_CUSTOM_MITM_SERVER, + "Aquí pots introduir la direcció del teu servidor intermediari personalitzat. Format: Adreça o adreça/port." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_MITM_SERVER_LOCATION_1, "Nord-amèrica (Costa est, USA)" @@ -7050,10 +7122,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_MAX_CONNECTIONS, "Nombre màxim de connexions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_MAX_CONNECTIONS, + "Indica el nombre màxim de connexions actives que admet el servidor abans de rebutjar una nova connexió." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_MAX_PING, "Limitació del ping" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_MAX_PING, + "Indica la latència (ping) màxima que acceptarà el servidor d'altres connexions. Selecciona 0 per desactivar el límit." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_PASSWORD, "Contrasenya del servidor" @@ -7221,6 +7301,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, "Extreu automàticament els fitxers descarregats" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, + "Extreu els continguts dels fitxers després de descarregar-los." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SHOW_EXPERIMENTAL_CORES, "Mostra els nuclis experimentals" @@ -7248,6 +7332,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, "Mida del historial" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_HISTORY_SIZE, + "Limita el nombre d'entrades a la llista de reproducció recent per jocs, imatges, música i vídeos." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_FAVORITES_SIZE, "Mida dels favorits" @@ -7412,6 +7500,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_USE_FILENAME, "Fes servir els noms dels fitxers per cercar miniatures" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_USE_FILENAME, + "Si està activat, es cercaran miniatures mitjançant el nom del fitxer de l'element i no en la seva etiqueta." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_ALLOW_NON_PNG, "Permet tots els tipus d'matge per les miniatures" @@ -7494,6 +7586,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_NICKNAME, "Nom d’usuari" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, + "Introdueix aquí el teu nom d'usuari. Aquest nom es farà servir pel joc en xarxa i altres coses." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_LANGUAGE, "Llengua" @@ -9166,6 +9262,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_REMEMBER_LAST_DIR, "Recorda l'última carpeta de shaders que s'ha fet servir" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_REMEMBER_LAST_DIR, + "Obre l'explorador de fitxers en l'última carpeta que es va obrir per carregar ajustaments i shaders." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Carregar ajust predeterminat" @@ -9384,6 +9484,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME, "Elimina les personalitzacions del joc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME, + "Elimina el fitxer de configuració personalitzada que s'aplicarà només al contingut actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERRIDE_UNLOAD, "Descarrega la personalització" @@ -9427,6 +9531,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_SERVER_UNREACHABLE, "El servidor de RetroAchievements no està disponible" ) +MSG_HASH( + MENU_ENUM_LABEL_CHEEVOS_SERVER_DISCONNECTED, + "El servidor de RetroAchievements no està disponible. Es seguirà intentant la connexió fins que es confirmi la comunicació o fins que es tanqui l'aplicació." +) +MSG_HASH( + MENU_ENUM_LABEL_CHEEVOS_SERVER_RECONNECTED, + "Totes les sol·licituds pendents han sigut sincronitzades amb el servidor de RetroAchievements." +) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_IDENTIFYING_GAME, "S'està identificant el joc" @@ -10243,10 +10355,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_SHADOWS, "Efectes d'ombra" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_SHADOWS, + "Mostra ombres en el text, vores i miniatures del menú. No afecta gaire el rendiment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT, "Animació de fons" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_PARTICLE_EFFECT, + "Activa un efecte d'animació de partícules en el fons. Té un impacte en el rendiment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT_SPEED, "Velocitat de l'animació de fons" @@ -10311,6 +10431,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_SWITCH_ICONS, "Icones d'interruptors" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_SWITCH_ICONS, + "Mostra icones en comptes de text per representar aquella configuració del menú que tingui aquestes opcions." + ) /* RGUI: Settings Options */ @@ -10609,10 +10733,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_SWITCH_ICONS, "Icones d'interruptors" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_SWITCH_ICONS, + "Mostra icones en comptes de text per representar aquella configuració del menú que tingui aquestes opcions." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE, "Efectes d'ombra" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_SHADOWS_ENABLE, + "Mostra ombres en totes les icones, miniatures i texts. Afecta lleugerament al rendiment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE, "Canal de shaders" @@ -10908,6 +11040,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_SWITCH_ICONS, "Icones d'interruptors" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_SWITCH_ICONS, + "Mostra icones en comptes de text per representar aquella configuració del menú que tingui aquestes opcions." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_PLAYLIST_ICONS_ENABLE, "Icones de les llistes de reproducció (Es requereix reinici)" @@ -10940,6 +11076,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_TRANSITION_ANIMATION, "Animació de transició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_MENU_TRANSITION_ANIMATION, + "Permet navegar per les diferents opcions del menú amb una animació fluida." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_THUMBNAIL_VIEW_PORTRAIT, "Visualització de les miniatures en mode vertical" @@ -12305,6 +12445,10 @@ MSG_HASH( MSG_NETPLAY_LAN_SCAN_COMPLETE, "S’ha completat la cerca de partides en línia." ) +MSG_HASH( + MSG_SORRY_UNIMPLEMENTED_CORES_DONT_DEMAND_CONTENT_NETPLAY, + "Ho sentim, aquest sistema no està implementat: els nuclis que no requereixen continguts, no poden fer servir. el joc en xarxa." + ) MSG_HASH( MSG_NATIVE, "Nativa" @@ -13150,6 +13294,10 @@ MSG_HASH( MSG_IN_GIGABYTES, "en gigabytes" ) +MSG_HASH( + MSG_LIBRETRO_ABI_BREAK, + "està compilat per una versió diferent de libretro que aquesta compilació de libretro." + ) MSG_HASH( MSG_LIBRETRO_FRONTEND, "Interfície d'usuari per Libretro" @@ -13726,6 +13874,14 @@ MSG_HASH( MSG_PREEMPT_DISABLED, "Sistemes de fotogrames preventiu desactivat." ) +MSG_HASH( + MSG_PREEMPT_CORE_DOES_NOT_SUPPORT_SAVESTATES, + "El sistema de fotogrames preventiu ha sigut desactivat perquè aquest nucli no és compatible amb els desats ràpids." + ) +MSG_HASH( + MSG_PREEMPT_CORE_DOES_NOT_SUPPORT_PREEMPT, + "No està disponible el sistema de fotogrames preventius perquè aquest nucli no suporta els desats ràpids." + ) MSG_HASH( MSG_PREEMPT_FAILED_TO_ALLOCATE, "Error en assignar memòria pel sistema de fotogrames preventius." @@ -13862,6 +14018,10 @@ MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_CHANGED_BY_HOST, "Assoliments Hardcore canviats pel servidor." ) +MSG_HASH( + MSG_CHEEVOS_HARDCORE_MODE_REQUIRES_NEWER_HOST, + "El servidor de joc en xarxa necessita una actualització. Els assoliments Hardcore han sigut desactivats per aquesta sessió." + ) MSG_HASH( MSG_CHEEVOS_COMPLETED_GAME, "Completat %s" diff --git a/intl/progress.h b/intl/progress.h index 8ad94be111..b2f70f4106 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 75 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 77 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ From 0c838c14e99cab036387577de96a63f9a873dc5d Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Tue, 29 Apr 2025 18:36:48 +0000 Subject: [PATCH 022/175] Makefiles: don't print info unconditionally The point of making the default "semi-silent" (each target is printed, but not the entire invocation verbatim) was to factor out information about invocation to a one-time target (info) and not repeating it ever again. With V=1, the info target is silent, because each command invocation will be printed verbatim, which needs no herald. The undesired side effect of me introducing the info target and making it a dependency of the default all target is that info doesn't respect the --silent make option, so in this use case it was more noisy, not less. I believe the most elegant solution that satisfies all use cases is to stop printing info unconditionally, and instead list it explicitly in make invocations in CI, together with the all target. Then this info is kept available for inspection from logs, but it's not repeated on each invocation. The intention was to make the logs easier to read and scroll in search for new compiler warnings. --- Makefile | 2 +- Makefile.ctr | 2 +- Makefile.dos | 2 +- Makefile.miyoo | 2 +- Makefile.ngc | 2 +- Makefile.orbis | 2 +- Makefile.ps2 | 2 +- Makefile.psl1ght | 2 +- Makefile.retrofw | 2 +- Makefile.rs90 | 2 +- Makefile.vita | 2 +- Makefile.webos | 2 +- Makefile.wii | 2 +- Makefile.wiiu | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index ca736ddab3..9d68f555d7 100644 --- a/Makefile +++ b/Makefile @@ -171,7 +171,7 @@ ifneq ($(MOC_HEADERS),) RARCH_OBJ += $(MOC_OBJ) endif -all: info $(TARGET) config.mk +all: $(TARGET) config.mk define INFO ASFLAGS: $(ASFLAGS) diff --git a/Makefile.ctr b/Makefile.ctr index ad4093bc9c..5ac5102b92 100644 --- a/Makefile.ctr +++ b/Makefile.ctr @@ -274,7 +274,7 @@ endif .PHONY: $(BUILD) clean all -all: info $(TARGET) +all: $(TARGET) define INFO AR: $(AR) diff --git a/Makefile.dos b/Makefile.dos index 2f36430112..18f716e91d 100644 --- a/Makefile.dos +++ b/Makefile.dos @@ -207,7 +207,7 @@ DEPENDS := $(filter-out libretro_libnx.a,$(DEPENDS_TMP)) #--------------------------------------------------------------------------------- # main targets #--------------------------------------------------------------------------------- -all: info $(OUTPUT) +all: $(OUTPUT) define INFO CC: $(CC) diff --git a/Makefile.miyoo b/Makefile.miyoo index 67c1b73d91..77cbfedd44 100644 --- a/Makefile.miyoo +++ b/Makefile.miyoo @@ -166,7 +166,7 @@ endif RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ)) -all: info $(TARGET) +all: $(TARGET) define INFO ASFLAGS: $(ASFLAGS) diff --git a/Makefile.ngc b/Makefile.ngc index c733120fbf..a82230c738 100644 --- a/Makefile.ngc +++ b/Makefile.ngc @@ -241,7 +241,7 @@ OBJOUT = -o LINKOUT = -o LINK = $(CXX) -all: info $(EXT_TARGET) +all: $(EXT_TARGET) define INFO CC: $(CC) diff --git a/Makefile.orbis b/Makefile.orbis index b598f715e0..b5bd2f9bf4 100644 --- a/Makefile.orbis +++ b/Makefile.orbis @@ -182,7 +182,7 @@ endif TARGETS := $(TARGET).self -all: info $(TARGETS) +all: $(TARGETS) define INFO CC: $(CC) diff --git a/Makefile.ps2 b/Makefile.ps2 index 1ffe0d1e95..ef5c905b8d 100644 --- a/Makefile.ps2 +++ b/Makefile.ps2 @@ -108,7 +108,7 @@ EE_INCS = $(INCDIR) EE_BIN = $(TARGET).elf EE_GPVAL = $(GPVAL) -all: info $(EE_BIN) +all: $(EE_BIN) define INFO EE_BIN: $(EE_BIN) diff --git a/Makefile.psl1ght b/Makefile.psl1ght index 6350e07cb4..cbff2b32ff 100644 --- a/Makefile.psl1ght +++ b/Makefile.psl1ght @@ -130,7 +130,7 @@ ifneq ($(V),1) Q := @ endif -all: info $(SELF_TARGET) +all: $(SELF_TARGET) define INFO CXX: $(CXX) diff --git a/Makefile.retrofw b/Makefile.retrofw index fc0a2ddffa..d3ecb0a008 100644 --- a/Makefile.retrofw +++ b/Makefile.retrofw @@ -184,7 +184,7 @@ X-OD-NeedsDownscaling=true endef export DESKTOP_ENTRY -all: info $(TARGET) opk +all: $(TARGET) opk define INFO ASFLAGS: $(ASFLAGS) diff --git a/Makefile.rs90 b/Makefile.rs90 index 58492e5308..58323d3615 100644 --- a/Makefile.rs90 +++ b/Makefile.rs90 @@ -186,7 +186,7 @@ X-OD-NeedsDownscaling=true endef export DESKTOP_ENTRY -all: info $(TARGET) opk +all: $(TARGET) opk define INFO ASFLAGS: $(ASFLAGS) diff --git a/Makefile.vita b/Makefile.vita index ec94f0cbca..c4691300e6 100644 --- a/Makefile.vita +++ b/Makefile.vita @@ -201,7 +201,7 @@ TARGETS := $(TARGET).vpk DEPFLAGS = -MT $@ -MMD -MP -MF $*.Tdepend POSTCOMPILE = mv -f $*.Tdepend $*.depend -all: info $(TARGETS) +all: $(TARGETS) define INFO ASFLAGS: $(ASFLAGS) diff --git a/Makefile.webos b/Makefile.webos index 4ca35b420c..f774f23505 100644 --- a/Makefile.webos +++ b/Makefile.webos @@ -204,7 +204,7 @@ define APPINFO endef export APPINFO -all: info $(TARGET) ipk +all: $(TARGET) ipk define INFO ASFLAGS: $(ASFLAGS) diff --git a/Makefile.wii b/Makefile.wii index f25ebff1a7..193036f282 100644 --- a/Makefile.wii +++ b/Makefile.wii @@ -273,7 +273,7 @@ OBJOUT = -o LINKOUT = -o LINK = $(CXX) -all: info $(EXT_TARGET) +all: $(EXT_TARGET) define INFO CC: $(CC) diff --git a/Makefile.wiiu b/Makefile.wiiu index ee66630887..47552d31a7 100644 --- a/Makefile.wiiu +++ b/Makefile.wiiu @@ -302,7 +302,7 @@ endif DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.depend -all: info $(TARGETS) +all: $(TARGETS) define INFO AR: $(AR) From 48f842f30733157d5338c1f9659cb3a7c98192a6 Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Tue, 29 Apr 2025 18:54:24 +0000 Subject: [PATCH 023/175] CI: use the info target These makefiles provide the info target that will print contents of each variable that is not printed (unless V=1, which is not the case here) on command invocation. Making this information available in the logs should help debugging, but it doesn't need to be printed on each command invocation. --- .github/workflows/3DS.yml | 2 +- .github/workflows/DOS-DJGPP.yml | 2 +- .github/workflows/GameCube.yml | 2 +- .github/workflows/Linux.yml | 2 +- .github/workflows/MSYS2.yml | 2 +- .github/workflows/Miyoo.yml | 2 +- .github/workflows/PS2.yml | 2 +- .github/workflows/PS3-PSL1GHT.yml | 2 +- .github/workflows/PS4-ORBIS.yml | 2 +- .github/workflows/PSVita.yml | 2 +- .github/workflows/RS90.yml | 2 +- .github/workflows/RetroFW.yml | 2 +- .github/workflows/Wii.yml | 2 +- .github/workflows/WiiU.yml | 2 +- .github/workflows/retroarch.yml | 2 +- .github/workflows/webOS.yml | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/3DS.yml b/.github/workflows/3DS.yml index e1825e4b26..34aa1ac9be 100644 --- a/.github/workflows/3DS.yml +++ b/.github/workflows/3DS.yml @@ -30,7 +30,7 @@ jobs: - name: Compile RA run: | make -f Makefile.ctr -j$(getconf _NPROCESSORS_ONLN) USE_CTRULIB_2=1 clean - make -f Makefile.ctr -j$(getconf _NPROCESSORS_ONLN) USE_CTRULIB_2=1 HAVE_STATIC_DUMMY=1 + make -f Makefile.ctr -j$(getconf _NPROCESSORS_ONLN) USE_CTRULIB_2=1 HAVE_STATIC_DUMMY=1 info all - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" diff --git a/.github/workflows/DOS-DJGPP.yml b/.github/workflows/DOS-DJGPP.yml index 6f5595ce05..84086cd6cd 100644 --- a/.github/workflows/DOS-DJGPP.yml +++ b/.github/workflows/DOS-DJGPP.yml @@ -25,7 +25,7 @@ jobs: - name: Compile RA run: | make -f Makefile.dos -j$(getconf _NPROCESSORS_ONLN) clean - make -f Makefile.dos -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 + make -f Makefile.dos -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 info all - name: Get short SHA id: slug diff --git a/.github/workflows/GameCube.yml b/.github/workflows/GameCube.yml index 24823fcb91..75a27a8eba 100644 --- a/.github/workflows/GameCube.yml +++ b/.github/workflows/GameCube.yml @@ -25,7 +25,7 @@ jobs: - name: Compile RA run: | make -f Makefile.ngc -j$(getconf _NPROCESSORS_ONLN) clean - make -f Makefile.ngc -j$(getconf _NPROCESSORS_ONLN) EXTERNAL_LIBOGC=1 GX_PTHREAD_LEGACY=0 HAVE_STATIC_DUMMY=1 + make -f Makefile.ngc -j$(getconf _NPROCESSORS_ONLN) EXTERNAL_LIBOGC=1 GX_PTHREAD_LEGACY=0 HAVE_STATIC_DUMMY=1 info all - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" diff --git a/.github/workflows/Linux.yml b/.github/workflows/Linux.yml index 7ce4b1965e..3b1a507612 100644 --- a/.github/workflows/Linux.yml +++ b/.github/workflows/Linux.yml @@ -30,7 +30,7 @@ jobs: - name: Compile RA run: | make -j$(getconf _NPROCESSORS_ONLN) clean - make -j$(getconf _NPROCESSORS_ONLN) + make -j$(getconf _NPROCESSORS_ONLN) info all - name: Get short SHA id: slug diff --git a/.github/workflows/MSYS2.yml b/.github/workflows/MSYS2.yml index 3d0bb30415..5b2514eee9 100644 --- a/.github/workflows/MSYS2.yml +++ b/.github/workflows/MSYS2.yml @@ -59,7 +59,7 @@ jobs: run: | echo "Building RetroArch in ${{ matrix.sys }} environment" ./configure - make -j$(nproc) + make -j$(nproc) info all - name: Collect DLLs and binaries shell: msys2 {0} diff --git a/.github/workflows/Miyoo.yml b/.github/workflows/Miyoo.yml index de6018a50a..9977075dc8 100644 --- a/.github/workflows/Miyoo.yml +++ b/.github/workflows/Miyoo.yml @@ -25,7 +25,7 @@ jobs: - name: Compile RA run: | make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.miyoo clean - make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.miyoo + make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.miyoo info all - name: Get short SHA id: slug diff --git a/.github/workflows/PS2.yml b/.github/workflows/PS2.yml index 4e60d718f0..1d81d9daf4 100644 --- a/.github/workflows/PS2.yml +++ b/.github/workflows/PS2.yml @@ -30,7 +30,7 @@ jobs: - name: Compile RA run: | make -f Makefile.ps2 -j$(getconf _NPROCESSORS_ONLN) clean - make -f Makefile.ps2 -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 release + make -f Makefile.ps2 -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 info release - name: Get short SHA id: slug diff --git a/.github/workflows/PS3-PSL1GHT.yml b/.github/workflows/PS3-PSL1GHT.yml index f98b459454..5850e5e88d 100644 --- a/.github/workflows/PS3-PSL1GHT.yml +++ b/.github/workflows/PS3-PSL1GHT.yml @@ -30,7 +30,7 @@ jobs: - name: Compile RA run: | make -f Makefile.psl1ght -j$(getconf _NPROCESSORS_ONLN) clean - make -f Makefile.psl1ght -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 + make -f Makefile.psl1ght -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 info all - name: Get short SHA id: slug diff --git a/.github/workflows/PS4-ORBIS.yml b/.github/workflows/PS4-ORBIS.yml index 2296eed6d0..d382a38bc6 100644 --- a/.github/workflows/PS4-ORBIS.yml +++ b/.github/workflows/PS4-ORBIS.yml @@ -31,7 +31,7 @@ jobs: - name: Compile RA run: | export PATH=~/cli:$PATH # .net cli - make -f Makefile.orbis -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 + make -f Makefile.orbis -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 info all - name: Get short SHA id: slug diff --git a/.github/workflows/PSVita.yml b/.github/workflows/PSVita.yml index 87e5933e9e..1e26200c0f 100644 --- a/.github/workflows/PSVita.yml +++ b/.github/workflows/PSVita.yml @@ -30,7 +30,7 @@ jobs: - name: Compile RA run: | make -f Makefile.vita -j$(getconf _NPROCESSORS_ONLN) clean - make -f Makefile.vita -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 HAVE_VITAGLES=1 + make -f Makefile.vita -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 HAVE_VITAGLES=1 info all - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" diff --git a/.github/workflows/RS90.yml b/.github/workflows/RS90.yml index 34332c5ce0..8c730d9598 100644 --- a/.github/workflows/RS90.yml +++ b/.github/workflows/RS90.yml @@ -25,7 +25,7 @@ jobs: - name: Compile RA run: | make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.rs90 clean - make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.rs90 + make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.rs90 info all - name: Get short SHA id: slug diff --git a/.github/workflows/RetroFW.yml b/.github/workflows/RetroFW.yml index cb57960e1d..f7ddae3678 100644 --- a/.github/workflows/RetroFW.yml +++ b/.github/workflows/RetroFW.yml @@ -25,7 +25,7 @@ jobs: - name: Compile RA run: | make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.retrofw clean - make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.retrofw + make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.retrofw info all - name: Get short SHA id: slug diff --git a/.github/workflows/Wii.yml b/.github/workflows/Wii.yml index f5f1e69d14..f56b0728b4 100644 --- a/.github/workflows/Wii.yml +++ b/.github/workflows/Wii.yml @@ -30,7 +30,7 @@ jobs: - name: Compile RA run: | make -f Makefile.wii -j$(getconf _NPROCESSORS_ONLN) clean - make -f Makefile.wii -j$(getconf _NPROCESSORS_ONLN) EXTERNAL_LIBOGC=1 GX_PTHREAD_LEGACY=0 HAVE_STATIC_DUMMY=1 + make -f Makefile.wii -j$(getconf _NPROCESSORS_ONLN) EXTERNAL_LIBOGC=1 GX_PTHREAD_LEGACY=0 HAVE_STATIC_DUMMY=1 info all - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" diff --git a/.github/workflows/WiiU.yml b/.github/workflows/WiiU.yml index 2a53051107..51650e4406 100644 --- a/.github/workflows/WiiU.yml +++ b/.github/workflows/WiiU.yml @@ -30,7 +30,7 @@ jobs: - name: Compile RA run: | make -f Makefile.wiiu -j$(getconf _NPROCESSORS_ONLN) clean - make -f Makefile.wiiu -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 + make -f Makefile.wiiu -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 info all - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" diff --git a/.github/workflows/retroarch.yml b/.github/workflows/retroarch.yml index 8847aa35e8..1ce2da4004 100644 --- a/.github/workflows/retroarch.yml +++ b/.github/workflows/retroarch.yml @@ -33,4 +33,4 @@ jobs: - name: Build Debug run: | make clean # making sure we don't have leftovers from previous build - make DEBUG=1 GL_DEBUG=1 C89_BUILD=1 + make DEBUG=1 GL_DEBUG=1 C89_BUILD=1 info all diff --git a/.github/workflows/webOS.yml b/.github/workflows/webOS.yml index 8eb8697949..adca736991 100644 --- a/.github/workflows/webOS.yml +++ b/.github/workflows/webOS.yml @@ -52,4 +52,4 @@ jobs: - name: Compile RA run: | . /tmp/arm-webos-linux-gnueabi_sdk-buildroot/environment-setup - make -f Makefile.webos ADD_SDL2_LIB=1 -j$(getconf _NPROCESSORS_ONLN) + make -f Makefile.webos ADD_SDL2_LIB=1 -j$(getconf _NPROCESSORS_ONLN) info all From 05f94af415cd94b84e76dbcbb7101f7c434bf9a2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 30 Apr 2025 00:16:22 +0000 Subject: [PATCH 024/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 6cdaad3641..552c906745 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -3514,6 +3514,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, "Controls del port %u" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_USER_BINDS, + "Canvia com les entrades del RetroPad virtual són assignades a les entrades del dispositiu d'entrada físic per aquest port virtual." + ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_USER_REMAPS, "Canvia les assignacions d'entrada específiques pel nucli." @@ -3604,6 +3608,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_SCROLL, "Intercanvia els botons de desplaçament dels menús" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_INPUT_SWAP_SCROLL, + "Intercanvia els botons de desplaçament. En desactivar aquesta opció, els botons L/R mouran 10 elements i els botons L2/R2 aniran en ordre alfabètic." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_ALL_USERS_CONTROL_MENU, "Tots els usuaris controlen el menú" @@ -4096,6 +4104,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE, "Tipus d’analògic a digital" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_ADC_TYPE, + "Fes servir un joystick analògic específic per l'entrada de la creueta digital. 'Forçat' ignoren les entrades analògiques natives del nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX, "Índex del dispositiu" @@ -10339,6 +10351,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME, "Color del tema" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RGUI_MENU_COLOR_THEME, + "Selecciona un tema de colors diferent. 'Personalitzat' permet fer servir fitxers d'ajustament de temes." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RGUI_MENU_THEME_PRESET, "Tema predefinit predeterminat" From 6235f3138b0459d7ce198dcf2864621971de8dfd Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Wed, 30 Apr 2025 12:32:54 -0700 Subject: [PATCH 025/175] Add command.h commands for saving/loading sram --- command.c | 23 +++++++++++++++++++++++ command.h | 6 ++++++ retroarch.c | 3 +++ 3 files changed, 32 insertions(+) diff --git a/command.c b/command.c index 009b1867b8..e778b736cf 100644 --- a/command.c +++ b/command.c @@ -809,6 +809,29 @@ bool command_play_replay_slot(command_t *cmd, const char *arg) #endif } +bool command_save_savefiles(command_t *cmd, const char* arg) +{ + char reply[4]; + size_t _len = strlcpy(reply, "OK", sizeof(reply)); + reply[ _len] = '\n'; + reply[++_len] = '\0'; + /* In the future, this should probably send each saved file path + to the replier. */ + command_event(CMD_EVENT_SAVE_FILES, NULL); + cmd->replier(cmd, reply, _len); + return true; +} + +bool command_load_savefiles(command_t *cmd, const char* arg) +{ + char reply[4]; + size_t _len = strlcpy(reply, "OK", sizeof(reply)); + reply[ _len] = '\n'; + reply[++_len] = '\0'; + command_event(CMD_EVENT_LOAD_FILES, NULL); + cmd->replier(cmd, reply, _len); + return true; +} #if defined(HAVE_CHEEVOS) bool command_read_ram(command_t *cmd, const char *arg) diff --git a/command.h b/command.h index dd08854284..8fa57ec7b3 100644 --- a/command.h +++ b/command.h @@ -258,6 +258,7 @@ enum event_command CMD_EVENT_AI_SERVICE_CALL, /* Misc. */ CMD_EVENT_SAVE_FILES, + CMD_EVENT_LOAD_FILES, CMD_EVENT_CONTROLLER_INIT, CMD_EVENT_DISCORD_INIT, CMD_EVENT_PRESENCE_UPDATE, @@ -420,6 +421,8 @@ bool command_get_config_param(command_t *cmd, const char* arg); bool command_show_osd_msg(command_t *cmd, const char* arg); bool command_load_state_slot(command_t *cmd, const char* arg); bool command_play_replay_slot(command_t *cmd, const char* arg); +bool command_save_savefiles(command_t *cmd, const char* arg); +bool command_load_savefiles(command_t *cmd, const char* arg); #ifdef HAVE_CHEEVOS bool command_read_ram(command_t *cmd, const char *arg); bool command_write_ram(command_t *cmd, const char *arg); @@ -446,6 +449,9 @@ static const struct cmd_action_map action_map[] = { { "LOAD_STATE_SLOT",command_load_state_slot, ""}, { "PLAY_REPLAY_SLOT",command_play_replay_slot, ""}, + + { "SAVE_FILES", command_save_savefiles, "No argument"}, + { "LOAD_FILES", command_load_savefiles, "No argument"}, }; static const struct cmd_map map[] = { diff --git a/retroarch.c b/retroarch.c index 1577940750..1f6f602fb2 100644 --- a/retroarch.c +++ b/retroarch.c @@ -3020,6 +3020,9 @@ bool command_event(enum event_command cmd, void *data) switch (cmd) { + case CMD_EVENT_LOAD_FILES: + event_load_save_files(runloop_st->flags & RUNLOOP_FLAG_IS_SRAM_LOAD_DISABLED); + break; case CMD_EVENT_SAVE_FILES: event_save_files( runloop_st->flags & RUNLOOP_FLAG_USE_SRAM, From fb94043d48f6f7f7ed337fcc435a313c0e1743cf Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Wed, 30 Apr 2025 14:44:56 -0700 Subject: [PATCH 026/175] Report errors from save/load, disable loads under hard cheevos --- command.c | 14 ++++++++++---- retroarch.c | 17 ++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/command.c b/command.c index e778b736cf..be1a4231dc 100644 --- a/command.c +++ b/command.c @@ -812,25 +812,31 @@ bool command_play_replay_slot(command_t *cmd, const char *arg) bool command_save_savefiles(command_t *cmd, const char* arg) { char reply[4]; + bool ret; size_t _len = strlcpy(reply, "OK", sizeof(reply)); reply[ _len] = '\n'; reply[++_len] = '\0'; /* In the future, this should probably send each saved file path to the replier. */ - command_event(CMD_EVENT_SAVE_FILES, NULL); + ret = command_event(CMD_EVENT_SAVE_FILES, NULL); + if (!ret) + strlcpy(reply, "NO", sizeof(reply)); cmd->replier(cmd, reply, _len); - return true; + return ret; } bool command_load_savefiles(command_t *cmd, const char* arg) { char reply[4]; + bool ret; size_t _len = strlcpy(reply, "OK", sizeof(reply)); reply[ _len] = '\n'; reply[++_len] = '\0'; - command_event(CMD_EVENT_LOAD_FILES, NULL); + ret = command_event(CMD_EVENT_LOAD_FILES, NULL); + if (!ret) + strlcpy(reply, "NO", sizeof(reply)); cmd->replier(cmd, reply, _len); - return true; + return ret; } #if defined(HAVE_CHEEVOS) diff --git a/retroarch.c b/retroarch.c index 1f6f602fb2..1a3644c87d 100644 --- a/retroarch.c +++ b/retroarch.c @@ -3021,10 +3021,18 @@ bool command_event(enum event_command cmd, void *data) switch (cmd) { case CMD_EVENT_LOAD_FILES: - event_load_save_files(runloop_st->flags & RUNLOOP_FLAG_IS_SRAM_LOAD_DISABLED); - break; +#ifdef HAVE_CHEEVOS + if (rcheevos_hardcore_active()) + { + const char *_msg = msg_hash_to_str(MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE); + runloop_msg_queue_push(_msg, strlen(_msg), 0, 180, true, NULL, + MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_WARNING); + return false; + } +#endif + return event_load_save_files(runloop_st->flags & RUNLOOP_FLAG_IS_SRAM_LOAD_DISABLED); case CMD_EVENT_SAVE_FILES: - event_save_files( + return event_save_files( runloop_st->flags & RUNLOOP_FLAG_USE_SRAM, #if defined(HAVE_ZLIB) settings->bools.save_file_compression, @@ -3036,8 +3044,7 @@ bool command_event(enum event_command cmd, void *data) #else NULL #endif - ); - break; + ); case CMD_EVENT_OVERLAY_UNLOAD: #ifdef HAVE_OVERLAY input_overlay_unload(); From fe5defea7125ed562d4dd8f91b4889a7257729ba Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Wed, 30 Apr 2025 15:05:39 -0700 Subject: [PATCH 027/175] add new error message for sram load during hardcore cheevo --- intl/msg_hash_us.h | 4 ++++ msg_hash.h | 1 + 2 files changed, 5 insertions(+) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index a8a92051b6..dc0713421a 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -15646,6 +15646,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "You must pause or disable Achievements Hardcore Mode to load states." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "You must pause or disable Achievements Hardcore Mode to load srm saves." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "A save state was loaded. Achievements Hardcore Mode disabled for the current session." diff --git a/msg_hash.h b/msg_hash.h index 0aea04997f..732f8d5f82 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -4117,6 +4117,7 @@ enum msg_hash_enums MSG_CHEAT_SEARCH_DELETE_MATCH_SUCCESS, MSG_CHEEVOS_LOGGED_IN_AS_USER, MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, MSG_CHEEVOS_HARDCORE_MODE_DISABLED, MSG_CHEEVOS_HARDCORE_MODE_DISABLED_CHEAT, MSG_CHEEVOS_HARDCORE_MODE_CHANGED_BY_HOST, From c968c1a51d7269b0962f8954e4140d9aec981212 Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Thu, 10 Apr 2025 15:48:16 +0000 Subject: [PATCH 028/175] Use size_t for new_selection as done everywhere else --- menu/drivers/ozone.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index 32940a3949..61e3382806 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -8004,8 +8004,7 @@ static enum menu_action ozone_parse_menu_entry_action( enum menu_action action) { uintptr_t tag; - int new_selection; - size_t selection; + size_t new_selection, selection; size_t selection_total; bool is_current_entry_settings = false; struct menu_state *menu_st = menu_state_get_ptr(); @@ -8282,12 +8281,12 @@ static enum menu_action ozone_parse_menu_entry_action( ? ozone_get_onscreen_category_selection(ozone) : ozone->categories_selection_ptr; - if ((new_selection = (int)selection - 1) < 0) - new_selection = horizontal_list_size + ozone->system_tab_end; - - if ( !menu_navigation_wraparound_enable - && selection == 0) - new_selection = 0; + if (selection > 0) + new_selection = selection - 1; + else if (menu_navigation_wraparound_enable) + new_selection = horizontal_list_size + ozone->system_tab_end; + else + new_selection = selection; if (new_selection != selection) { @@ -8521,10 +8520,15 @@ static enum menu_action ozone_parse_menu_entry_action( ? ozone_get_onscreen_category_selection(ozone) : ozone->categories_selection_ptr; - new_selection = (int)tab_selection; + new_selection = tab_selection; if (menu_st->scroll.mode == MENU_SCROLL_PAGE) - new_selection = (int)(tab_selection - 10); + { + if (tab_selection >= (size_t)ozone->system_tab_end + 11) + new_selection = tab_selection - 10; + else + new_selection = ozone->system_tab_end + 1; + } else if (ozone->sidebar_index_size) { /* Alphabetical scroll */ @@ -8540,8 +8544,7 @@ static enum menu_action ozone_parse_menu_entry_action( if (tab_selection < (size_t)(ozone->system_tab_end + 1)) new_selection = 0; - else if (tab_selection > ozone->system_tab_end - new_selection - || new_selection < 0) + else if (tab_selection > ozone->system_tab_end - new_selection) new_selection = ozone->system_tab_end + 1; if (new_selection != tab_selection) From baee906ef35b99283f9a1a060a2ce5ac86159b63 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 May 2025 00:17:50 +0000 Subject: [PATCH 029/175] Fetch translations from Crowdin --- intl/msg_hash_sv.h | 104 +++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 4 +- 2 files changed, 106 insertions(+), 2 deletions(-) diff --git a/intl/msg_hash_sv.h b/intl/msg_hash_sv.h index 0ed2cd79cc..3486f05f15 100644 --- a/intl/msg_hash_sv.h +++ b/intl/msg_hash_sv.h @@ -6930,6 +6930,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_START_AS_SPECTATOR, "Starta netplay i åskådarläge." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_FADE_CHAT, + "Tona ut chatt" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_FADE_CHAT, + "Tona ut chattmeddelanden över tid." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_CHAT_COLOR_NAME, "Chattfärg (Nicknamn)" @@ -6982,6 +6990,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, "Det intervall av bildrutor med inmatningslatens som kan användas av netplay för att dölja nätverkslatens.\nOm det är inställt kommer netplay att justera antalet bildrutor med inmatningslatens dynamiskt för att balansera CPU-tid, inmatningslatens och nätverkslatens. Detta minskar jitter och gör netplay mindre CPU-intensivt, men till priset av oförutsägbar inmatningsfördröjning." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_DIGITAL, + "Delning av digital inmatning" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_REQUEST_DEVICE_I, "Begär enhet %u" @@ -7978,6 +7990,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_OVERWRITE, "Skriv över befintlig spellista" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MANUAL_CONTENT_SCAN_OVERWRITE, + "När denna funktion är aktiverad raderas alla befintliga spellistor innan innehållet söks igenom. När funktionen är inaktiverad behålls befintliga spellistor och endast innehåll som saknas i spellistan läggs till." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_VALIDATE_ENTRIES, "Validera befintliga poster" @@ -8848,6 +8864,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_REPEAT_COUNT, "Antal iterationer" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_REPEAT_COUNT, + "Antal gånger fusket kommer att tillämpas. Använd tillsammans med de andra två alternativen för ”Iteration” för att påverka stora minnesområden." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_VALUE, "Rumble-värde" @@ -9136,10 +9156,26 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, "Spara en åsidosatt konfigurationsfil som kommer att gälla för allt innehåll som laddas med denna kärna. Kommer att ha företräde framför huvudkonfigurationen." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE, + "Ta bort den åsidosättande konfigurationsfilen som kommer att gälla för allt innehåll som läses in med denna kärna." + ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, "Spara en överordnad konfigurationsfil som kommer att gälla för allt innehåll som laddas från samma katalog som den aktuella filen. Kommer att ha företräde framför huvudkonfigurationen." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + "Ta bort den åsidosättande konfigurationsfilen som gäller för allt innehåll som läses in från samma katalog som den aktuella filen." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, + "Åsidosättning för sparade spel" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, + "Spara en åsidosättande konfigurationsfil som endast gäller för det aktuella innehållet. Har företräde framför huvudkonfigurationen." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERRIDE_UNLOAD, "Läs ur åsidosättning" @@ -9444,6 +9480,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_RUNTIME_PER_CORE, "Per kärna" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_RUNTIME_AGGREGATE, + "Aggregera" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED, "Laddad" @@ -10141,6 +10181,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, "Aktivera horisontell animering för menyn. Detta kommer att påverka prestandan." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_XMB_ANIMATION_MOVE_UP_DOWN, + "Animationen som aktiveras när du flyttar uppåt eller nedåt." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_XMB_ANIMATION_OPENING_MAIN_MENU, + "Animationen som aktiveras när ett undermeny öppnas." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_FONT, "Typsnitt" @@ -10185,6 +10233,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE, "Skuggeffekter" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_SHADOWS_ENABLE, + "Rita skuggor för ikoner, miniatyrbilder och bokstäver. Detta kommer att påverka prestandan något." + ) MSG_HASH( MENU_ENUM_SUBLABEL_XMB_RIBBON_ENABLE, "Välj en animerad bakgrundseffekt. Kan vara GPU-intensiv beroende på effekten. Om prestandan är otillfredsställande kan du antingen stänga av den eller återgå till en enklare effekt." @@ -10201,6 +10253,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_XMB_THUMBNAIL_SCALE_FACTOR, "Miniatyrskalfaktor" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_XMB_SHOW_TITLE_HEADER, + "Visa titelrubrik" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_XMB_TITLE_MARGIN, "Titelmarginal" @@ -10363,6 +10419,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_OZONE, "Sekundär miniatyrbild" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS_OZONE, + "Ersätt panelen med innehållsmetadata med en annan miniatyrbild." + ) MSG_HASH( MENU_ENUM_SUBLABEL_OZONE_SCROLL_CONTENT_METADATA, "När den är aktiverad kommer varje metadataobjekt som visas i spellistornas högra sidofält (associerad kärna, speltid) att uppta en enda rad; strängar som överskrider sidofältets bredd kommer att visas som rullande tickertext. När den är inaktiverad visas varje innehållsmetadata statiskt, omslaget så att det upptar så många rader som krävs." @@ -11237,6 +11297,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PORT_DEVICE_NAME, "Port %d Enhetsnamn: %s (#%d)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PORT_DEVICE_INFO, + "Enhetens skärmnamn: %s\nEnhetens konfigurationsnamn: %s\nEnhets-VID/PID: %d/%d" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_SETTINGS, "Fuskinställningar" @@ -12410,6 +12474,14 @@ MSG_HASH( MSG_FRAMES, "Bildrutor" ) +MSG_HASH( + MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT, + "Spelspecifika kärnalternativ hittades i" + ) +MSG_HASH( + MSG_FOLDER_SPECIFIC_CORE_OPTIONS_FOUND_AT, + "Mappspecifika kärnalternativ hittades i" + ) MSG_HASH( MSG_GOT_INVALID_DISK_INDEX, "Fick ogiltigt skivindex." @@ -12494,6 +12566,10 @@ MSG_HASH( MSG_LOADED_STATE_FROM_SLOT, "Läste in tillstånd från plats #%d." ) +MSG_HASH( + MSG_LOADED_STATE_FROM_SLOT_AUTO, + "Läste in tillstånd från plats #-1 (Auto)." + ) MSG_HASH( MSG_LOADING, "Läser in" @@ -12582,6 +12658,10 @@ MSG_HASH( MSG_REDIRECTING_SAVESTATE_TO, "Omdirigerar sparad status till" ) +MSG_HASH( + MSG_REMAP_FILE_RESET, + "Alla alternativ för inmatningsommappningar återställda till standard." + ) MSG_HASH( MSG_REMOVED_DISK_FROM_TRAY, "Tog bort skiva från släde." @@ -12646,10 +12726,18 @@ MSG_HASH( MSG_FAST_FORWARD, "Snabbspolning." ) +MSG_HASH( + MSG_SKIPPING_SRAM_LOAD, + "Hoppar över SRAM-inläsning." + ) MSG_HASH( MSG_SRAM_WILL_NOT_BE_SAVED, "SRAM kommer inte att sparas." ) +MSG_HASH( + MSG_BLOCKING_SRAM_OVERWRITE, + "Blockerar SRAM-överskrivning" + ) MSG_HASH( MSG_STARTING_MOVIE_PLAYBACK, "Startar uppspelning av film." @@ -12758,6 +12846,14 @@ MSG_HASH( MSG_VERSION_OF_LIBRETRO_API, "Version av libretro API" ) +MSG_HASH( + MSG_VIRTUAL_DISK_TRAY_EJECT, + "Misslyckades med att mata ut virtuell skivsläde." + ) +MSG_HASH( + MSG_VIRTUAL_DISK_TRAY_CLOSE, + "Misslyckades med att stänga virtuell skivsläde." + ) MSG_HASH( MSG_AUTOLOADING_SAVESTATE_FROM, "Läs automatiskt in sparade tillstånd från" @@ -13110,6 +13206,10 @@ MSG_HASH( MSG_ERROR_REMOVING_SHADER_PRESET, "Fel vid borttagning av shader-förval." ) +MSG_HASH( + MSG_MANUAL_CONTENT_SCAN_INVALID_CONFIG, + "Ogiltig konfiguration för manuell genomsökning." + ) MSG_HASH( MSG_MANUAL_CONTENT_SCAN_INVALID_CONTENT, "Inget giltigt innehåll hittades." @@ -13316,6 +13416,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_WIFI_DISCONNECT, "Koppla från" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_OVERSCAN_CORRECTION_BOTTOM, + "Justera beskärning av överskanning av skärmen genom att minska bildstorleken med ett angivet antal skanlinjer (tagen från skärmens nedre kant). Kan orsaka skalningsartefakter." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CPU_PERFPOWER, "CPU-prestanda och ström" diff --git a/intl/progress.h b/intl/progress.h index b2f70f4106..2d879dedd1 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -131,8 +131,8 @@ #define LANGUAGE_PROGRESS_SERBIAN_LATIN_APPROVED 0 /* Swedish */ -#define LANGUAGE_PROGRESS_SWEDISH_TRANSLATED 86 -#define LANGUAGE_PROGRESS_SWEDISH_APPROVED 49 +#define LANGUAGE_PROGRESS_SWEDISH_TRANSLATED 87 +#define LANGUAGE_PROGRESS_SWEDISH_APPROVED 50 /* Turkish */ #define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 100 From 14c78b6c3231df4ce9049e5b035baf864bffd0df Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 2 May 2025 00:15:30 +0000 Subject: [PATCH 030/175] Fetch translations from Crowdin --- intl/msg_hash_ar.h | 8 +++ intl/msg_hash_ca.h | 160 +++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 26 ++++---- 3 files changed, 181 insertions(+), 13 deletions(-) diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index 56b5c1c85d..b64d480f39 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -1424,6 +1424,14 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION, "نواة ليبرترو. اختيار هذا سيربط هذا النواة باللعبة." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_CORE, + "نواة ليبرترو. حدد هذا الملف لتحميل RetroArch هذا النوع." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_DIRECTORY, + "الدليل. حدده لفتح هذا الدليل." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS, "خنق الإطار" diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 552c906745..80facf0b81 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2537,14 +2537,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER, "Escalat d'enter" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, + "Limita l'escalat del vídeo a múltiples enters. La mida base dependrà de la geometria del sistema i de la relació d'aspecte." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER_AXIS, "Eix d'escala entera" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER_AXIS, + "Escala l'alçada i l'amplada. Els escalats irregulars s'aplicaran només a les imatges d'alta resolució." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER_SCALING, "Escalat per nombre enter" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER_SCALING, + "Augmenta o disminueix l'escala del següent valor enter. 'Intel·ligent' disminueix l'escala si la imatge queda retallada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER_SCALING_UNDERSCALE, "Reduïr escala" @@ -3526,6 +3538,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ANDROID_INPUT_DISCONNECT_WORKAROUND, "Solució per les desconnexions d’Android" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ANDROID_INPUT_DISCONNECT_WORKAROUND, + "Solució temporal per la desconnexió intermitent dels controladors. Evita que hi hagi 2 jugadors amb controladors idèntics." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUIT_PRESS_TWICE, "Confirma la sortida" @@ -3639,6 +3655,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_DEVICE_MERGE, "Fusionar tipus de dispositiu per a tecles ràpides" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_HOTKEY_DEVICE_MERGE, + "Bloqueja totes les dreceres de teclat dels teclats i controladors si qualsevol dels dispositius té un botó o tecla per activar les dreceres de teclat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, "Commuta el menú (combinació de botons)" @@ -4152,6 +4172,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, "Configura tots els controls" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_BIND_ALL, + "Assigna totes les direccions i botons, un després de l'altre, en l'ordre en que apareixen en aquest menú." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, "Restableix els controls per defecte" @@ -4164,6 +4188,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, "Desa el perfil de controlador" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_SAVE_AUTOCONFIG, + "Desa un fitxer d'autoconfiguració que s'aplicarà automàticament cada cop que es detecti aquest controlador." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX, "Índex del ratolí" @@ -4572,6 +4600,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE, "No sobreescriguis la SaveRAM en carregar un desat ràpid" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BLOCK_SRAM_OVERWRITE, + "Evita que se sobreescrigui la memòria SaveRAM en carregar un desat ràpid. Pot provocar errors en alguns jocs." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, "Interval entre desats automàtics de la SaveRAM" @@ -4584,6 +4616,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REPLAY_CHECKPOINT_INTERVAL, "Interval de punts de control de repetició" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REPLAY_CHECKPOINT_INTERVAL, + "Marca automàticament i a intervals regulars (en segons) l'estat del joc a mesura que s'enregistra una repetició." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX, "Augmenta automàticament l'índex de l'estat desat" @@ -4848,6 +4884,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REWIND_ENABLE, "Suporta rebobinat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_ENABLE, + "Torna a un punt anterior de la teva partida més recent. Afecta molt al rendiment de la partida." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY, "Rebobinar fotogrames" @@ -4864,6 +4904,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE_STEP, "Mida de la memòria intermèdia dels passos de rebobinat (MB)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE_STEP, + "Cada vegada que s'augmenta o disminueix el valor de la mida de la memòria del rebobinat, canviarà en funció d'aquesta quantitat." + ) /* Settings > Frame Throttle > Frame Time Counter */ @@ -5243,6 +5287,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_POINTER_ENABLE, "Activa la superposició per lightgun, ratolí i punter" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_POINTER_ENABLE, + "Fes servir tots els tocs tàctils que no cliquin els controls per crear accions d'entrada dels dispositius d'entrada del nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_LIGHTGUN_SETTINGS, "Superposa la pistola de llum" @@ -5360,6 +5408,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_MOUSE_DTAP_TO_DRAG, "Doble toc per arrossegar" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_MOUSE_DTAP_TO_DRAG, + "Fes doble clic a la pantalla per començar a mantenir clicat un botó amb el segon clic. Afegirà un retard als clics del ratolí." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_MOUSE_DTAP_MSEC, "Llindar de la doble pulsació (ms)" @@ -5807,6 +5859,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NAVIGATION_WRAPAROUND, "Navegació en bucle" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND, + "Quan s'arribi al final horitzontal o vertical d'una llista, es tornarà a l'altre extrem." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO, "Posa en pausa el contingut quan el menú estigui actiu" @@ -5835,6 +5891,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_TIMEOUT, "Temps d'espera de l'estalvi de pantalla del menú" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SCREENSAVER_TIMEOUT, + "Si un menú està actiu, es mostrarà un estalvi de pantalla si hi ha un temps d'inactivitat especificat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_ANIMATION, "Animació de l'estalvi de pantalla del menú" @@ -6164,6 +6224,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Mostra les pestanyes de les llistes de reproducció" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, + "Mostra les seccions de les llistes de reproducció. No afecta RGUI. Cal activar la barra de navegació a GLUI (És necessari reiniciar a Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Mostra «Explora»" @@ -6678,6 +6742,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, "Imatge de fons" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_WALLPAPER, + "Escull una imatge com a fons del menú. Les imatges manuals i dinàmiques tindran preferència sobre el tema de colors." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER_OPACITY, "Opacitat del fons" @@ -6734,6 +6802,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_SMOOTH, "Suavitza el textos en moviment" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_TICKER_SMOOTH, + "Mostra el text dels menús, que siguin molt llargs, desplaçant-lo amb una animació suau. Afecta lleugerament al rendiment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_REMEMBER_SELECTION, "Recordar selecció al canviar entre seccions" @@ -7082,6 +7154,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_MITM_SERVER, "Ubicació del servidor intermediari" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_MITM_SERVER, + "Escull un servidor intermediari concret. Les localitzacions més properes acostumen a tenir una menor latència." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_CUSTOM_MITM_SERVER, "Direcció del servidor intermediari personalitzat" @@ -7282,6 +7358,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETWORK_ON_DEMAND_THUMBNAILS, "Descàrrega les miniatures sota demanda" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETWORK_ON_DEMAND_THUMBNAILS, + "Descarrega automàticament les miniatures que falten quan es navega per les llistes de reproducció. Afecta molt al rendiment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS, "Configuració de l'actualitzador" @@ -7376,6 +7456,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_USE_OLD_FORMAT, "Desa les llistes de reproducció en el format antic" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_USE_OLD_FORMAT, + "Desa les llistes de reproducció en el format de text simple. Si es desactiva aquesta opció, les llistes faran servir el format JSON." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_COMPRESSION, "Comprimeix les llistes de reproducció" @@ -7392,6 +7476,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_HISTORY_ICONS, "Mostra icones específiques dels continguts a l'historial i als preferits" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_HISTORY_ICONS, + "Mostra una icona específica per cada element de les llistes de reproducció de l'historial i preferits. Afecta el rendiment de forma variable." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_CORE, "Nucli:" @@ -7625,6 +7713,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_DISCORD_ALLOW, "Presència enriquida de Discord" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DISCORD_ALLOW, + "Permet que l'app Discord mostri més informació sobre el contingut que s'està executant. \nNomés funcionarà amb el client d'escriptori de Discord." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW, "Permet la localització" @@ -8770,10 +8862,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE, "Desa les opcions del directori de contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE, + "Desa les opcions del nucli que s'aplicaran a tot el contingut carregat de la mateixa carpeta que el fitxer actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE, "Elimina les opcions del directori de continguts" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE, + "Esborra les opcions del nucli que s'aplicaran a tots els continguts que es carreguin des de la mateixa carpeta que el fitxer actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_OPTION_OVERRIDE_INFO, "Fitxer d'opcions actiu" @@ -8866,10 +8966,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CONTENT_DIR, "Desa la personalització a la carpeta de fitxers" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_CONTENT_DIR, + "Desa un fitxer d'assignacions que s'aplicaran a tot el contingut carregat de la mateixa carpeta que el fitxer actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CONTENT_DIR, "Elimina el fitxer d'assignació de les carpetes de contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_REMOVE_CONTENT_DIR, + "Elimina un fitxer d'assignacions que s'aplicaran a tot el contingut carregat de la mateixa carpeta que el fitxer actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, "Desa el fitxer de mapeig del nucli" @@ -9172,6 +9280,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_REPEAT_ADD_TO_ADDRESS, "Augmenta la direcció en cada iteració" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_REPEAT_ADD_TO_ADDRESS, + "Després de cada iteració, s'augmentarà l'adreça de memòria amb aquest valor multiplicat per la mida de la cerca de memòria." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_REPEAT_ADD_TO_VALUE, "Augmentar el valor en cada iteració" @@ -9251,6 +9363,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_DISK_INDEX, "Índex del disc actual" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DISK_INDEX, + "Escull el disc d'una llista de disc disponibles. El disc es carregarà en clicar 'Insereix disc'." + ) /* Quick Menu > Shaders */ @@ -9387,6 +9503,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_PARENT, "Desa com a predefinició del directori de contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_PARENT, + "Desa la configuració actual dels shaders com a predeterminada per tots els fitxers a la carpeta de continguts actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME, "Desa com a predefinició del joc" @@ -9476,6 +9596,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE, "Elimina les personalitzacions del nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE, + "Esborra el fitxer de configuracions personalitzades que s'aplicarà a tots els continguts que es carreguin amb aquest nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, "Desa la personalització de directori de continguts" @@ -10963,10 +11087,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OZONE_TRUNCATE_PLAYLIST_NAME, "Parteix els noms de la llista de reproducció (Es requereix reiniciar)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OZONE_TRUNCATE_PLAYLIST_NAME, + "Elimina els noms dels fabricants a les llistes de reproducció. Per exemple, 'Sony - PlayStation' passa a ser 'PlayStation'." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME, "Endreça les llistes de reproducció després de truncar els noms (Cal reiniciar)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME, + "Les llistes de reproducció s'endrecen per ordre alfabètic eliminant la part del fabricant dels noms." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_OZONE, "Segona miniatura" @@ -11072,6 +11204,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION, "Optimitza la disposició en mode horitzontal" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION, + "Ajusta automàticament la posició del menú perquè s'adapti a la pantalla amb disposició horitzontal." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_SHOW_NAV_BAR, "Mostra la barra de navegació" @@ -11124,6 +11260,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_THUMBNAILS_MATERIALUI, "Miniatura principal" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_THUMBNAILS_MATERIALUI, + "Miniatura principal relacionada amb cada element de les llistes de reproducció. Acostuma a ser la icona del contingut." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_MATERIALUI, "Segona miniatura" @@ -12541,10 +12681,18 @@ MSG_HASH( MSG_NETPLAY_OUT_OF_DATE, "Un client del joc en xarxa fa servir una versió antiga de RetroArch. No es pot connectar amb el client." ) +MSG_HASH( + MSG_NETPLAY_DIFFERENT_VERSIONS, + "AVÍS: Un client del joc en xarxa està fent servir una versió diferent de RetroArch. En cas de trobar errors, es recomana fer servir la mateixa versió." + ) MSG_HASH( MSG_NETPLAY_DIFFERENT_CORES, "Un client del joc en xarxa està fent servir un nucli diferent. No es pot connectar amb el client." ) +MSG_HASH( + MSG_NETPLAY_DIFFERENT_CORE_VERSIONS, + "AVÍS: Un client del joc en xarxa està fent servir una versió diferent del nucli. En cas que es trobin errors, es recomana fer servir la mateixa versió." + ) MSG_HASH( MSG_NETPLAY_ENDIAN_DEPENDENT, "Aquest nucli no suporta el joc en xarxa entre aquestes plataformes" @@ -13358,6 +13506,10 @@ MSG_HASH( MSG_MOVIE_FILE_IS_NOT_A_VALID_REPLAY_FILE, "El fitxer de repetició d'entrada no és un fitxer vàlid." ) +MSG_HASH( + MSG_MOVIE_FORMAT_DIFFERENT_SERIALIZER_VERSION, + "El format de repetició d'entrada sembla tenir una versió diferent. Probablement serà un error." + ) MSG_HASH( MSG_MOVIE_PLAYBACK_ENDED, "La reproducció s'ha acabat." @@ -13710,6 +13862,10 @@ MSG_HASH( MSG_VERSION_OF_LIBRETRO_API, "Versió de la API de Libretro" ) +MSG_HASH( + MSG_VIEWPORT_SIZE_CALCULATION_FAILED, + "Error en calcular la mida de l'àrea de visualització! Se seguirà calculant amb les dades en brut. És possible que hi hagi errors..." + ) MSG_HASH( MSG_VIRTUAL_DISK_TRAY_EJECT, "Error en obrir la safata de discs virtual." @@ -14835,6 +14991,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_VMOUSE_TRACKBALL, "Mode 'Trackball' del ratolí virtual" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TOUCH_VMOUSE_TRACKBALL, + "Activa aquesta opció juntament amb 'com ratolí' per fer servir la pantalla tàctil com si fos un ratolí de bola, afegint inèrcia al cursor." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_VMOUSE_GESTURE, "Empra els gestos pel ratolí virtual" diff --git a/intl/progress.h b/intl/progress.h index 2d879dedd1..037e827502 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 77 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 80 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -31,7 +31,7 @@ #define LANGUAGE_PROGRESS_DANISH_APPROVED 0 /* German */ -#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_GERMAN_APPROVED 13 /* Greek */ @@ -47,7 +47,7 @@ #define LANGUAGE_PROGRESS_ESPERANTO_APPROVED 0 /* Spanish */ -#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 99 #define LANGUAGE_PROGRESS_SPANISH_APPROVED 91 /* Persian */ @@ -59,11 +59,11 @@ #define LANGUAGE_PROGRESS_FINNISH_APPROVED 45 /* French */ -#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 100 -#define LANGUAGE_PROGRESS_FRENCH_APPROVED 100 +#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_FRENCH_APPROVED 99 /* Galician */ -#define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_GALICIAN_APPROVED 0 /* Hebrew */ @@ -75,7 +75,7 @@ #define LANGUAGE_PROGRESS_CROATIAN_APPROVED 0 /* Hungarian */ -#define LANGUAGE_PROGRESS_HUNGARIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_HUNGARIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_HUNGARIAN_APPROVED 0 /* Indonesian */ @@ -83,15 +83,15 @@ #define LANGUAGE_PROGRESS_INDONESIAN_APPROVED 0 /* Italian */ -#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_ITALIAN_APPROVED 0 /* Japanese */ -#define LANGUAGE_PROGRESS_JAPANESE_TRANSLATED 95 +#define LANGUAGE_PROGRESS_JAPANESE_TRANSLATED 94 #define LANGUAGE_PROGRESS_JAPANESE_APPROVED 0 /* Korean */ -#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_KOREAN_APPROVED 0 /* Dutch */ @@ -135,15 +135,15 @@ #define LANGUAGE_PROGRESS_SWEDISH_APPROVED 50 /* Turkish */ -#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 100 -#define LANGUAGE_PROGRESS_TURKISH_APPROVED 100 +#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_TURKISH_APPROVED 99 /* Tatar */ #define LANGUAGE_PROGRESS_TATAR_TRANSLATED 0 #define LANGUAGE_PROGRESS_TATAR_APPROVED 0 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ From 6bfb7862e7bb090b14d09b53b8ef8a820814bff5 Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Fri, 2 May 2025 17:11:04 +0000 Subject: [PATCH 031/175] Make -ffast-math exclusive to sinc_resampler.c -ffast-math was added in ff14092d8d0 with a comment that it "helps SINC resampler to auto-vectorize". The flag is an alias for "-fno-math-errno -funsafe-math-optimizations -ffp-contract=fast -fno-honor-infinities -fno-honor-nans". The last two of those cause compiler complaints because while the flag was meant for this file, it's shared across the codebase that includes statements that operate on infinities and NaNs. GCC 13.3 with -fopt-info-vec reports 18 vectorizations for `-O3 -ffast-math`, 17 for `-O3 -fno-math-errno -funsafe-math-optimizations -ffp-contract=fast` and also 17 for plain `-O3`. So using the subset of -ffast-math without the offending flags buys nothing and loses 1 vectorization. Both GCC and Clang provide the "fast-math" pragma directive, which I add to this one file that benefits from it, under the condition that it's supported. -ffast-math is removed from most of the makefiles. --- Makefile | 1 - Makefile.ctr | 8 ++------ Makefile.ctr.salamander | 8 ++------ Makefile.dingux | 2 +- Makefile.dos | 2 +- Makefile.libnx | 2 +- Makefile.miyoo | 2 +- Makefile.ps2 | 2 +- Makefile.ps2.salamander | 2 +- Makefile.psp1 | 2 +- Makefile.psp1.salamander | 2 +- Makefile.retrofw | 2 +- Makefile.vita | 2 +- Makefile.vita.salamander | 2 +- Makefile.wiiu | 2 +- Makefile.win | 4 ++-- libretro-common/audio/resampler/drivers/sinc_resampler.c | 4 ++++ 17 files changed, 22 insertions(+), 27 deletions(-) diff --git a/Makefile b/Makefile index 9d68f555d7..f197d83b1a 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,6 @@ else OBJDIR := $(OBJDIR_BASE)/release CFLAGS ?= -O3 CXXFLAGS ?= -O3 - DEF_FLAGS += -ffast-math endif DEF_FLAGS += -Wall -Wsign-compare diff --git a/Makefile.ctr b/Makefile.ctr index 5ac5102b92..a4125033f6 100644 --- a/Makefile.ctr +++ b/Makefile.ctr @@ -154,11 +154,7 @@ LIBDIRS := -L. -L$(CTRULIB)/lib ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -marm -mfpu=vfp -mtp=soft -CFLAGS += -mword-relocations \ - -ffast-math \ - $(ARCH) - -#CFLAGS += -Wall +CFLAGS += -mword-relocations $(ARCH) CFLAGS += -DARM11 -D_3DS ifeq ($(strip $(USE_CTRULIB_2)),1) @@ -202,7 +198,7 @@ CFLAGS += -Werror=implicit-function-declaration ASFLAGS := -g $(ARCH) -O3 LDFLAGS += -specs=ctr/3dsx_custom.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) -CFLAGS += -std=gnu99 -ffast-math +CFLAGS += -std=gnu99 LIB_CORE := LIB_CORE_FULL := diff --git a/Makefile.ctr.salamander b/Makefile.ctr.salamander index 1c51011ee8..a29a16a6e7 100644 --- a/Makefile.ctr.salamander +++ b/Makefile.ctr.salamander @@ -83,11 +83,7 @@ LIBDIRS := -L. -L$(CTRULIB)/lib ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -marm -mfpu=vfp -mtp=soft -CFLAGS += -mword-relocations \ - -fomit-frame-pointer -ffast-math \ - $(ARCH) - -#CFLAGS += -Wall +CFLAGS += -mword-relocations -fomit-frame-pointer $(ARCH) CFLAGS += -DARM11 -D_3DS ifeq ($(strip $(USE_CTRULIB_2)),1) @@ -115,7 +111,7 @@ CFLAGS += -Werror=implicit-function-declaration ASFLAGS := -g $(ARCH) -O3 LDFLAGS += -specs=ctr/3dsx_custom.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) -CFLAGS += -std=gnu99 -ffast-math +CFLAGS += -std=gnu99 LIBS := -lctru -lm diff --git a/Makefile.dingux b/Makefile.dingux index 3944c8c271..bed1f6f97f 100644 --- a/Makefile.dingux +++ b/Makefile.dingux @@ -107,7 +107,7 @@ OPK_NAME = retroarch.opk OBJ := LINK := $(CXX) -DEF_FLAGS := -march=mips32 -mtune=mips32r2 -mhard-float -ffast-math -fomit-frame-pointer +DEF_FLAGS := -march=mips32 -mtune=mips32r2 -mhard-float -fomit-frame-pointer DEF_FLAGS += -mplt -mno-shared DEF_FLAGS += -ffunction-sections -fdata-sections DEF_FLAGS += -I. -Ideps -Ideps/stb -DDINGUX=1 -MMD diff --git a/Makefile.dos b/Makefile.dos index 18f716e91d..0a88981b62 100644 --- a/Makefile.dos +++ b/Makefile.dos @@ -120,7 +120,7 @@ APP_ICON := pkg/libnx/retroarch.jpg #--------------------------------------------------------------------------------- ARCH := -CFLAGS := -g -Wall -O3 -fcommon -ffast-math -ffunction-sections \ +CFLAGS := -g -Wall -O3 -fcommon -ffunction-sections \ $(ARCH) $(DEFINES) $(INCLUDE_DIRS) CFLAGS += $(INCLUDE) diff --git a/Makefile.libnx b/Makefile.libnx index 7f52f506df..8ce2f937a8 100644 --- a/Makefile.libnx +++ b/Makefile.libnx @@ -127,7 +127,7 @@ APP_ICON := pkg/libnx/retroarch.jpg #--------------------------------------------------------------------------------- ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE -mcpu=cortex-a57+crc+fp+simd -CFLAGS := -g -Wall -O3 -fcommon -ffast-math -ffunction-sections \ +CFLAGS := -g -Wall -O3 -fcommon -ffunction-sections \ $(ARCH) $(DEFINES) $(INCLUDE_DIRS) -I$(LIBNX)/include -I$(PORTLIBS)/include/ -include $(LIBNX)/include/switch.h #$(shell $(PORTLIBS)/bin/freetype-config --cflags) CFLAGS += $(INCLUDE) -DSWITCH=1 -DHAVE_LIBNX=1 -DNXLINK=1 -DHAVE_SHADERPIPELINE -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES -DHAVE_UPDATE_CORE_INFO -DHAVE_STB_FONT #-DHAVE_FREETYPE diff --git a/Makefile.miyoo b/Makefile.miyoo index 77cbfedd44..690b3b262a 100644 --- a/Makefile.miyoo +++ b/Makefile.miyoo @@ -118,7 +118,7 @@ TARGET = retroarch OBJ := LINK := $(CXX) -DEF_FLAGS := -march=armv5te -mtune=arm926ej-s -ffast-math -fomit-frame-pointer +DEF_FLAGS := -march=armv5te -mtune=arm926ej-s -fomit-frame-pointer DEF_FLAGS += -ffunction-sections -fdata-sections DEF_FLAGS += -I. -Ideps -Ideps/stb -DMIYOO=1 -DDINGUX -MMD DEF_FLAGS += -Wall -Wno-unused-variable -flto diff --git a/Makefile.ps2 b/Makefile.ps2 index ef5c905b8d..be205a4c74 100644 --- a/Makefile.ps2 +++ b/Makefile.ps2 @@ -94,7 +94,7 @@ LDFLAGS += -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ports/lib -L. # Lib cdvd is needed to get proper time LIBS += -lpatches -lgskit -ldmakit -lps2_drivers -lz -lelf-loader -CFLAGS = $(OPTIMIZE_LV) $(DISABLE_WARNINGS) $(DEFINES) -DPS2 -ffast-math -fsingle-precision-constant +CFLAGS = $(OPTIMIZE_LV) $(DISABLE_WARNINGS) $(DEFINES) -DPS2 -fsingle-precision-constant ASFLAGS = $(CFLAGS) EE_OBJS += $(OBJ) diff --git a/Makefile.ps2.salamander b/Makefile.ps2.salamander index e4984571cd..3e746810e7 100644 --- a/Makefile.ps2.salamander +++ b/Makefile.ps2.salamander @@ -21,7 +21,7 @@ endif INCDIR = -Ilibretro-common/include INCDIR += -I$(PS2SDK)/ports/include -CFLAGS = $(OPTIMIZE_LV) $(DISABLE_WARNINGS) -ffast-math -fsingle-precision-constant +CFLAGS = $(OPTIMIZE_LV) $(DISABLE_WARNINGS) -fsingle-precision-constant ASFLAGS = $(CFLAGS) RARCH_DEFINES += -DPS2 -DIS_SALAMANDER -DRARCH_CONSOLE diff --git a/Makefile.psp1 b/Makefile.psp1 index 029411a854..c36be082d7 100644 --- a/Makefile.psp1 +++ b/Makefile.psp1 @@ -16,7 +16,7 @@ else endif INCDIR = deps deps/stb deps/7zip libretro-common/include libretro-common/include/compat/zlib -CFLAGS = $(OPTIMIZE_LV) -ffast-math -fsingle-precision-constant +CFLAGS = $(OPTIMIZE_LV) -fsingle-precision-constant ASFLAGS = $(CFLAGS) RARCH_DEFINES = -DPSP \ diff --git a/Makefile.psp1.salamander b/Makefile.psp1.salamander index 3163f6ee58..5fb1fcc79b 100644 --- a/Makefile.psp1.salamander +++ b/Makefile.psp1.salamander @@ -12,7 +12,7 @@ else endif INCDIR = $(PSPPATH)/include libretro-common/include -CFLAGS = $(OPTIMIZE_LV) -ffast-math -fsingle-precision-constant +CFLAGS = $(OPTIMIZE_LV) -fsingle-precision-constant ASFLAGS = $(CFLAGS) RARCH_DEFINES = -DPSP -DIS_SALAMANDER -DRARCH_CONSOLE diff --git a/Makefile.retrofw b/Makefile.retrofw index d3ecb0a008..26c837add8 100644 --- a/Makefile.retrofw +++ b/Makefile.retrofw @@ -120,7 +120,7 @@ OPK_NAME = retroarch_retrofw.opk OBJ := LINK := $(CXX) -DEF_FLAGS := -march=mips32 -mtune=mips32 -mhard-float -ffast-math -fomit-frame-pointer +DEF_FLAGS := -march=mips32 -mtune=mips32 -mhard-float -fomit-frame-pointer DEF_FLAGS += -mplt -mno-shared DEF_FLAGS += -ffunction-sections -fdata-sections DEF_FLAGS += -I. -Ideps -Ideps/stb -DDINGUX=1 -DRETROFW=1 -MMD diff --git a/Makefile.vita b/Makefile.vita index c4691300e6..7a1c715a30 100644 --- a/Makefile.vita +++ b/Makefile.vita @@ -149,7 +149,7 @@ endif ASFLAGS := $(CFLAGS) LDFLAGS := -Wl,-q,--pic-veneer -CFLAGS += -Wall -ffast-math +CFLAGS += -Wall CFLAGS += -DRARCH_INTERNAL -DHAVE_SCREENSHOTS -DRARCH_CONSOLE CFLAGS += -DHAVE_DSP_FILTER CFLAGS += -DHAVE_VIDEO_FILTER diff --git a/Makefile.vita.salamander b/Makefile.vita.salamander index 307351e507..0f9f5f1067 100644 --- a/Makefile.vita.salamander +++ b/Makefile.vita.salamander @@ -14,7 +14,7 @@ PREFIX = arm-vita-eabi CC = $(PREFIX)-gcc INCDIR = libretro-common/include -CFLAGS = -Wl,-q $(OPTIMIZE_LV) -I$(INCDIR) -std=gnu99 -mfloat-abi=hard -ffast-math -fsingle-precision-constant -mword-relocations +CFLAGS = -Wl,-q $(OPTIMIZE_LV) -I$(INCDIR) -std=gnu99 -mfloat-abi=hard -fsingle-precision-constant -mword-relocations ASFLAGS = $(CFLAGS) RARCH_DEFINES = -DVITA -DIS_SALAMANDER -DRARCH_CONSOLE diff --git a/Makefile.wiiu b/Makefile.wiiu index 47552d31a7..1c457bcf26 100644 --- a/Makefile.wiiu +++ b/Makefile.wiiu @@ -203,7 +203,7 @@ INCDIRS += -Iwiiu INCDIRS += -Iwiiu/include CFLAGS := -mcpu=750 -meabi -mhard-float -CFLAGS += -ffast-math -Werror=implicit-function-declaration +CFLAGS += -Werror=implicit-function-declaration CFLAGS += -ffunction-sections -fdata-sections #CFLAGS += -fomit-frame-pointer -mword-relocations CFLAGS += -Wall diff --git a/Makefile.win b/Makefile.win index b08980bcf5..ec1b9dfb69 100644 --- a/Makefile.win +++ b/Makefile.win @@ -132,8 +132,8 @@ ifeq ($(DEBUG), 1) CFLAGS += -O0 -g CXXFLAGS += -O0 -g else - CFLAGS += -O3 -ffast-math - CXXFLAGS += -O3 -ffast-math + CFLAGS += -O3 + CXXFLAGS += -O3 endif CFLAGS += $(DEF_FLAGS) -Wall -Wno-unused-result -Wno-unused-variable -I. -Ideps diff --git a/libretro-common/audio/resampler/drivers/sinc_resampler.c b/libretro-common/audio/resampler/drivers/sinc_resampler.c index fa3a78a04a..c294af352e 100644 --- a/libretro-common/audio/resampler/drivers/sinc_resampler.c +++ b/libretro-common/audio/resampler/drivers/sinc_resampler.c @@ -22,6 +22,10 @@ /* Bog-standard windowed SINC implementation. */ +#if defined(__GNUC__) && defined(__OPTIMIZE__) +#pragma GCC optimize ("fast-math") +#endif + #include #include #include From 63487e8ed8163b6f6f1130cd3af8a2569aed9cd2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 3 May 2025 00:15:28 +0000 Subject: [PATCH 032/175] Fetch translations from Crowdin --- intl/msg_hash_ar.h | 28 +++++++++++++++++++ intl/msg_hash_ca.h | 68 ++++++++++++++++++++++++++++++++++++++++++++++ intl/msg_hash_de.h | 4 +++ intl/msg_hash_fr.h | 4 +++ intl/msg_hash_it.h | 4 +++ intl/msg_hash_tr.h | 4 +++ intl/msg_hash_uk.h | 4 +++ intl/progress.h | 16 +++++------ 8 files changed, 124 insertions(+), 8 deletions(-) diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index b64d480f39..30bb13e6d8 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -1588,10 +1588,38 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DRIVER, "مشغل الإدخال للاستخدام. تبعاً لمشغل الفيديو، قد يفرض مشغل إدخال مختلف." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_INPUT_DRIVER_UDEV, + "يقوم مشغل udev بقراءة أحداث evdev للحصول على دعم لوحة المفاتيح. كما أنه يدعم رد المكالمات على لوحة المفاتيح والجرذان والملامس.\nبشكل افتراضي في معظم الأقراص، عقد /dev/input هي جذر فقط (الوضع 600). يمكنك إعداد قاعدة udev التي تجعل هذه متاحة لغير الجذر." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_INPUT_DRIVER_LINUXRAW, + "يتطلب مشغل إدخال Linuxraw نشيطا TTY. تُقرأ أحداث لوحة المفاتيح مباشرة من TY مما يجعلها أبسط ولكن ليس مرنة مثل udev. الرماد الخ، غير مدعوم على الإطلاق. يستخدم هذا السائق API القديم عصا التحكم (/dev/input/js*)." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_INPUT_DRIVER_NO_DETAILS, + "مشغل الإدخال. مشغل الفيديو قد يفرض مشغل إدخال مختلف." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER, "نظام تشغيل الجوي باد" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_JOYPAD_DRIVER, + "سائق يد التحكم لاستخدامه. (إعادة التشغيل مطلوبة)" + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_JOYPAD_DRIVER_DINPUT, + "مشغل وحدة تحكم مباشر الإدخال." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_JOYPAD_DRIVER_HID, + "مشغل جهاز الواجهة الانسانية مستوى منخفض." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_JOYPAD_DRIVER_LINUXRAW, + "استخدام واجهة برمجة التطبيقات API الموروثة لـ Linux. استخدم udev بدلا من ذلك إذا أمكن." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 80facf0b81..edafc43b6d 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2643,6 +2643,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y, "Compensa l'eix Y del punt d'anclatge" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y, + "Estableix la posició vertical del contingut si l'àrea de visualització és més alta que el contingut. 0,0 per l'extrem superior, 0,5 per a centrar, 1,0 per l'extrem inferior." + ) #if defined(RARCH_MOBILE) MSG_HASH( MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, @@ -4458,6 +4462,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_MANAGER_LIST, "Gestionar nuclis" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_MANAGER_LIST, + "Executa tasques de manteniment en els nuclis instal·lats (còpia de seguretat, eliminació,...) de forma local i mostra informació dels nuclis." + ) #ifdef HAVE_MIST MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_MANAGER_STEAM_LIST, @@ -4861,6 +4869,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_FASTFORWARD_FRAMESKIP, "Omet fotogrames en l'avançament ràpid" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FASTFORWARD_FRAMESKIP, + "Omet fotogrames segons la velocitat d'avançament ràpid. Estalvia energia i permet l'ús de limitadors de fotogrames externs." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, "Velocitat de càmera lenta" @@ -5718,6 +5730,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE, "Mida de les notificacions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, + "Especifica la mida de la tipografia en punts. Si es fan servir els widgets, la mida només s'aplicarà a les estadístiques en pantalla." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, "Posició de les notificacions (horitzontal)" @@ -5887,6 +5903,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_QUIT_ON_CLOSE_CONTENT, "Surt en tancar el contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUIT_ON_CLOSE_CONTENT, + "Tanca RetroArch automàticament en tancar contingut. 'CLI' tanca només si el contingut es carrega per la línia d'ordres." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_TIMEOUT, "Temps d'espera de l'estalvi de pantalla del menú" @@ -6810,6 +6830,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_REMEMBER_SELECTION, "Recordar selecció al canviar entre seccions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_REMEMBER_SELECTION, + "Recorda la posició anterior del ratolí a les pestanyes. RGUI no té pestanyes però les llistes de reproducció i la configuració tindran el mateix comportament." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_REMEMBER_SELECTION_ALWAYS, "Sempre" @@ -7286,6 +7310,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_REQUIRE_SLAVES, "Bloqueja els clients sense el mode esclau" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_REQUIRE_SLAVES, + "Desactiva les connexions que no estiguin en mode esclau. No es recomana fer-ho excepte en xarxes molt ràpides amb maquinari molt lent." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES, "Fotogrames de comprovació de joc en línia" @@ -7452,6 +7480,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SORT_ALPHABETICAL, "Ordena les llistes de reproducció alfabèticament" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SORT_ALPHABETICAL, + "Mostra contingut a les llistes de reproducció en ordre alfabètic, excloent les llistes de l'historial, imatges, música i vídeos." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_USE_OLD_FORMAT, "Desa les llistes de reproducció en el format antic" @@ -7556,6 +7588,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_ENTRY_IDX, "Mostar índexs en les llistres de reproducció" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_ENTRY_IDX, + "Mostra el nombre d'entrades en visualitzar llistes de reproducció. El format depen del controlador del menú seleccionat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_RUNTIME_TYPE, "Etiqueta de temps de joc a les llistes" @@ -7619,6 +7655,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_DEFAULT_CORE, "Nucli per defecte" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_MANAGER_DEFAULT_CORE, + "Especifica el nucli que es farà servir per executar contingut que no té associat un nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_RESET_CORES, "Reinicia les associacions de nucli" @@ -8011,6 +8051,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY, "Desar fitxers" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVEFILE_DIRECTORY, + "Desa tots els estats desats en aquesta carpeta. Si no hi ha una carpeta assignada, es desaran en la carpeta del contingut." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY, "Estats desats" @@ -8087,6 +8131,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER, "Afegir a la mescla" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ADD_TO_MIXER, + "Afegeix aquesta pista d'àudio a un espai de seqüències d'àudio.\nSi no hi ha espai disponible, s'ignorarà." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_PLAY, "Afegir a la mescla i reproduir" @@ -8294,6 +8342,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_DAT_FILE_FILTER, "Filtre DAT d'arcade" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MANUAL_CONTENT_SCAN_DAT_FILE_FILTER, + "Si es fa servir un fitxer DAT, el contingut només s'afegirà a la llista de reproducció si coincideix amb la informació del fitxer DAT." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_OVERWRITE, "Sobreescriu la llista de reproducció existent" @@ -10491,6 +10543,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_TRANSPARENCY, "Transparència" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_TRANSPARENCY, + "Mostra el contingut en el fons del menú ràpid. Desactivar la transparència pot canviar els colors del tema." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_SHADOWS, "Efectes d'ombra" @@ -14178,6 +14234,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Heu de posar en pausa o desactivar el mode expert d’assoliments per carregar desats ràpids." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "Heu de posar en pausa o desactivar el mode expert d’assoliments per carregar desats srm." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "S’ha carregat un desat ràpid. S’ha desactivat el mode expert d’assoliments per la sessió actual." @@ -15036,6 +15096,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "Pantalla inferior de la 3DS" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_3DS_LCD_BOTTOM, + "Habilita la visualització de la informació de l'estat a la pantalla inferior. Desactiva aquesta opció per millorar la duració de la bateria i el rendiment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_3DS_DISPLAY_MODE, "Mode de pantalla 3DS" @@ -15130,6 +15194,10 @@ MSG_HASH( ) #endif #ifdef HAVE_QT +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_SCAN_FINISHED, + "Escaneig finalitzat.

\nPer endreçar correctament el contingut escanejat, cal que:\n
  • tinguis un nucli compatible descarregat
  • \n
  • tinguis els fitxers d'informació del nucli actualitzats a través de l'actualitzador en línia
  • \n
  • tinguis la base de dades actualitzada a través de l'actualitzador en línia
  • \n
  • reiniciar RetroArch si acabes de complir alguna de les condicions anteriors
\nFinalment, el contingut ha de coincidir amb la base de dades existent aquí. Si encara no funciona correctament, pots enviar un error." + ) #endif MSG_HASH( MSG_IOS_TOUCH_MOUSE_ENABLED, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 117631bd56..ed53a72286 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -14526,6 +14526,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Du musst den Errungenschaften-Hardcore-Modus pausieren oder deaktivieren um Savestates laden zu können." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "Der Errungenschaften-Hardcore-Modus muss pausiert oder deaktiviert werden, um srm-Speicherstände zu laden." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "Ein Savestate wurde geladen. Errungenschaften-Hardcore-Modus wurde für die aktuelle Sitzung deaktiviert." diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index faaabb503c..8846aa914c 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -14818,6 +14818,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Vous devez mettre en pause ou désactiver les succès en mode Hardcore pour charger des sauvegardes instantanées." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "Vous devez mettre en pause ou désactiver les succès en mode Hardcore pour charger des sauvegardes srm." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "Une sauvegarde instantanée a été chargée. Succès en mode Hardcore désactivés pour la session en cours." diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 89cc6b4cf2..00817ec338 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -14670,6 +14670,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "È necessario mettere in pausa o disabilitare gli obiettivi Modalità Hardcore per caricare gli stati." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "È necessario mettere in pausa o disabilitare gli obiettivi Modalità Hardcore per caricare i salvataggi di stato." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "È stato caricato uno stato di salvataggio. La modalità Hardcore dei trofei è stata disattivata per la sessione attuale." diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 13b97cacc0..34c8355fb1 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -14950,6 +14950,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Durumları yüklemek için Zorlu Kipte Başarılar duraklatılmalı veya devre dışı bırakmanız gerekir." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "Durumları yüklemek için Zorlu Kipte Başarımlar duraklatılmalı veya devre dışı bırakılmalı." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "Bir durum kaydı yüklendi. Başarılar mevcut oturum için Zorlu Kip devre dışı bırakıldı." diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index f0f249cd37..e1d3c2bc70 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -14954,6 +14954,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Ви повинні призупинити або вимкнути передобуті досягнень для завантаження станів." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "Ви повинні призупинити або вимкнути досягнення Хардкорного режиму, щоб завантажити збереження srm." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "Стан збереження був завантажений. Досягнення Хардкорного режиму вимкнуто для поточної сесії." diff --git a/intl/progress.h b/intl/progress.h index 037e827502..5664083a5e 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 80 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 81 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -31,7 +31,7 @@ #define LANGUAGE_PROGRESS_DANISH_APPROVED 0 /* German */ -#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_GERMAN_APPROVED 13 /* Greek */ @@ -59,8 +59,8 @@ #define LANGUAGE_PROGRESS_FINNISH_APPROVED 45 /* French */ -#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 99 -#define LANGUAGE_PROGRESS_FRENCH_APPROVED 99 +#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_FRENCH_APPROVED 100 /* Galician */ #define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 99 @@ -83,7 +83,7 @@ #define LANGUAGE_PROGRESS_INDONESIAN_APPROVED 0 /* Italian */ -#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_ITALIAN_APPROVED 0 /* Japanese */ @@ -135,15 +135,15 @@ #define LANGUAGE_PROGRESS_SWEDISH_APPROVED 50 /* Turkish */ -#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 99 -#define LANGUAGE_PROGRESS_TURKISH_APPROVED 99 +#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_TURKISH_APPROVED 100 /* Tatar */ #define LANGUAGE_PROGRESS_TATAR_TRANSLATED 0 #define LANGUAGE_PROGRESS_TATAR_APPROVED 0 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ From 2e868fc00b511b3d09b47aacb325fc8089e6b358 Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Sat, 3 May 2025 12:07:56 +0000 Subject: [PATCH 033/175] Pop fast-math at the end of the file so that it doesn't affect the rest of the code in Griffin builds. This is unfortunately GCC-only, but Clang will miss only 1 vectorization. --- libretro-common/audio/resampler/drivers/sinc_resampler.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libretro-common/audio/resampler/drivers/sinc_resampler.c b/libretro-common/audio/resampler/drivers/sinc_resampler.c index c294af352e..226d8aeb8b 100644 --- a/libretro-common/audio/resampler/drivers/sinc_resampler.c +++ b/libretro-common/audio/resampler/drivers/sinc_resampler.c @@ -22,7 +22,8 @@ /* Bog-standard windowed SINC implementation. */ -#if defined(__GNUC__) && defined(__OPTIMIZE__) +#if defined(__GNUC__) && defined(__OPTIMIZE__) && !defined(__clang__) +#pragma GCC push_options #pragma GCC optimize ("fast-math") #endif @@ -1027,3 +1028,7 @@ retro_resampler_t sinc_resampler = { "sinc", "sinc" }; + +#if defined(__GNUC__) && defined(__OPTIMIZE__) && !defined(__clang__) +#pragma GCC pop_options +#endif From 0c1402d92aff259d9504f4fe3aa111fa3a3194f0 Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Sat, 3 May 2025 13:27:40 +0000 Subject: [PATCH 034/175] Reapply "Define WIN32_LEAN_AND_MEAN to avoid collision with winsock2" It was reverted in 309c67a205895b5036897e7f0aefc5730750a9a1 because it was suspected of breaking Windows releases, but the reason was different. --- ui/drivers/ui_qt.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/drivers/ui_qt.cpp b/ui/drivers/ui_qt.cpp index 5a8cb7170d..1fa54da778 100644 --- a/ui/drivers/ui_qt.cpp +++ b/ui/drivers/ui_qt.cpp @@ -14,6 +14,7 @@ * If not, see . */ +#define WIN32_LEAN_AND_MEAN #include #include #include From e3583cbcbb980fa06b8fa966b5f53b997c3cee70 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Sat, 3 May 2025 18:54:23 +0300 Subject: [PATCH 035/175] Add common Thumbnail Background option for all menu drivers --- config.def.h | 1 + configuration.c | 1 + configuration.h | 1 + intl/msg_hash_lbl.h | 4 + intl/msg_hash_us.h | 10 ++- menu/cbs/menu_cbs_sublabel.c | 4 + menu/drivers/ozone.c | 54 ++++++++++++ menu/drivers/rgui.c | 33 ++++---- menu/drivers/xmb.c | 157 ++++++++++++++++++++++++----------- menu/menu_displaylist.c | 1 + menu/menu_setting.c | 55 +++++------- msg_hash.h | 5 +- 12 files changed, 226 insertions(+), 100 deletions(-) diff --git a/config.def.h b/config.def.h index 5f9814a532..d31f27feab 100644 --- a/config.def.h +++ b/config.def.h @@ -156,6 +156,7 @@ * > Helps to unify menu appearance when viewing * thumbnails of different sizes */ #define DEFAULT_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE true +#define DEFAULT_MENU_THUMBNAIL_BACKGROUND_ENABLE false #define DEFAULT_SCREEN_BRIGHTNESS 100 diff --git a/configuration.c b/configuration.c index 9bfb796256..cba24cabf5 100644 --- a/configuration.c +++ b/configuration.c @@ -2072,6 +2072,7 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("menu_navigation_wraparound_enable", &settings->bools.menu_navigation_wraparound_enable, true, true, false); SETTING_BOOL("menu_navigation_browser_filter_supported_extensions_enable", &settings->bools.menu_navigation_browser_filter_supported_extensions_enable, true, true, false); SETTING_BOOL("menu_show_advanced_settings", &settings->bools.menu_show_advanced_settings, true, DEFAULT_SHOW_ADVANCED_SETTINGS, false); + SETTING_BOOL("menu_thumbnail_background_enable", &settings->bools.menu_thumbnail_background_enable, true, DEFAULT_MENU_THUMBNAIL_BACKGROUND_ENABLE, false); #ifdef HAVE_MATERIALUI SETTING_BOOL("materialui_icons_enable", &settings->bools.menu_materialui_icons_enable, true, DEFAULT_MATERIALUI_ICONS_ENABLE, false); SETTING_BOOL("materialui_switch_icons", &settings->bools.menu_materialui_switch_icons, true, DEFAULT_MATERIALUI_SWITCH_ICONS, false); diff --git a/configuration.h b/configuration.h index 112dcc1039..8cae2cbb1f 100644 --- a/configuration.h +++ b/configuration.h @@ -803,6 +803,7 @@ typedef struct settings bool menu_materialui_auto_rotate_nav_bar; bool menu_materialui_dual_thumbnail_list_view_enable; bool menu_materialui_thumbnail_background_enable; + bool menu_thumbnail_background_enable; bool menu_rgui_background_filler_thickness_enable; bool menu_rgui_border_filler_thickness_enable; bool menu_rgui_border_filler_enable; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 1700fcdd0c..5f081b6651 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -5222,6 +5222,10 @@ MSG_HASH( MENU_ENUM_LABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "materialui_thumbnail_background_enable" ) +MSG_HASH( + MENU_ENUM_LABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "menu_thumbnail_background_enable" + ) MSG_HASH( MENU_ENUM_LABEL_RENAME_ENTRY, "rename_entry" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index dc0713421a..eeb0168a6f 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -7198,6 +7198,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Automatically upscale thumbnail images with a width/height smaller than the specified value. Improves picture quality. Has a moderate performance impact." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Thumbnail Backgrounds" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Enables padding of unused space in thumbnail images with a solid background. This ensures a uniform display size for all images, improving menu appearance when viewing mixed content thumbnails with varying base dimensions." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Ticker Text Animation" @@ -12610,7 +12618,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Draw Thumbnail Backgrounds" + "Thumbnail Backgrounds" ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 68ca698f02..4d45a099de 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -950,6 +950,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_ozone_truncate_playlist_name, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_ozone_sort_after_truncate_playlist_name, MENU_ENUM_SUBLABEL_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME) #endif DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_thumbnail_upscale_threshold, MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_thumbnail_background_enable, MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_timedate_enable, MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_timedate_style, MENU_ENUM_SUBLABEL_TIMEDATE_STYLE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_timedate_date_separator, MENU_ENUM_SUBLABEL_TIMEDATE_DATE_SEPARATOR) @@ -2577,6 +2578,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_materialui_thumbnail_background_enable); #endif break; + case MENU_ENUM_LABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_thumbnail_background_enable); + break; case MENU_ENUM_LABEL_SCREEN_RESOLUTION: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_screen_resolution); break; diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index 61e3382806..a2d95c239e 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -6157,6 +6157,7 @@ static void ozone_draw_thumbnail_bar( int bottom_row_y_position = 0; bool show_right_thumbnail = false; bool show_left_thumbnail = false; + bool thumbnail_background = settings->bools.menu_thumbnail_background_enable; unsigned sidebar_height = video_height - ozone->dimensions.header_height - ozone->dimensions.sidebar_gradient_height * 2 @@ -6264,6 +6265,7 @@ static void ozone_draw_thumbnail_bar( + (int)(1.5f * (float)ozone->dimensions.sidebar_entry_icon_padding); right_thumbnail_alignment = GFX_THUMBNAIL_ALIGN_CENTRE; + show_left_thumbnail = false; if (thumbnail_height > thumbnail_width) { @@ -6326,6 +6328,32 @@ static void ozone_draw_thumbnail_bar( /* > If we have a right thumbnail, show it */ if (show_right_thumbnail) { + if (thumbnail_background) + { + float background_color[16] = { + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + }; + + right_thumbnail_alignment = GFX_THUMBNAIL_ALIGN_CENTRE; + + gfx_display_draw_quad( + p_disp, + userdata, + video_width, + video_height, + thumbnail_x_position, + right_thumbnail_y_position, + thumbnail_width, + thumbnail_height, + video_width, + video_height, + background_color, + NULL); + } + gfx_thumbnail_draw( userdata, video_width, @@ -6410,6 +6438,32 @@ static void ozone_draw_thumbnail_bar( left_thumbnail_alpha = 1.0f; } + if (thumbnail_background) + { + float background_color[16] = { + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + }; + + left_thumbnail_alignment = GFX_THUMBNAIL_ALIGN_CENTRE; + + gfx_display_draw_quad( + p_disp, + userdata, + video_width, + video_height, + thumbnail_x_position, + left_thumbnail_y_position, + thumbnail_width, + thumbnail_height, + video_width, + video_height, + background_color, + NULL); + } + /* Note: This is a NOOP when alpha is zero * (i.e. no performance impact when content * metadata override is fully active) */ diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 47725717bb..034471ab2f 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -2827,7 +2827,8 @@ static void rgui_render_mini_thumbnail( unsigned fb_width, unsigned fb_height, size_t fb_pitch, - bool menu_rgui_swap_thumbnails) + bool swap_thumbnails, + bool thumbnail_background) { if (thumbnail->is_valid && frame_buf_data && thumbnail->data) { @@ -2848,23 +2849,24 @@ static void rgui_render_mini_thumbnail( fb_x_offset = (rgui->term_layout.start_x + term_width) - (thumbnail->width + ((thumbnail_fullwidth - thumbnail->width) >> 1)); - if ( ((thumbnail_id == GFX_THUMBNAIL_RIGHT) && !menu_rgui_swap_thumbnails) - || ((thumbnail_id == GFX_THUMBNAIL_LEFT) && menu_rgui_swap_thumbnails)) + if ( ((thumbnail_id == GFX_THUMBNAIL_RIGHT) && !swap_thumbnails) + || ((thumbnail_id == GFX_THUMBNAIL_LEFT) && swap_thumbnails)) fb_y_offset = rgui->term_layout.start_y + ((thumbnail->max_height - thumbnail->height) >> 1); else fb_y_offset = (rgui->term_layout.start_y + term_height) - (thumbnail->height + ((thumbnail->max_height - thumbnail->height) >> 1)); /* Draw background */ - rgui_fill_rect(frame_buf_data, fb_width, fb_height, - rgui->term_layout.start_x + term_width - thumbnail_fullwidth, - ( ((thumbnail_id == GFX_THUMBNAIL_RIGHT) && !menu_rgui_swap_thumbnails) - || ((thumbnail_id == GFX_THUMBNAIL_LEFT) && menu_rgui_swap_thumbnails)) - ? fb_y_offset : fb_y_offset - ((thumbnail->max_height - thumbnail->height) >> 1), - thumbnail_fullwidth, thumbnail->max_height, - rgui->colors.shadow_color, - rgui->colors.shadow_color, - false); + if (thumbnail_background) + rgui_fill_rect(frame_buf_data, fb_width, fb_height, + rgui->term_layout.start_x + term_width - thumbnail_fullwidth, + ( ((thumbnail_id == GFX_THUMBNAIL_RIGHT) && !swap_thumbnails) + || ((thumbnail_id == GFX_THUMBNAIL_LEFT) && swap_thumbnails)) + ? fb_y_offset : fb_y_offset - ((thumbnail->max_height - thumbnail->height) >> 1), + thumbnail_fullwidth, thumbnail->max_height, + rgui->colors.shadow_color, + rgui->colors.shadow_color, + false); /* Copy thumbnail to framebuffer */ for (y = 0; y < thumbnail->height; y++) @@ -5018,6 +5020,7 @@ static void rgui_render(void *data, unsigned width, unsigned height, bool rgui_inline_thumbnails = settings->bools.menu_rgui_inline_thumbnails || (rgui->flags & RGUI_FLAG_IS_QUICK_MENU); bool menu_battery_level_enable = settings->bools.menu_battery_level_enable; bool use_smooth_ticker = settings->bools.menu_ticker_smooth; + bool thumbnail_background = settings->bools.menu_thumbnail_background_enable; bool rgui_swap_thumbnails = settings->bools.menu_rgui_swap_thumbnails; bool rgui_full_width_layout = settings->bools.menu_rgui_full_width_layout; bool rgui_switch_icons = settings->bools.menu_rgui_switch_icons; @@ -5717,7 +5720,7 @@ static void rgui_render(void *data, unsigned width, unsigned height, rgui->frame_buf.data, (rgui_swap_thumbnails) ? GFX_THUMBNAIL_RIGHT : GFX_THUMBNAIL_LEFT, fb_width, fb_height, fb_pitch, - rgui_swap_thumbnails); + rgui_swap_thumbnails, thumbnail_background); } else if (show_mini_thumbnails) { @@ -5728,13 +5731,13 @@ static void rgui_render(void *data, unsigned width, unsigned height, rgui->frame_buf.data, GFX_THUMBNAIL_RIGHT, fb_width, fb_height, fb_pitch, - rgui_swap_thumbnails); + rgui_swap_thumbnails, thumbnail_background); if (show_left_thumbnail && thumbnail2) rgui_render_mini_thumbnail(rgui, thumbnail2, rgui->frame_buf.data, GFX_THUMBNAIL_LEFT, fb_width, fb_height, fb_pitch, - rgui_swap_thumbnails); + rgui_swap_thumbnails, thumbnail_background); } /* Print menu sublabel/core name (if required) */ diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 49c3b7af2b..30be10f96f 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -7967,13 +7967,19 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) } else if (xmb->fullscreen_thumbnails_available && !xmb->show_fullscreen_thumbnails) { + float background_color[16] = { + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + }; + bool thumbnail_background = settings->bools.menu_thumbnail_background_enable; bool show_right_thumbnail = (gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_RIGHT)) && ( (xmb->thumbnails.right.status == GFX_THUMBNAIL_STATUS_AVAILABLE) || ( xmb->thumbnails.right.status < GFX_THUMBNAIL_STATUS_AVAILABLE && xmb->thumbnails_right_status_prev <= GFX_THUMBNAIL_STATUS_AVAILABLE && xmb->thumbnails_right_status_prev != GFX_THUMBNAIL_STATUS_UNKNOWN)); - bool show_left_thumbnail = (gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_LEFT)) && ( (xmb->thumbnails.left.status == GFX_THUMBNAIL_STATUS_AVAILABLE) @@ -8005,41 +8011,37 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) float right_thumb_y = thumb_y_base + thumb_y_offset; float left_thumb_y = thumb_y_base + thumb_height + (xmb->icon_size / 8) + thumb_y_offset; - float background_color[16] = { - 0.0f, 0.0f, 0.0f, 1.0f, - 0.0f, 0.0f, 0.0f, 1.0f, - 0.0f, 0.0f, 0.0f, 1.0f, - 0.0f, 0.0f, 0.0f, 1.0f, - }; - /* Darken background */ - gfx_display_draw_quad( - p_disp, - userdata, - video_width, - video_height, - thumb_x, - right_thumb_y, - scaled_thumb_width, - scaled_thumb_height, - video_width, - video_height, - background_color, - NULL); + if (thumbnail_background) + { + gfx_display_draw_quad( + p_disp, + userdata, + video_width, + video_height, + thumb_x, + right_thumb_y, + scaled_thumb_width, + scaled_thumb_height, + video_width, + video_height, + background_color, + NULL); - gfx_display_draw_quad( - p_disp, - userdata, - video_width, - video_height, - thumb_x, - left_thumb_y, - scaled_thumb_width, - scaled_thumb_height, - video_width, - video_height, - background_color, - NULL); + gfx_display_draw_quad( + p_disp, + userdata, + video_width, + video_height, + thumb_x, + left_thumb_y, + scaled_thumb_width, + scaled_thumb_height, + video_width, + video_height, + background_color, + NULL); + } gfx_thumbnail_draw( userdata, @@ -8076,17 +8078,31 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) + ((thumb_width - scaled_thumb_width) / 2.0f); float thumb_y = xmb->margins_screen_top + (xmb->icon_size / 1.5f); + if (thumbnail_background) + gfx_display_draw_quad( + p_disp, + userdata, + video_width, + video_height, + thumb_x, + thumb_y, + scaled_thumb_width, + scaled_thumb_height, + video_width, + video_height, + background_color, + NULL); + gfx_thumbnail_draw( userdata, video_width, video_height, - show_right_thumbnail - ? &xmb->thumbnails.right : &xmb->thumbnails.left, + (show_right_thumbnail) ? &xmb->thumbnails.right : &xmb->thumbnails.left, thumb_x, thumb_y, - scaled_thumb_width > 0.0f ? (unsigned)scaled_thumb_width : 0, - scaled_thumb_height > 0.0f ? (unsigned)scaled_thumb_height : 0, - GFX_THUMBNAIL_ALIGN_TOP, + (scaled_thumb_width > 0.0f) ? (unsigned)scaled_thumb_width : 0, + (scaled_thumb_height > 0.0f) ? (unsigned)scaled_thumb_height : 0, + (thumbnail_background) ? GFX_THUMBNAIL_ALIGN_CENTRE : GFX_THUMBNAIL_ALIGN_TOP, 1.0f, 1.0f, &thumbnail_shadow); } } @@ -8103,6 +8119,21 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) + ((thumb_width - scaled_thumb_width) / 2.0f); float thumb_y = xmb->margins_screen_top + (xmb->icon_size / 1.5f); + if (thumbnail_background) + gfx_display_draw_quad( + p_disp, + userdata, + video_width, + video_height, + thumb_x, + thumb_y, + scaled_thumb_width, + scaled_thumb_height, + video_width, + video_height, + background_color, + NULL); + gfx_thumbnail_draw( userdata, video_width, @@ -8112,7 +8143,7 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) thumb_y, (scaled_thumb_width > 0.0f) ? (unsigned)scaled_thumb_width : 0, (scaled_thumb_height > 0.0f) ? (unsigned)scaled_thumb_height : 0, - GFX_THUMBNAIL_ALIGN_TOP, + (thumbnail_background) ? GFX_THUMBNAIL_ALIGN_CENTRE : GFX_THUMBNAIL_ALIGN_TOP, 1.0f, 1.0f, &thumbnail_shadow); } @@ -8129,6 +8160,21 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) + ((thumb_width - scaled_thumb_width) / 2.0f); float thumb_y = xmb->margins_screen_top + xmb->icon_size + y_offset; + if (thumbnail_background) + gfx_display_draw_quad( + p_disp, + userdata, + video_width, + video_height, + thumb_x, + thumb_y, + scaled_thumb_width, + scaled_thumb_height, + video_width, + video_height, + background_color, + NULL); + gfx_thumbnail_draw( userdata, video_width, @@ -8136,9 +8182,9 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) &xmb->thumbnails.left, thumb_x, thumb_y, - scaled_thumb_width > 0.0f ? (unsigned)scaled_thumb_width : 0, - scaled_thumb_height > 0.0f ? (unsigned)scaled_thumb_height : 0, - GFX_THUMBNAIL_ALIGN_TOP, + (scaled_thumb_width > 0.0f) ? (unsigned)scaled_thumb_width : 0, + (scaled_thumb_height > 0.0f) ? (unsigned)scaled_thumb_height : 0, + (thumbnail_background) ? GFX_THUMBNAIL_ALIGN_CENTRE : GFX_THUMBNAIL_ALIGN_TOP, 1.0f, 1.0f, &thumbnail_shadow); } } @@ -8162,17 +8208,34 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) /* Very small thumbnails look ridiculous * > Impose a minimum size limit */ if (thumb_height > xmb->icon_size) + { + if (thumbnail_background) + gfx_display_draw_quad( + p_disp, + userdata, + video_width, + video_height, + thumb_x, + thumb_y, + scaled_thumb_width, + scaled_thumb_height, + video_width, + video_height, + background_color, + NULL); + gfx_thumbnail_draw( userdata, video_width, video_height, - show_left_thumbnail ? &xmb->thumbnails.left : &xmb->thumbnails.right, + (show_left_thumbnail) ? &xmb->thumbnails.left : &xmb->thumbnails.right, thumb_x, thumb_y, - scaled_thumb_width > 0.0f ? (unsigned)scaled_thumb_width : 0, - scaled_thumb_height > 0.0f ? (unsigned)scaled_thumb_height : 0, - GFX_THUMBNAIL_ALIGN_TOP, + (scaled_thumb_width > 0.0f) ? (unsigned)scaled_thumb_width : 0, + (scaled_thumb_height > 0.0f) ? (unsigned)scaled_thumb_height : 0, + (thumbnail_background) ? GFX_THUMBNAIL_ALIGN_CENTRE : GFX_THUMBNAIL_ALIGN_TOP, 1.0f, 1.0f, &thumbnail_shadow); + } } } diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 7f29cdfaf8..9876fe0f68 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -11641,6 +11641,7 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_MENU_RGUI_SWAP_THUMBNAILS, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER, PARSE_ONLY_UINT, true}, {MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DELAY, PARSE_ONLY_UINT, true}, + {MENU_ENUM_LABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_XMB_FONT, PARSE_ONLY_PATH, true}, {MENU_ENUM_LABEL_MENU_FONT_COLOR_RED, PARSE_ONLY_UINT, true}, {MENU_ENUM_LABEL_MENU_FONT_COLOR_GREEN, PARSE_ONLY_UINT, true}, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 4d9a5b857f..b8953eab9d 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -19670,41 +19670,6 @@ static bool setting_append_list( general_write_handler, general_read_handler, SD_FLAG_NONE); - - /* TODO: These should be removed entirely, but just - * comment out for now in case users complain... - CONFIG_FLOAT( - list, list_info, - &settings->floats.menu_header_opacity, - MENU_ENUM_LABEL_MATERIALUI_MENU_HEADER_OPACITY, - MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_HEADER_OPACITY, - DEFAULT_MENU_HEADER_OPACITY, - "%.3f", - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler); - (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; - menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.010, true, true); - - CONFIG_FLOAT( - list, list_info, - &settings->floats.menu_footer_opacity, - MENU_ENUM_LABEL_MATERIALUI_MENU_FOOTER_OPACITY, - MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY, - DEFAULT_MENU_FOOTER_OPACITY, - "%.3f", - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler); - (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; - menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.010, true, true); - (*list)[list_info->index - 1].ui_type - = ST_UI_TYPE_FLOAT_SLIDER_AND_SPINBOX; - */ } #endif @@ -19823,6 +19788,26 @@ static bool setting_append_list( SD_FLAG_NONE); } + if ( string_is_equal(settings->arrays.menu_driver, "xmb") + || string_is_equal(settings->arrays.menu_driver, "ozone") + || string_is_equal(settings->arrays.menu_driver, "rgui")) + { + CONFIG_BOOL( + list, list_info, + &settings->bools.menu_thumbnail_background_enable, + MENU_ENUM_LABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + DEFAULT_MENU_THUMBNAIL_BACKGROUND_ENABLE, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + } + if ( string_is_equal(settings->arrays.menu_driver, "xmb") || string_is_equal(settings->arrays.menu_driver, "ozone") || string_is_equal(settings->arrays.menu_driver, "rgui") diff --git a/msg_hash.h b/msg_hash.h index 732f8d5f82..6273a1c125 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -781,8 +781,8 @@ enum msg_hash_enums MENU_LABEL(VIDEO_SHADERS_ENABLE), - MENU_LABEL(MATERIALUI_MENU_HEADER_OPACITY), - MENU_LABEL(MATERIALUI_MENU_FOOTER_OPACITY), + MENU_LABEL(MATERIALUI_MENU_HEADER_OPACITY), /* Deprecated */ + MENU_LABEL(MATERIALUI_MENU_FOOTER_OPACITY), /* Deprecated */ MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE, MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE_GREY, MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_RED, @@ -1658,6 +1658,7 @@ enum msg_hash_enums MENU_LABEL(MENU_XMB_TITLE_MARGIN), MENU_LABEL(MENU_XMB_TITLE_MARGIN_HORIZONTAL_OFFSET), MENU_LABEL(MENU_THUMBNAIL_UPSCALE_THRESHOLD), + MENU_LABEL(MENU_THUMBNAIL_BACKGROUND_ENABLE), MENU_LABEL(MENU_RGUI_INLINE_THUMBNAILS), MENU_LABEL(MENU_RGUI_SWAP_THUMBNAILS), MENU_LABEL(MENU_RGUI_THUMBNAIL_DOWNSCALER), From 583687081c8c34f8c58cc88ca8185178c06ba649 Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Sat, 3 May 2025 15:51:37 +0000 Subject: [PATCH 036/175] Revisit selection and size_t to silence warnings There is a type mismatch between selection (size_t) and how it's passed to some functions. In 4f3ae82 I got it backwards and changed the type in savestate thumbnail function definitions to size_t, but in that case we can assume that there won't be more than 999. So in this case it's OK to keep the unsigned int and cast selection to that type. Thumbnails on playlists are the other case and the limit is not so clear to me, so I assume it's reasonable to promote the type of the function parameter i from unsigned to size_t. --- menu/drivers/materialui.c | 9 +++++---- menu/drivers/ozone.c | 14 +++++++------- menu/drivers/rgui.c | 6 +++--- menu/drivers/xmb.c | 6 +++--- menu/menu_driver.h | 4 ++-- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 79a409caae..736f88653d 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -2424,7 +2424,7 @@ static void materialui_update_fullscreen_thumbnail_label( NULL); } -static void materialui_update_savestate_thumbnail_path(void *data, size_t i) +static void materialui_update_savestate_thumbnail_path(void *data, unsigned i) { settings_t *settings = config_get_ptr(); materialui_handle_t *mui = (materialui_handle_t*)data; @@ -9232,7 +9232,7 @@ static void materialui_navigation_set(void *data, bool scroll) /* Update savestate thumbnail */ if (mui->flags & MUI_FLAG_IS_SAVESTATE_LIST) { - materialui_update_savestate_thumbnail_path(mui, selection); + materialui_update_savestate_thumbnail_path(mui, (unsigned)selection); materialui_update_savestate_thumbnail_image(mui); } @@ -9635,7 +9635,8 @@ static void materialui_populate_entries(void *data, const char *path, || string_to_unsigned(path) == MENU_ENUM_LABEL_STATE_SLOT)) { mui->flags |= MUI_FLAG_IS_SAVESTATE_LIST; - materialui_update_savestate_thumbnail_path(mui, menu_state_get_ptr()->selection_ptr); + materialui_update_savestate_thumbnail_path(mui, + (unsigned)menu_state_get_ptr()->selection_ptr); materialui_update_savestate_thumbnail_image(mui); } else @@ -12090,7 +12091,7 @@ static void materialui_list_clear(file_list_t *list) } } -static void materialui_refresh_thumbnail_image(void *userdata, unsigned i) +static void materialui_refresh_thumbnail_image(void *userdata, size_t i) { materialui_handle_t *mui = (materialui_handle_t*)userdata; struct menu_state *menu_st = menu_state_get_ptr(); diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index 61e3382806..fdb77212ee 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -3705,7 +3705,7 @@ static bool ozone_is_main_menu_playlist(void *userdata) return entry.type == FILE_TYPE_RPL_ENTRY; } -static void ozone_update_savestate_thumbnail_path(void *data, size_t i) +static void ozone_update_savestate_thumbnail_path(void *data, unsigned i) { settings_t *settings = config_get_ptr(); ozone_handle_t *ozone = (ozone_handle_t*)data; @@ -9083,7 +9083,7 @@ static void ozone_update_thumbnail_image(void *data) ozone->title); } -static void ozone_refresh_thumbnail_image(void *data, unsigned i) +static void ozone_refresh_thumbnail_image(void *data, size_t i) { ozone_handle_t *ozone = (ozone_handle_t*)data; struct menu_state *menu_st = menu_state_get_ptr(); @@ -10290,7 +10290,7 @@ static void ozone_render(void *data, && ozone->depth >= 2) || (ozone->flags & OZONE_FLAG_IS_STATE_SLOT)) { - ozone_update_savestate_thumbnail_path(ozone, i); + ozone_update_savestate_thumbnail_path(ozone, (unsigned)i); ozone_update_savestate_thumbnail_image(ozone); } } @@ -11563,7 +11563,7 @@ static void ozone_selection_changed(ozone_handle_t *ozone, bool allow_animation) ozone_update_thumbnail_image(ozone); } - ozone_update_savestate_thumbnail_path(ozone, ozone->selection); + ozone_update_savestate_thumbnail_path(ozone, (unsigned)ozone->selection); ozone_update_savestate_thumbnail_image(ozone); } } @@ -12287,7 +12287,7 @@ static void ozone_populate_entries( ozone_list_open(ozone, ozone_collapse_sidebar, (!(ozone->flags & OZONE_FLAG_FIRST_FRAME))); /* Reset savestate thumbnails always */ - ozone_update_savestate_thumbnail_path(ozone, menu_st->selection_ptr); + ozone_update_savestate_thumbnail_path(ozone, (unsigned)menu_st->selection_ptr); ozone_update_savestate_thumbnail_image(ozone); /* Thumbnails @@ -12316,7 +12316,7 @@ static void ozone_populate_entries( { ozone->flags &= ~(OZONE_FLAG_WANT_THUMBNAIL_BAR | OZONE_FLAG_SKIP_THUMBNAIL_RESET); - ozone_update_savestate_thumbnail_path(ozone, menu_st->selection_ptr); + ozone_update_savestate_thumbnail_path(ozone, (unsigned)menu_st->selection_ptr); ozone_update_savestate_thumbnail_image(ozone); } else if ( gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_RIGHT) @@ -12426,7 +12426,7 @@ static void ozone_toggle(void *userdata, bool menu_on) ozone->flags &= ~(OZONE_FLAG_WANT_THUMBNAIL_BAR | OZONE_FLAG_SKIP_THUMBNAIL_RESET); gfx_thumbnail_reset(&ozone->thumbnails.savestate); - ozone_update_savestate_thumbnail_path(ozone, menu_st->selection_ptr); + ozone_update_savestate_thumbnail_path(ozone, (unsigned)menu_st->selection_ptr); ozone_update_savestate_thumbnail_image(ozone); } diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 47725717bb..65bb1b14e8 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -6872,7 +6872,7 @@ static void rgui_load_current_thumbnails(rgui_t *rgui, struct menu_state *menu_s #endif } -static void rgui_update_savestate_thumbnail_path(void *data, size_t i) +static void rgui_update_savestate_thumbnail_path(void *data, unsigned i) { settings_t *settings = config_get_ptr(); rgui_t *rgui = (rgui_t*)data; @@ -7072,7 +7072,7 @@ static void rgui_scan_selected_entry_thumbnail(rgui_t *rgui, bool force_load) /* Reset savestate thumbnails always */ if (selection < list_size) { - rgui_update_savestate_thumbnail_path(rgui, selection); + rgui_update_savestate_thumbnail_path(rgui, (unsigned)selection); rgui_update_savestate_thumbnail_image(rgui); } @@ -7141,7 +7141,7 @@ static void rgui_toggle_fs_thumbnail(rgui_t *rgui, rgui_scan_selected_entry_thumbnail(rgui, true); } -static void rgui_refresh_thumbnail_image(void *userdata, unsigned i) +static void rgui_refresh_thumbnail_image(void *userdata, size_t i) { rgui_t *rgui = (rgui_t*)userdata; struct menu_state *menu_st = menu_state_get_ptr(); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 49c3b7af2b..b8d8651c1d 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -1233,7 +1233,7 @@ static void xmb_update_dynamic_wallpaper(xmb_handle_t *xmb, bool reset) } } -static void xmb_update_savestate_thumbnail_path(void *data, size_t i) +static void xmb_update_savestate_thumbnail_path(void *data, unsigned i) { xmb_handle_t *xmb = (xmb_handle_t*)data; settings_t *settings = config_get_ptr(); @@ -1385,7 +1385,7 @@ static unsigned xmb_get_horizontal_selection_type(xmb_handle_t *xmb) return 0; } -static void xmb_refresh_thumbnail_image(void *data, unsigned i) +static void xmb_refresh_thumbnail_image(void *data, size_t i) { xmb_handle_t *xmb = (xmb_handle_t*)data; struct menu_state *menu_st = menu_state_get_ptr(); @@ -2127,7 +2127,7 @@ static void xmb_list_open_new(xmb_handle_t *xmb, /* This shows savestate thumbnail after * opening savestate submenu */ xmb->skip_thumbnail_reset = false; - xmb_update_savestate_thumbnail_path(xmb, current); + xmb_update_savestate_thumbnail_path(xmb, (unsigned)current); xmb_update_savestate_thumbnail_image(xmb); } diff --git a/menu/menu_driver.h b/menu/menu_driver.h index d0de72c588..2153ab01f1 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -388,10 +388,10 @@ typedef struct menu_ctx_driver int (*environ_cb)(enum menu_environ_cb type, void *data, void *userdata); void (*update_thumbnail_path)(void *data, unsigned i, char pos); void (*update_thumbnail_image)(void *data); - void (*refresh_thumbnail_image)(void *data, unsigned i); + void (*refresh_thumbnail_image)(void *data, size_t i); void (*set_thumbnail_content)(void *data, const char *s); int (*osk_ptr_at_pos)(void *data, int x, int y, unsigned width, unsigned height); - void (*update_savestate_thumbnail_path)(void *data, size_t i); + void (*update_savestate_thumbnail_path)(void *data, unsigned i); void (*update_savestate_thumbnail_image)(void *data); int (*pointer_down)(void *data, unsigned x, unsigned y, unsigned ptr, menu_file_list_cbs_t *cbs, From 015e515e9e8cf2f87a052b9b646f7dab57922d71 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 4 May 2025 00:17:35 +0000 Subject: [PATCH 037/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 56 ++++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index edafc43b6d..17b93b12fd 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2643,6 +2643,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y, "Compensa l'eix Y del punt d'anclatge" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X, + "Posició horitzontal de contingut si l'àrea de visualització és més ampla que el contingut. 0.0 per l'extrem esquerre, 0.5 per centrat, 1.0 per per l'extrem dret." + ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y, "Estableix la posició vertical del contingut si l'àrea de visualització és més alta que el contingut. 0,0 per l'extrem superior, 0,5 per a centrar, 1,0 per l'extrem inferior." @@ -3058,6 +3062,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_LATENCY, "Latència de l'entrada de so (ms)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MICROPHONE_LATENCY, + "Escull la latència per l'entrada d'àudio en mil·lisegons. Aquest valor pot ser ignorat si el controlador del micròfon no pot generar aquesta latència." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_WASAPI_EXCLUSIVE_MODE, "Mode WASAPI exclusiu" @@ -3136,6 +3144,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MIDI_INPUT, "Seleccioneu el dispositiu d'entrada." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_MIDI_INPUT, + "Escull el dispositiu d'entrada. Si està seleccionat a 'Off', l'entrada MIDI estarà deshabilitada. El nom del dispositiu es pot introduir de forma manual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MIDI_OUTPUT, "Sortida" @@ -4912,6 +4924,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE, "Mida de la memòria intermèdia del rebobinat (MB)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE, + "La quantitat de memòria (en MB) reservada per la memòria de rebobinat. Augmentar aquest valor, augmentarà la quantitat de rebobinat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE_STEP, "Mida de la memòria intermèdia dels passos de rebobinat (MB)" @@ -5315,6 +5331,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_MOUSE_SETTINGS, "Superposa el ratolí" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_MOUSE_SETTINGS, + "Configura el senyal d'entrada del ratolí que es transmeten a la superposició. Nota: 1-, 2-, i 3- tocs de dit es transmeten com clic esquerre, dret i mig del ratolí." + ) /* Settings > On-Screen Display > On-Screen Overlay > Keyboard Overlay */ @@ -5369,18 +5389,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_LIGHTGUN_TRIGGER_DELAY, "Retard en el tret (fotogrames)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_LIGHTGUN_TRIGGER_DELAY, + "Estableix un retard en el senyal d'entrada per donar temps al desplaçament del ratolí. Aquest retard també serveix per comptar correctament els tocs tàctils amb diversos dits." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_LIGHTGUN_TWO_TOUCH_INPUT, "Entrada de 2 dits" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_LIGHTGUN_TWO_TOUCH_INPUT, + "Escull l'entrada que s'enviarà si hi ha dos punters en pantalla. El retard del gatell ha de tenir un valor diferent de 0 per poder separar els dos senyals." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_LIGHTGUN_THREE_TOUCH_INPUT, "Entrada de 3 dits" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_LIGHTGUN_THREE_TOUCH_INPUT, + "Escull l'entrada que s'enviarà si hi ha tres punters en pantalla. El retard del gatell ha de tenir un valor diferent de 0 per poder separar els dos senyals." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_LIGHTGUN_FOUR_TOUCH_INPUT, "Entrada de 4 dits" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_LIGHTGUN_FOUR_TOUCH_INPUT, + "Escull l'entrada que s'enviarà si hi ha quatre punters en pantalla. El retard del gatell ha de tenir un valor diferent de 0 per poder separar els dos senyals." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_LIGHTGUN_ALLOW_OFFSCREEN, "Permet apuntar fora de la pantalla" @@ -9328,6 +9364,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_REPEAT_COUNT, "Nombre d'iteracions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_REPEAT_COUNT, + "El nombre de vegades que un truc pot ser aplicat. Fes servir amb les altres dues opcions d'iteració per cobrir grans regions de memòria." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_REPEAT_ADD_TO_ADDRESS, "Augmenta la direcció en cada iteració" @@ -10587,6 +10627,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_THUMBNAILS_RGUI, "Miniatura superior" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_THUMBNAILS_RGUI, + "Indica el tipus de miniatura que es mostrarà a la part superior dreta de les llistes de reproducció. El tipus escollit es pot canviar clicant al botó RetroPad Y." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_RGUI, "Miniatura inferior" @@ -11272,6 +11316,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_AUTO_ROTATE_NAV_BAR, "Gira automàticament la barra de navegació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_AUTO_ROTATE_NAV_BAR, + "Mou automàticament la barra de navegació a la part dreta de la pantalla si es fa servir l'orientació horitzontal." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME, "Color del tema" @@ -12733,6 +12781,10 @@ MSG_HASH( MSG_NETPLAY_S_HAS_JOINED_WITH_INPUT_DEVICES_S, "%.*s ha accedit amb el dispositiu %.*s" ) +MSG_HASH( + MSG_NETPLAY_NOT_RETROARCH, + "Una connexió de joc en xarxa ha fallat perquè el client no feia servir RetroArch o feia servir una versió anterior de RetroArch." + ) MSG_HASH( MSG_NETPLAY_OUT_OF_DATE, "Un client del joc en xarxa fa servir una versió antiga de RetroArch. No es pot connectar amb el client." @@ -15152,6 +15204,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_BOTTOM_FONT_ENABLE, "Habilitar la font" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BOTTOM_FONT_ENABLE, + "Mostra la font del menú de la pantalla inferior i les descripcions dels botons, excepte la data dels desats ràpids." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BOTTOM_FONT_COLOR_RED, "Color vermell de la font" diff --git a/intl/progress.h b/intl/progress.h index 5664083a5e..cf0ddcd1d2 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 81 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 83 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ From e78898f379a0dd9947e62e344f49eab044dca7ed Mon Sep 17 00:00:00 2001 From: kwyxz Date: Sun, 4 May 2025 01:48:15 +0000 Subject: [PATCH 038/175] default to FFmpeg libavfilter virtual input device --- camera/drivers/ffmpeg.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/camera/drivers/ffmpeg.c b/camera/drivers/ffmpeg.c index 925c1247b0..0d7d509015 100644 --- a/camera/drivers/ffmpeg.c +++ b/camera/drivers/ffmpeg.c @@ -40,6 +40,8 @@ #define FFMPEG_CAMERA_DEFAULT_BACKEND "dshow" #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined (__NetBSD__) #define FFMPEG_CAMERA_DEFAULT_BACKEND "bktr" +#else +#define FFMPEG_CAMERA_DEFAULT_BACKEND "lavfi" #endif typedef struct ffmpeg_camera From 19257e219030f7ece4f2b8debe4b1080a561ce6f Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 5 May 2025 00:17:08 +0000 Subject: [PATCH 039/175] Fetch translations from Crowdin --- intl/msg_hash_be.h | 4 ++ intl/msg_hash_ca.h | 164 +++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 3 files changed, 169 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_be.h b/intl/msg_hash_be.h index ab7dd847a5..fe41d19669 100644 --- a/intl/msg_hash_be.h +++ b/intl/msg_hash_be.h @@ -14870,6 +14870,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Загрузка станаў патрабуе адключэння ці прыпынення хардкор рэжыму дасягненняў." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "Загрузка станаў патрабуе адключэння ці прыпынення хардкор рэжыму дасягненняў." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "Загружана захаванне стану. Хардкор рэжым дасягненняў у бягучым сеансе адключаны." diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 17b93b12fd..a809586e2d 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2668,6 +2668,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, "Compensació de l'eix Y del punt d'ancoratge de l'àrea de visualització (orientació vertical)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Posició horitzontal de contingut si l'àrea de visualització és més ampla que el contingut. 0.0 per l'extrem esquerre, 0.5 per centrat, 1.0 per per l'extrem dret." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Estableix la posició vertical del contingut si l'àrea de visualització és més alta que el contingut. 0,0 per l'extrem superior, 0,5 per a centrar, 1,0 per l'extrem inferior. (Orientació vertical)" + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, @@ -2779,6 +2787,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY_AUTO, "Ajusta el retard de fotogrames real de forma dinàmica." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_FRAME_DELAY_AUTO, + "Intentar mantenir el desfasament de fotogrames objectiu i minimitzar els fotogrames perduts. Si el desfasament de fotogrames està establert a 0 (automàtic), el punt de partida serà de 3/4 parts de la duració dels fotogrames." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_AUTOMATIC, "Automàtic" @@ -3285,6 +3297,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR, "Sistema de votació (Es requereix reinici)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_POLL_TYPE_BEHAVIOR, + "Afecta com RetroArch realitza el sondeig d'entrada. Depenent de la vostra configuració, establir-ho a 'Prest' o 'Tard' pot significar menys latència." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, "Re-mapeja els controls d'aquest nucli" @@ -4075,6 +4091,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_AI_SERVICE, "Servei d'IA" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_AI_SERVICE, + "Captura una imatge del contingut actual i tradueix o llegeix en veu alta els textos que hi hagi.Cal haver activat i configurat el servei d'IA." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_PING_TOGGLE, @@ -4176,6 +4196,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_RESERVATION_TYPE, "Tipus de reserva del dispositiu" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DEVICE_RESERVATION_TYPE, + "Preferit: Si el controlador específic està disponible, s'assignarà a aquest jugador. Reservat: No s'assignarà cap controlador a aquest jugador." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_REMAP_PORT, "Port assignat" @@ -4405,6 +4429,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PREEMPT_FRAMES, "Nombre de fotogrames preventius" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PREEMPT_FRAMES, + "Determina el nombre de fotogrames a repetir. Poden haver fluctuacions de senyal si el nombre de fotogrames endarrerits supera al valor intern del joc." + ) /* Settings > Core */ @@ -4456,10 +4484,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_INFO_CACHE_ENABLE, "Memòria cau d'arxius d'informació de nuclis" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_INFO_CACHE_ENABLE, + "Manté una memòria interna local amb informació sobre els nuclis instal·lats. Redueix molt els temps de càrrega en maquinari amb velocitats baixes d'accés al disc." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_INFO_SAVESTATE_BYPASS, "Ometent la informació del nucli sobre desats ràpids" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_INFO_SAVESTATE_BYPASS, + "Especifica si es pot ignorar la informació que té el nucli sobre les seves capacitats per desats ràpids per experimentar amb les seves característiques relacionades (reducció predictiva de latència, rebobinat,...)." + ) #ifndef HAVE_DYNAMIC MSG_HASH( MENU_ENUM_LABEL_VALUE_ALWAYS_RELOAD_CORE_ON_RUN_CONTENT, @@ -4470,6 +4506,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, "Permet la rotació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_ALLOW_ROTATE, + "Permet que els nuclis puguin girar la pantalla. Si està desactivat, les peticions de girar la pantalla seran ignorades. Útil per configuracions que necessiten girar la pantalla manualment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_MANAGER_LIST, "Gestionar nuclis" @@ -4648,6 +4688,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REPLAY_AUTO_INDEX, "Augmenta automàticament l'índex de repeticions" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REPLAY_AUTO_INDEX, + "Abans de fer una repetició, l'índex augmenta automàticament. En carregar el contingut, l'índex s'assignarà al valor més alt possible." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_MAX_KEEP, "Màxim de desats ràpids autoincrementats a mantenir" @@ -4664,6 +4708,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE, "Desat ràpid automàtic" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE, + "Desa un estat automàticament quan es tanca el contingut. L'estat desat es carrega en carregar el contingut si l'opció 'Carrega l'estat automàticament' està activada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_LOAD, "Carrega estat automàticament" @@ -5223,6 +5271,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_AUTOLOAD_PREFERRED, "Carrega Automàticament la Superposició Preferida" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_AUTOLOAD_PREFERRED, + "Es dona preferència a la càrrega de superposicions segons el nom del sistema en comptes de fer servir la configuració predeterminada. Aquesta opció no es tindrà en compte si s'ha establert una personalització per les superposicions." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_OPACITY, "Opacitat de la Superposició" @@ -5267,10 +5319,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_X_OFFSET_LANDSCAPE, "Desplaçament X de superposició (mode horitzontal)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_X_OFFSET_LANDSCAPE, + "Desplaça la superposició en l'eix horitzontal en fer servir una orientació de pantalla horitzontal. Els valors positius desplacen la superposició cap a la dreta i els valors negatius, cap a l'esquerre." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_Y_OFFSET_LANDSCAPE, "Desplaçament Y de superposició (mode horitzontal)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_Y_OFFSET_LANDSCAPE, + "Desplaça la superposició en l'eix vertical en fer servir una orientació de pantalla horitzontal. Els valors positius desplacen la superposició cap a dalt i els valors negatius, cap a baix." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE_PORTRAIT, "Escala de la superposició (mode vertical)" @@ -5299,10 +5359,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_X_OFFSET_PORTRAIT, "Desplaçament X de superposició (mode vertical)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_X_OFFSET_PORTRAIT, + "Desplaça la superposició en l'eix horitzontal en fer servir una orientació de pantalla vertical. Els valors positius desplacen la superposició cap a la dreta i els valors negatius, cap a l'esquerre." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_Y_OFFSET_PORTRAIT, "Desplaçament Y de superposició (mode vertical)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_Y_OFFSET_PORTRAIT, + "Desplaça la superposició en l'eix vertical en fer servir una orientació de pantalla vertical. Els valors positius desplacen la superposició cap a dalt i els valors negatius, cap a baix." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OSK_OVERLAY_SETTINGS, "Superposició de teclat" @@ -5472,6 +5540,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_MOUSE_SWIPE_THRESHOLD, "Llindar de lliscament" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_MOUSE_SWIPE_THRESHOLD, + "Ajusta el rang de moviment permès a l'hora de detectar una pulsació llarga o un toc. Es representa com un percentatge de la dimensió més petita de la pantalla." + ) /* Settings > On-Screen Display > Video Layout */ @@ -6889,6 +6961,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_AI_SERVICE_MODE, "Sortida del servei d’IA" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AI_SERVICE_MODE, + "Mostra les traduccions com una imatge superposada (Mode Imatge), àudio directe (Veu) o utilitza una veu del sistema, com NVDA (Narració)." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AI_SERVICE_URL, "URL del servei d’IA" @@ -7306,6 +7382,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_START_AS_SPECTATOR, "Comença el joc en línia en mode espectador." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_NETPLAY_START_AS_SPECTATOR, + "Indica si cal començar una sessió de joc en xarxa en el mode espectador. Si aquesta opció està activada, el joc en xarxa començarà en el mode espectador. Es pot canviar el mode més endavant." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_FADE_CHAT, "Amagar xat" @@ -7378,6 +7458,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_NAT_TRAVERSAL, "Camí del NAT del joc en xarxa" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL, + "En executar un servidor, se cercaran les connexions des d'internet mitjançant UPnP o tecnologies similars amb les quals sortir de les xarxes locals." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_DIGITAL, "Compartir entrada digital" @@ -7536,10 +7620,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_INLINE_CORE_NAME, "Mostra els nuclis associats a les llistes de reproducció" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_INLINE_CORE_NAME, + "Especifica si cal associar elements de la llista de reproducció amb el nucli actual (si existeix).\nAquesta opció s'ignorarà si les subetiquetes a les llistes estan actives." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_SUBLABELS, "Mostra subetiquetes de les llistes" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_SUBLABELS, + "Mostra informació addicional per cada entrada de la llista de reproducció, com el nucli associat i el temps de jocs (si està disponible). Té un impacte variable en el rendiment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_HISTORY_ICONS, "Mostra icones específiques dels continguts a l'historial i als preferits" @@ -7680,6 +7772,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_ALLOW_NON_PNG, "Permet tots els tipus d'matge per les miniatures" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_ALLOW_NON_PNG, + "En activar aquesta opció, es poden afegir miniatures locals amb tots els tipus d'imatge compatibles amb RetroArch (com jpeg). Pot afectar lleugerament al rendiment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGE, "Administrar" @@ -7731,6 +7827,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_REFRESH_PLAYLIST, "Actualitza la llista de reproducció" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_MANAGER_REFRESH_PLAYLIST, + "Afegeix nou contingut i elimina entrades invàlides amb l'opció 'Escaneig manual'." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DELETE_PLAYLIST, "Esborrar llista de reproducció" @@ -8095,6 +8195,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY, "Estats desats" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_DIRECTORY, + "Els estats desats i les repeticions es desaran en aquesta carpeta. Si no hi ha cap carpeta seleccionada, s'intentarà desar en la mateixa carpeta on es troba el contingut." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY, "Memòria cau" @@ -8175,6 +8279,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_PLAY, "Afegir a la mescla i reproduir" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ADD_TO_MIXER_AND_PLAY, + "Afegeix aquesta pista d'àudio a un espai de seqüències d'àudio i reprodueix-la.\nSi no hi ha espai disponible, s'ignorarà." + ) /* Netplay */ @@ -8374,6 +8482,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_DAT_FILE, "Fitxer DAT d’arcade" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MANUAL_CONTENT_SCAN_DAT_FILE, + "Escull un fitxer XML DAT de Logiqx o MAME per anomenar automàticament els continguts identificats (MAME, FinalNBurn Neo, etç)." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_DAT_FILE_FILTER, "Filtre DAT d'arcade" @@ -9478,6 +9590,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SHADER_WATCH_FOR_CHANGES, "Aplica els canvis al fitxer de shaders en el disc de manera automàtica." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SHADER_WATCH_FOR_CHANGES, + "Cerca canvis en els fitxers dels shaders. Un cop hagis desat els canvis d'un shader en el disc, el shader es recompilarà automàticament i s'aplicarà el contingut." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_REMEMBER_LAST_DIR, "Recorda l'última carpeta de shaders que s'ha fet servir" @@ -9530,6 +9646,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SHADER_APPLY_CHANGES, "Aplica els canvis" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SHADER_APPLY_CHANGES, + "Els canvis de la configuració de shaders tindran efecte immediat. Fes servir aquesta opció en canviar la quantitat de passades, filtrat,..." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Paràmetres del shader" @@ -9684,6 +9804,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, "Desa les excepcions del nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, + "Desa un fitxer de configuració d’excepcions que s’aplicarà a tot el contingut carregat amb aquest nucli. Tindrà prioritat sobre la configuració principal." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE, "Elimina les personalitzacions del nucli" @@ -9700,6 +9824,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, "Elimina la personalització de les carpetes de contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + "Elimina el fitxer de configuració personalitzada que s'aplicarà a tot el contingut carregat de la mateixa carpeta que el fitxer actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, "Desa les excepcions del joc" @@ -9751,6 +9879,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_PAUSE, "Posa en pausa el mode expert d’assoliments" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ACHIEVEMENT_PAUSE, + "Posa en pausa el mode Hardcore pels assoliments en aquesta sessió. Aquest canvi activa els trucs, rebobinat, mode càmera lenta i carregar estats desats." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_RESUME, "Reprèn el mode expert d’assoliments" @@ -9759,6 +9891,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_SERVER_UNREACHABLE, "El servidor de RetroAchievements no està disponible" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ACHIEVEMENT_SERVER_UNREACHABLE, + "Un o més desbloquejos d'assoliments no han arribat al servidor. S'intentarà reenviar la informació mentre tinguis RetroArch obert." +) MSG_HASH( MENU_ENUM_LABEL_CHEEVOS_SERVER_DISCONNECTED, "El servidor de RetroAchievements no està disponible. Es seguirà intentant la connexió fins que es confirmi la comunicació o fins que es tanqui l'aplicació." @@ -10535,6 +10671,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_FULL_WIDTH_LAYOUT, "Utilitzar l'amplada completa" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_FULL_WIDTH_LAYOUT, + "Canvia la longitud i la posició dels elements del menú per aprofitar al màxim l'espai disponible en pantalla. Desactiva aquesta opció per fer servir una disposició clàssica de doble columna." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, "Filtre lineal" @@ -11312,6 +11452,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_SHOW_NAV_BAR, "Mostra la barra de navegació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_SHOW_NAV_BAR, + "Mostra sempre un menú de navegació amb accés directe. Permet canviar entre categories de forma ràpida. Recomanat per dispositius que facin servir pantalles tàctils." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_AUTO_ROTATE_NAV_BAR, "Gira automàticament la barra de navegació" @@ -11372,6 +11516,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_MATERIALUI, "Segona miniatura" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS_MATERIALUI, + "Miniatura auxiliar relacionada a cada element de la llista de reproducció. Es farà servir en funció del mode de miniatures que estigui seleccionat." + ) /* MaterialUI: Settings Options */ @@ -13190,6 +13338,10 @@ MSG_HASH( MSG_COULD_NOT_READ_STATE_FROM_MOVIE, "No es pot llegir l'estat des de la repetició." ) +MSG_HASH( + MSG_CRC32_CHECKSUM_MISMATCH, + "La suma CRC32 del fitxer no coincideix amb la suma de la repetició. És probable que la repetició no es mostri sincronitzada." + ) MSG_HASH( MSG_CUSTOM_TIMING_GIVEN, "Temps personalitzat donat" @@ -14752,6 +14904,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_OVERSCAN_CORRECTION_TOP, "Correcció d’overscan (superior)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_OVERSCAN_CORRECTION_TOP, + "Estableix la retallada de la imatge traient un nombre concret de línies (a partir de la part superior de la pantalla). Pot provocar defectes d'escalat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_OVERSCAN_CORRECTION_BOTTOM, "Correcció d’overscan (inferior)" @@ -14860,6 +15016,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_RESTART_KEY, "Reiniciar RetroArch" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_RESTART_KEY, + "Surt i reinicia RetroArch. És necessari per activar certes configuracions del menú (per exemple, canviar el controlador del menú)." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_BLOCK_FRAMES, "Bloquejant fotogrames" @@ -14892,6 +15052,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_BLOCK_TIMEOUT, "Temps límit pel bloqueig d'entrada" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_BLOCK_TIMEOUT, + "Indica el nombre de mil·lisegons a esperar per aconseguir una mostra completa d'entrada. Fes-ho servir en cas de tenir problemes en clicar diversos botons a la vegada (només a Android)." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, "Mostrar Reiniciar" diff --git a/intl/progress.h b/intl/progress.h index cf0ddcd1d2..d5ee3f474d 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 83 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 86 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ From 3637f49ddc4fdb7e6e139e32ebc271a3dcd672cf Mon Sep 17 00:00:00 2001 From: jecaro Date: Sun, 4 May 2025 18:01:03 +0200 Subject: [PATCH 040/175] Fix nmcli wifi driver - Use the password stored in the connection profile instead of asking each time to the user - `Disconnect` menu item wasn't shown even when connected When entering the Wi-Fi menu first, `nmcli_connection_info` is called with `NULL`. If we return `false` here, the menu doesn't show the `Disconnect` menu item even when the wifi is on and connected. - Don't consider wired connections when checking if the device is connected `cmd_file = popen("nmcli -f NAME c show --active | tail -n+2", "r");` That command returns all active connections, even the wired ones. That means that if the wifi is not connected but we have a wired connection, retroarch shows the Disconnect menu item to disconnect ... a non-existent wifi connection. --- network/drivers_wifi/nmcli.c | 120 ++++++++++++++++++++++------------- 1 file changed, 77 insertions(+), 43 deletions(-) diff --git a/network/drivers_wifi/nmcli.c b/network/drivers_wifi/nmcli.c index e864f91fe9..ae9609b67e 100644 --- a/network/drivers_wifi/nmcli.c +++ b/network/drivers_wifi/nmcli.c @@ -60,37 +60,34 @@ static void nmcli_stop(void *data) { } static bool nmcli_enable(void* data, bool enabled) { - /* semantics here are broken: nmcli_enable(..., false) is called - * on startup which is probably not what we want. */ + int ret = 0; -#if 0 if (enabled) - pclose(popen("nmcli radio wifi on", "r")); + ret = system("nmcli radio wifi on"); else - pclose(popen("nmcli radio wifi off", "r")); -#endif + ret = system("nmcli radio wifi off"); - return true; + return WIFEXITED(ret) && WEXITSTATUS(ret) == 0; } static bool nmcli_connection_info(void *data, wifi_network_info_t *netinfo) { FILE *cmd_file = NULL; char line[512]; + bool connected = false; - if (!netinfo) - return false; + cmd_file = popen("nmcli --terse --fields NAME,TYPE connection show --active | awk -F: '$2 ~ /^(wifi|802-11-wireless)$/ { print $1 }'", "r"); - cmd_file = popen("nmcli -f NAME c show --active | tail -n+2", "r"); - - if (fgets(line, sizeof(line), cmd_file)) + connected = fgets(line, sizeof(line), cmd_file) != NULL; + pclose(cmd_file); + if (netinfo) { + string_trim_whitespace(line); strlcpy(netinfo->ssid, line, sizeof(netinfo->ssid)); - netinfo->connected = true; - return true; + netinfo->connected = connected; } - return false; + return connected; } static void nmcli_scan(void *data) @@ -98,33 +95,44 @@ static void nmcli_scan(void *data) char line[512]; nmcli_t *nmcli = (nmcli_t*)data; FILE *cmd_file = NULL; + char cmd[256]; + int ret = 0; + bool has_profile = false; nmcli->scan.scan_time = time(NULL); if (nmcli->scan.net_list) RBUF_FREE(nmcli->scan.net_list); - cmd_file = popen("nmcli -f IN-USE,SSID dev wifi | tail -n+2", "r"); - while (fgets(line, 512, cmd_file)) + cmd_file = popen("nmcli --terse --fields IN-USE,SSID dev wifi", "r"); + while (fgets(line, sizeof(line), cmd_file)) { wifi_network_info_t entry; memset(&entry, 0, sizeof(entry)); + entry.connected = line[0] == '*'; + + line[0] = ' '; /* skip the '*' */ + line[1] = ' '; /* skip the ':' */ string_trim_whitespace_right(line); string_trim_whitespace_left(line); - if (!line || line[0] == '\0') + + if (line[0] == '\0') continue; - if (line[0] == '*') - { - entry.connected = true; - line[0] = ' '; - string_trim_whitespace_right(line); - string_trim_whitespace_left(line); - } - strlcpy(entry.ssid, line, sizeof(entry.ssid)); + /* Check if there is a profile for this ssid */ + snprintf(cmd, sizeof(cmd), + "nmcli --terse --fields NAME,TYPE connection show | grep '^%s:'", + entry.ssid); + ret = system(cmd); + has_profile = WIFEXITED(ret) && WEXITSTATUS(ret) == 0; + /* If there is a profile attached to that ssid, we assume it contains a + * password. If the password is wrong save_password will be set to false + * after a failing attempt to connect. */ + entry.saved_password = has_profile; + RBUF_PUSH(nmcli->scan.net_list, entry); } pclose(cmd_file); @@ -140,9 +148,9 @@ static bool nmcli_ssid_is_online(void *data, unsigned idx) { nmcli_t *nmcli = (nmcli_t*)data; - if (!nmcli->scan.net_list || idx >= RBUF_LEN(nmcli->scan.net_list)) - return false; - return nmcli->scan.net_list[idx].connected; + return nmcli->scan.net_list && + idx < RBUF_LEN(nmcli->scan.net_list) && + nmcli->scan.net_list[idx].connected; } static bool nmcli_connect_ssid(void *data, @@ -150,34 +158,60 @@ static bool nmcli_connect_ssid(void *data, { nmcli_t *nmcli = (nmcli_t*)data; char cmd[256]; - int ret, i; + int ret = 0; + unsigned int i = 0; + bool saved_password = false; + bool connected = false; if (!nmcli || !netinfo) return false; - snprintf(cmd, sizeof(cmd), - "nmcli dev wifi connect \"%s\" password \"%s\" 2>&1", - netinfo->ssid, netinfo->passphrase); - if ((ret = pclose(popen(cmd, "r"))) == 0) + if (netinfo->saved_password) + snprintf(cmd, sizeof(cmd), "nmcli connection up '%s'", netinfo->ssid); + else + /* This assumes the password and ssid don't contain single quotes */ + snprintf(cmd, sizeof(cmd), + "nmcli dev wifi connect '%s' password '%s'", + netinfo->ssid, netinfo->passphrase); + + ret = system(cmd); + connected = WIFEXITED(ret) && WEXITSTATUS(ret) == 0; + + for (i = 0; i < RBUF_LEN(nmcli->scan.net_list); i++) { - for (i = 0; i < RBUF_LEN(nmcli->scan.net_list); i++) - { - wifi_network_info_t* entry = &nmcli->scan.net_list[i]; - entry->connected = strcmp(entry->ssid, netinfo->ssid) == 0; - } + wifi_network_info_t *entry = &nmcli->scan.net_list[i]; + entry->connected = connected && strcmp(entry->ssid, netinfo->ssid) == 0; + if (strcmp(entry->ssid, netinfo->ssid) == 0) + /* If the connect attempt fails, it usually means the password is + * wrong. The user can now try another one. */ + entry->saved_password = connected; } - return true; + return connected; } static bool nmcli_disconnect_ssid(void *data, const wifi_network_info_t *netinfo) { + nmcli_t *nmcli = (nmcli_t*)data; char cmd[256]; - snprintf(cmd, sizeof(cmd), "nmcli c down \"%s\"", netinfo->ssid); - pclose(popen(cmd, "r")); + int ret = 0; + unsigned int i = 0; + bool disconnected = false; - return true; + snprintf(cmd, sizeof(cmd), "nmcli connection down '%s'", netinfo->ssid); + ret = system(cmd); + + disconnected = WIFEXITED(ret) && WEXITSTATUS(ret) == 0; + + for (i = 0; i < RBUF_LEN(nmcli->scan.net_list); i++) + { + wifi_network_info_t *entry = &nmcli->scan.net_list[i]; + if (strcmp(entry->ssid, netinfo->ssid) == 0) + entry->connected = !disconnected; + } + + return disconnected; } static void nmcli_tether_start_stop(void *a, bool b, char *c) { } From ba8b97041e83a8cc5bc572be3da94969c182d15f Mon Sep 17 00:00:00 2001 From: sonninnos Date: Mon, 5 May 2025 00:55:19 +0300 Subject: [PATCH 041/175] Auto swap interval correction --- retroarch.c | 36 +++++++++++++----------------------- runloop.c | 46 +++++++++++++++++++++++----------------------- runloop.h | 10 ++-------- 3 files changed, 38 insertions(+), 54 deletions(-) diff --git a/retroarch.c b/retroarch.c index 1a3644c87d..9a1203671b 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1381,11 +1381,8 @@ static void driver_adjust_system_rates( video_driver_state_t *video_st, settings_t *settings) { - struct retro_system_av_info *av_info = &video_st->av_info; - const struct retro_system_timing *info = - (const struct retro_system_timing*)&av_info->timing; - double input_sample_rate = info->sample_rate; - double input_fps = info->fps; + double input_sample_rate = video_st->av_info.timing.sample_rate; + double input_fps = video_st->av_info.timing.fps; float video_refresh_rate = settings->floats.video_refresh_rate; float audio_max_timing_skew = settings->floats.audio_max_timing_skew; unsigned video_swap_interval = settings->uints.video_swap_interval; @@ -1396,17 +1393,8 @@ static void driver_adjust_system_rates( /* Update video swap interval if automatic * switching is enabled */ - runloop_set_video_swap_interval( - vrr_runloop_enable, - (video_st->flags & VIDEO_FLAG_CRT_SWITCHING_ACTIVE) ? true : false, - video_swap_interval, - black_frame_insertion, - shader_subframes, - audio_max_timing_skew, - video_refresh_rate, - input_fps); - video_swap_interval = runloop_get_video_swap_interval( - video_swap_interval); + runloop_set_video_swap_interval(settings); + video_swap_interval = runloop_get_video_swap_interval(video_swap_interval); if (input_sample_rate > 0.0) { @@ -1559,6 +1547,9 @@ void drivers_init( menu_st->flags |= MENU_ST_FLAG_DATA_OWN; #endif + /* Content av_info based automatic swap interval must be set early. */ + runloop_set_video_swap_interval(settings); + /* Initialize video driver */ if (flags & DRIVER_VIDEO_MASK) { @@ -1583,16 +1574,15 @@ void drivers_init( runloop_st->frame_time_last = 0; } - /* Regular display refresh rate startup autoswitch based on content av_info */ + /* Regular display refresh rate startup autoswitch based on content av_info. */ if ( flags & (DRIVER_VIDEO_MASK | DRIVER_AUDIO_MASK) && !(runloop_st->flags & RUNLOOP_FLAG_IS_INITED)) { - struct retro_system_av_info *av_info = &video_st->av_info; - float refresh_rate = av_info->timing.fps; - unsigned autoswitch_refresh_rate = settings->uints.video_autoswitch_refresh_rate; - bool exclusive_fullscreen = settings->bools.video_fullscreen && !settings->bools.video_windowed_fullscreen; - bool windowed_fullscreen = settings->bools.video_fullscreen && settings->bools.video_windowed_fullscreen; - bool all_fullscreen = settings->bools.video_fullscreen || settings->bools.video_windowed_fullscreen; + float refresh_rate = video_st->av_info.timing.fps; + unsigned autoswitch_refresh_rate = settings->uints.video_autoswitch_refresh_rate; + bool exclusive_fullscreen = settings->bools.video_fullscreen && !settings->bools.video_windowed_fullscreen; + bool windowed_fullscreen = settings->bools.video_fullscreen && settings->bools.video_windowed_fullscreen; + bool all_fullscreen = settings->bools.video_fullscreen || settings->bools.video_windowed_fullscreen; /* Making a switch from PC standard 60 Hz to NTSC 59.94 is excluded by the last condition. */ if ( (refresh_rate > 0.0f) diff --git a/runloop.c b/runloop.c index 55313076f0..68393a588d 100644 --- a/runloop.c +++ b/runloop.c @@ -4390,29 +4390,28 @@ float runloop_get_fastforward_ratio( } void runloop_set_video_swap_interval( - bool vrr_runloop_enable, - bool crt_switching_active, - unsigned swap_interval_config, - unsigned black_frame_insertion, - unsigned shader_subframes, - float audio_max_timing_skew, - float video_refresh_rate, - double input_fps) + settings_t *settings) { - runloop_state_t *runloop_st = &runloop_state; - float core_hz = input_fps; - float timing_hz = crt_switching_active ? - input_fps : video_refresh_rate; - float swap_ratio; - unsigned swap_integer; - float timing_skew; + runloop_state_t *runloop_st = &runloop_state; + video_driver_state_t *video_st = video_state_get_ptr(); + float video_refresh_rate = settings->floats.video_refresh_rate; + float audio_max_timing_skew = settings->floats.audio_max_timing_skew; + float input_fps = video_st->av_info.timing.fps; + float timing_fps = (video_st->flags & VIDEO_FLAG_CRT_SWITCHING_ACTIVE) + ? input_fps : video_refresh_rate; + float swap_ratio = 1; + float timing_skew = 0; + unsigned swap_interval_config = settings->uints.video_swap_interval; + unsigned black_frame_insertion = settings->uints.video_black_frame_insertion; + unsigned shader_subframes = settings->uints.video_shader_subframes; + unsigned swap_integer = 1; + bool vrr_runloop_enable = settings->bools.vrr_runloop_enable; /* If automatic swap interval selection is * disabled, just record user-set value */ if (swap_interval_config != 0) { - runloop_st->video_swap_interval_auto = - swap_interval_config; + runloop_st->video_swap_interval_auto = swap_interval_config; return; } @@ -4425,11 +4424,12 @@ void runloop_set_video_swap_interval( * > If BFI is active set swap interval to 1 * > If Shader Subframes active, set swap interval to 1 */ if ( (vrr_runloop_enable) - || (core_hz > timing_hz) - || (core_hz <= 0.0f) - || (timing_hz <= 0.0f) || (black_frame_insertion) - || (shader_subframes > 1)) + || (shader_subframes > 1) + || (input_fps > timing_fps) + || (input_fps <= 0.0f) + || (timing_fps <= 0.0f) + ) { runloop_st->video_swap_interval_auto = 1; return; @@ -4437,7 +4437,7 @@ void runloop_set_video_swap_interval( /* Check whether display refresh rate is an integer * multiple of core fps (within timing skew tolerance) */ - swap_ratio = timing_hz / core_hz; + swap_ratio = timing_fps / input_fps; swap_integer = (unsigned)(swap_ratio + 0.5f); /* > Sanity check: swap interval must be in the @@ -4449,7 +4449,7 @@ void runloop_set_video_swap_interval( return; } - timing_skew = fabs(1.0f - core_hz / (timing_hz / (float)swap_integer)); + timing_skew = fabs(1.0f - input_fps / (timing_fps / (float)swap_integer)); runloop_st->video_swap_interval_auto = (timing_skew <= audio_max_timing_skew) ? diff --git a/runloop.h b/runloop.h index 40f104e28b..e9c72b72dc 100644 --- a/runloop.h +++ b/runloop.h @@ -394,14 +394,8 @@ float runloop_get_fastforward_ratio( struct retro_fastforwarding_override *fastmotion_override); void runloop_set_video_swap_interval( - bool vrr_runloop_enable, - bool crt_switching_active, - unsigned swap_interval_config, - unsigned black_frame_insertion, - unsigned shader_subframes, - float audio_max_timing_skew, - float video_refresh_rate, - double input_fps); + settings_t *settings); + unsigned runloop_get_video_swap_interval( unsigned swap_interval_config); From 2ddd9330fefd32e57fb105a82532e96ff0845c59 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Mon, 5 May 2025 01:00:55 +0300 Subject: [PATCH 042/175] Frame delay + swap interval correction --- gfx/video_driver.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 436b018526..7fb5f83c65 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -4573,9 +4573,6 @@ void video_frame_delay(video_driver_state_t *video_st, || (runloop_st->flags & RUNLOOP_FLAG_SLOWMOTION) || (runloop_st->flags & RUNLOOP_FLAG_FASTMOTION); - /* Black frame insertion + swap interval multiplier */ - refresh_rate = (refresh_rate / (video_bfi + 1.0f) / video_swap_interval / shader_subframes); - /* Treat values 20+ as frame time percentage */ if (video_frame_delay >= 20) video_frame_delay = 1 / refresh_rate * 1000 * (video_frame_delay / 100.0f); @@ -4583,6 +4580,9 @@ void video_frame_delay(video_driver_state_t *video_st, else if (video_frame_delay == 0 && settings->bools.video_frame_delay_auto) video_frame_delay = 1 / refresh_rate * 1000 * 0.75f; + /* Black frame insertion + swap interval multiplier */ + refresh_rate = (refresh_rate / (video_bfi + 1.0f) / video_swap_interval / shader_subframes); + if (settings->bools.video_frame_delay_auto) { static uint8_t skip_update = 0; From 3bfed628ff4ff289722ff046cc12075ef6e57f51 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 6 May 2025 00:16:38 +0000 Subject: [PATCH 043/175] Fetch translations from Crowdin --- intl/msg_hash_ar.h | 8 ++--- intl/msg_hash_be.h | 8 ++--- intl/msg_hash_ca.h | 76 ++++++++++++++++++++++++++++++++++++++++--- intl/msg_hash_chs.h | 8 ++--- intl/msg_hash_cht.h | 8 ++--- intl/msg_hash_cs.h | 8 ++--- intl/msg_hash_de.h | 10 +++++- intl/msg_hash_es.h | 14 +++++++- intl/msg_hash_fi.h | 10 +++++- intl/msg_hash_fr.h | 10 +++++- intl/msg_hash_gl.h | 8 ++--- intl/msg_hash_hu.h | 8 ++--- intl/msg_hash_it.h | 10 +++++- intl/msg_hash_ja.h | 8 ++--- intl/msg_hash_ko.h | 8 ++--- intl/msg_hash_pl.h | 10 +++++- intl/msg_hash_pt_br.h | 12 ++++--- intl/msg_hash_ru.h | 8 ++--- intl/msg_hash_sv.h | 8 ++--- intl/msg_hash_tr.h | 10 +++++- intl/msg_hash_uk.h | 8 ++--- intl/progress.h | 6 ++-- 22 files changed, 198 insertions(+), 66 deletions(-) diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index 30bb13e6d8..de7ef7137b 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -4038,6 +4038,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "رفع مستوى الصور المصغرة تلقائياً مع عرض / ارتفاع أصغر من القيمة المحددة. يحسن جودة الصورة. له تأثير متوسط للأداء." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "تمكين تعبئة المساحة غير المستخدمة في الصور المصغرة مع خلفية صلبة. هذا يضمن حجم عرض موحد لجميع الصور، وتحسين مظهر القائمة عند عرض الصور المصغرة للمحتوى المختلط مع أبعاد أساسية مختلفة." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "حركة نص المؤشر" @@ -6868,10 +6872,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "يعرض صورة مصغرة ثانوية عند استخدام \"قائمة\" نوع أوضاع عرض الصور المصغرة لقائمة التشغيل. ينطبق هذا الإعداد فقط عندما يكون للشاشة عرض فيزيائي كافٍ لإظهار مصغرتين." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "ارسم خلفيات مصغرة" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "تمكين تعبئة المساحة غير المستخدمة في الصور المصغرة مع خلفية صلبة. هذا يضمن حجم عرض موحد لجميع الصور، وتحسين مظهر القائمة عند عرض الصور المصغرة للمحتوى المختلط مع أبعاد أساسية مختلفة." diff --git a/intl/msg_hash_be.h b/intl/msg_hash_be.h index fe41d19669..8c96d5b567 100644 --- a/intl/msg_hash_be.h +++ b/intl/msg_hash_be.h @@ -7054,6 +7054,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Аўтаматычна маштабаваць эскізы з шырынёй/вышынёй менш зададзенага значэння. Падвышае якасць малюнка, умерана ўплываючы на ​​прадукцыйнасць." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Уключае запаўненне вольнай прасторы вакол мініяцюр суцэльным фонам. Забяспечвае адзіную памернасць для ўсіх малюнкаў, паляпшаючы адлюстраванне меню пры праглядзе эскізаў рознага памеру." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Анімацыя бягучага радка" @@ -11868,10 +11872,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Уключае дадатковы эскіз пры праглядзе плэйліста ў рэжыме 'Спіс'. Настройка прымяняецца толькі калі шырыні экрана дастаткова для адлюстравання двух эскізаў." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Дадаваць фон да эскізаў" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Уключае запаўненне вольнай прасторы вакол мініяцюр суцэльным фонам. Забяспечвае адзіную памернасць для ўсіх малюнкаў, паляпшаючы адлюстраванне меню пры праглядзе эскізаў рознага памеру." diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index a809586e2d..b4147befce 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2815,6 +2815,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES, "Estableix quants fotogrames de CPU poden anar per davant de la GPU quan s'usa 'Sincronització dura de GPU'." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_HARD_SYNC_FRAMES, + "Escull quants fotogrames pot anar la CPU per davant de la GPU si es fa servir l'opció 'Sincronia estricta de CPU'. El valor màxim és 3.\n 0: Sincronitza immediatament a la GPU.\n 1: Sincronitza amb el fotograma anterior.\n 2: ..." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VRR_RUNLOOP_ENABLE, "Sincronització a la velocitat de fotogrames del contingut exacta (S-Sync, FreeSync)" @@ -2940,6 +2944,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_VOLUME, "Volum del so (en dB). 0 dB és el volum normal, sense cap guany afegit." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_AUDIO_VOLUME, + "Volum de l'àudio, expressat en decibels dB. 0 dB és el volum normal, quan no s'aplica cap guany. El guany es pot controlar en temps real amb Pujar/Baixar volum." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, "Guany de volum del mesclador (dB)" @@ -4013,6 +4021,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, "Focus de Joc (commuta)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_GAME_FOCUS_TOGGLE, + "Activa o desactiva el mode 'Focus de Joc'. Quan el contingut té el focus es desactiven les dreceres de teclat (l'entrada completa de teclat es passa al nucli que s'executa) i es captura el ratolí." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, "Pantalla completa (commuta)" @@ -4472,6 +4484,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHECK_FOR_MISSING_FIRMWARE, "Comprova que el microprogramari necessari estigui disponible abans de carregar el contingut." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_CHECK_FOR_MISSING_FIRMWARE, + "Diversos nuclis poden necessitar fitxers de firmware o de bios. Si aquesta opció està activada, RetroArch no permetrà executar el nucli si algun d'aquests fitxers està absent." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_OPTION_CATEGORY_ENABLE, "Categories en les opcions dels nuclis" @@ -4573,6 +4589,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONFIG_SAVE_ON_EXIT, "S'han desat els canvis al fitxer de configuració en tancar RetroArch." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_CONFIG_SAVE_ON_EXIT, + "Desa els canvis al fitxer de configuració en sortir. Això és útil pels canvis fets en el menú. Sobreescriu el fitxer de configuració, #include's i comentaris no es desen." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_SAVE_ON_EXIT, "Desa els fitxers d'assignació en sortir" @@ -4684,6 +4704,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX, "Augmenta automàticament l'índex de l'estat desat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_INDEX, + "Abans de desar un estat, l'índex augmenta automàticament. En carregar el contingut, l'índex s'assignarà al valor més alt possible." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REPLAY_AUTO_INDEX, "Augmenta automàticament l'índex de repeticions" @@ -4894,6 +4918,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_LAST_START_DIRECTORY, "Recorda l'última carpeta on has desat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, + "Obre l'explorador de fitxers a l'última localització que s'ha fet servir quan es carrega contingut des de la carpeta inicial. Nota: La localització torna al seu valor predeterminat en reiniciar RetroArch." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Fes servir el reproductor integrat" @@ -5999,6 +6027,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SAVESTATE_RESUME, "Reprendre contingut després d'utilitzar un desat ràpid" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SAVESTATE_RESUME, + "Tanca automàticament el menú i reprèn el contingut després de desar o carregar un estat. Deshabilitar aquesta opció pot millorar el rendiment en maquinari molt lent." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INSERT_DISK_RESUME, "Reprendre contingut al canviar de disc" @@ -6910,6 +6942,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Llindar d'escalat de miniatures" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, + "Escala automàticament les imatges amb una amplada/alçada més petita que el valor especificat. Millora la qualitat de la imatge. Té un efecte moderat en el rendiment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Animació de text en moviment" @@ -7179,6 +7215,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_SUMMARY, "Resum d'inici" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_SUMMARY, + "Mostra informació sobre el joc que s'està carregat i del progrés de l'usuari.\n'Tots els jocs identificats' mostrarà el resum d'aquells jocs que no tenen assoliments publicats." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_SUMMARY_ALLGAMES, "Tots els jocs identificats" @@ -7422,6 +7462,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ALLOW_SLAVES, "Permet clients en mode esclau" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_ALLOW_SLAVES, + "Permet les connexions en el mode esclau. Els clients en mode esclau necessiten poca potència de processament en el seu maquinari, però patiran significativament si hi ha latència a la xarxa." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_REQUIRE_SLAVES, "Bloqueja els clients sense el mode esclau" @@ -7549,10 +7593,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SHOW_EXPERIMENTAL_CORES, "Mostra els nuclis experimentals" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_UPDATER_SHOW_EXPERIMENTAL_CORES, + "Inclou nuclis experimentals a la llista de nuclis per descarregar. Aquests nuclis solen estar en desenvolupament i solen tenir funcions de testatge, i no es recomanen per l'ús general." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_BACKUP, "Desar una còpia dels nuclis en actualitzar-los" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_BACKUP, + "Crea automàticament una còpia de seguretat dels nuclis instal·lats quan es faci una actualització en línia. Així es pot recuperar fàcilment un nucli funcional en cas que una actualització inclogui una regressió." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_BACKUP_HISTORY_SIZE, "Mida de l'historial de còpies de seguretat del nucli" @@ -7724,10 +7776,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_RUNTIME_TYPE, "Etiqueta de temps de joc a les llistes" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SUBLABEL_RUNTIME_TYPE, + "Escull quin tipus de registre del temps de joc es mostra a la llista de reproducció. \nCal activar el registre dins de la configuració." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_LAST_PLAYED_STYLE, "Estil de data i temps de 'Última reproducció'" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SUBLABEL_LAST_PLAYED_STYLE, + "Escull l'estil de la data i l'hora que es mostren a l'etiqueta 'Última partida'. Les opcions AM/PM tenen un petit impacte en el rendiment en algunes plataformes." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_FUZZY_ARCHIVE_MATCH, "Cerca aproximada de fitxers" @@ -8191,6 +8251,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVEFILE_DIRECTORY, "Desa tots els estats desats en aquesta carpeta. Si no hi ha una carpeta assignada, es desaran en la carpeta del contingut." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SAVEFILE_DIRECTORY, + "Desa tots els fitxers d'estats desats (*.srm) en aquesta carpeta. Això inclou fitxers relacionats com .rt, .psrm,... Aquesta carpeta serà ignorada si es fa servir la línia d'ordres." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY, "Estats desats" @@ -9666,6 +9730,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHADER_NUM_PASSES, "Augmenta o disminueix la quantitat de passes de canalització de shaders. Shaders separats es poden vincular a cada passa de canalització i configurar el seu escalat i filtrat." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_SHADER_PASS, + "Ruta cap a la carpeta de shaders. Tots els shaders han de ser del mateix tipus (per exemple, Cg, GLSL o Slang). Canvia el directori de shaders per indicar on el navegador començarà a cercar." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FILTER, "Filtre" @@ -11500,10 +11568,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Mostra les miniatures secundàries en les llistes" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Genera fons de les miniatures" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_THUMBNAILS_MATERIALUI, "Miniatura principal" @@ -14912,6 +14976,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_OVERSCAN_CORRECTION_BOTTOM, "Correcció d’overscan (inferior)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_OVERSCAN_CORRECTION_BOTTOM, + "Estableix la retallada de la imatge traient un nombre concret de línies (a partir de la part inferior de la pantalla). Pot provocar defectes d'escalat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SUSTAINED_PERFORMANCE_MODE, "Mode de rendiment sostingut" diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 240d4eb98e..ec39b56de4 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -6830,6 +6830,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "自动放大小于指定宽度/高度的缩略图。提高图像质量。有小幅的性能影响。" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "启用缩略图边框,用颜色填充。借此统一缩略图显示尺寸,改进浏览多种不同尺寸缩略图时的菜单外观。" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "滚动字幕动画" @@ -11552,10 +11556,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "缩略图使用列表查看模式时,显示第二张缩略图。此设置仅在屏幕足够宽时有效。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "绘制缩略图背景" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "启用缩略图边框,用颜色填充。借此统一缩略图显示尺寸,改进浏览多种不同尺寸缩略图时的菜单外观。" diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 506a4d7591..002c9172b9 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -6698,6 +6698,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "設定預覽縮圖的放大上限值(像素), 當預覽縮圖模糊不清時可提高此選項, 提高可能會降低效能。" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "預覽縮圖的背景填充顏色, 改善瀏覽列表時預覽縮圖大小不一的情況。" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "滾動文字動畫 (跑馬燈)" @@ -11596,10 +11600,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "檢視設定主要時, 僅限螢幕寬度足夠才顯示。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "預覽縮圖背景填充" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "預覽縮圖的背景填充顏色, 改善瀏覽列表時預覽縮圖大小不一的情況。" diff --git a/intl/msg_hash_cs.h b/intl/msg_hash_cs.h index 48ae495554..8b6fa3d61d 100644 --- a/intl/msg_hash_cs.h +++ b/intl/msg_hash_cs.h @@ -7038,6 +7038,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Automatické zvětšení velikosti miniatur s šířkou/výškou menší než zadaná hodnota. Zlepšuje kvalitu obrazu. Má mírný dopad na výkon." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Umožňuje vyplnit nevyužité místo v miniaturách s pevným pozadím. Tím je zajištěna jednotná velikost zobrazení všech obrázků, což zlepšuje vzhled nabídky při zobrazení miniatur se smíšeným obsahem a různými základními rozměry." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Animace textu v menu" @@ -11784,10 +11788,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Zobrazí sekundární miniaturu při použití režimů zobrazení miniatur playlistu typu 'Seznam'. Toto nastavení se použije pouze v případě, že má obrazovka dostatečnou fyzickou šířku pro zobrazení dvou miniatur." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Vykreslovat pozadí miniatur" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Umožňuje vyplnit nevyužité místo v miniaturách s pevným pozadím. Tím je zajištěna jednotná velikost zobrazení všech obrázků, což zlepšuje vzhled nabídky při zobrazení miniatur se smíšeným obsahem a různými základními rozměry." diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index ed53a72286..93198867cf 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -6986,6 +6986,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Skaliert automatisch Vorschaubilder mit einer Breite/Höhe, die kleiner als der angegebene Wert ist. Verbessert die Bildqualität. Bringt moderate Leistungseinbußen." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Vorschaubildhintergründe" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Ermöglicht das Auffüllen von nicht verwendetem Platz in Vorschaubildern mit einem einfarbigen Hintergrund. Dies gewährleistet eine einheitliche Anzeigegröße für alle Bilder und verbessert das Erscheinungsbild des Menüs beim Anzeigen von Vorschaubildern mit unterschiedlichen Basisabmessungen." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Lauftext-Animation" @@ -11626,7 +11634,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Vorschaubilder mit Hintergrund anzeigen" + "Vorschaubildhintergründe" ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index ea6c557409..0a1ec877d3 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -7102,6 +7102,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Escala automáticamente las miniaturas cuyo ancho/alto sea inferior al valor especificado. Mejora la calidad de la imagen afectando moderadamente al rendimiento." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Fondos de miniaturas" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Permite cubrir el espacio no utilizado en las miniaturas con un fondo plano. Esto garantiza que todas las imágenes tengan un tamaño uniforme, mejorando la apariencia de los menús al ver miniaturas de contenidos y dimensiones base distintos." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Animación de textos en movimiento" @@ -11878,7 +11886,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Generar fondos de miniaturas" + "Fondos de miniaturas" ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, @@ -14858,6 +14866,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Debes pausar o desactivar el modo de logros Hardcore para poder cargar un guardado rápido." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "Debes pausar o desactivar el modo de logros Hardcore para poder cargar guardados en formato .SRM." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "Se ha cargado un guardado rápido. Los logros Hardcore han sido desactivados para esta sesión." diff --git a/intl/msg_hash_fi.h b/intl/msg_hash_fi.h index ec8ff433bc..ac6fd98407 100644 --- a/intl/msg_hash_fi.h +++ b/intl/msg_hash_fi.h @@ -6094,6 +6094,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Suurenna automaattisesti esikatselukuvat, joiden leveys / korkeus on pienempi kuin määritetty arvo. Parantaa kuvanlaatua. Vaikuttaa kohtalaisesti suorituskykyyn." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Pikkukuvan taustat" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Mahdollistaa käyttämättömän tilan täyttämisen kiinteällä taustalla esikatselukuvissa. Tämä takaa tasaisen esityskoon kaikille kuville ja parantaa valikon ulkoasua katsottaessa erilaisia esikatselukuvia, joilla on vaihtelevat perusmitat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Tekstinauhan animaatio" @@ -10574,7 +10582,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Piirrä esikatselukuvan taustat" + "Pikkukuvan taustat" ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 8846aa914c..7290d16910 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -7062,6 +7062,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Agrandit automatiquement les miniatures à une largeur/hauteur inférieure à la valeur spécifiée. Améliore la qualité de l'image. A un impact modéré sur les performances." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Arrière-plans pour les miniatures" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Active le remplissage de l'espace inutilisé autour des miniatures avec une couleur de fond. Cela assure une taille d'affichage uniforme pour toutes les images, améliorant l'apparence du menu lors de l'affichage des miniatures de contenu mixte avec différentes dimensions de base." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Animation du défilement de texte" @@ -11854,7 +11862,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Afficher un fond pour les miniatures" + "Arrière-plans pour les miniatures" ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, diff --git a/intl/msg_hash_gl.h b/intl/msg_hash_gl.h index e71745d6a5..322101ea34 100644 --- a/intl/msg_hash_gl.h +++ b/intl/msg_hash_gl.h @@ -7006,6 +7006,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Aumenta automaticamente as imaxes en miniatura cunha anchura/alto menor que o valor especificado. Mellora a calidade da imaxe. Ten un impacto moderado no rendemento." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Permite o recheo de espazo non utilizado nas imaxes en miniatura cun fondo sólido. Isto garante un tamaño de visualización uniforme para todas as imaxes, mellorando o aspecto do menú cando se ven miniaturas de contido mixto con diferentes dimensións de base." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Animación de texto ticker" @@ -11732,10 +11736,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Mostra unha miniatura secundaria cando se usan os modos de visualización de miniaturas da lista de reprodución tipo \"Lista\". Esta configuración só se aplica cando a pantalla ten suficiente ancho físico para mostrar dúas miniaturas." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Debuxa fondos de miniaturas" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Permite o recheo de espazo non utilizado nas imaxes en miniatura cun fondo sólido. Isto garante un tamaño de visualización uniforme para todas as imaxes, mellorando o aspecto do menú cando se ven miniaturas de contido mixto con diferentes dimensións de base." diff --git a/intl/msg_hash_hu.h b/intl/msg_hash_hu.h index 1394c7ffec..a6e6eb191e 100644 --- a/intl/msg_hash_hu.h +++ b/intl/msg_hash_hu.h @@ -7090,6 +7090,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "A megadott értéknél kevésbé széles/magas bélyegképeket automatikusan felskálázza. Javítja a képminőséget, mérsékelt hatása van a teljesítményre." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "A bélyegképek körüli felhasználatlan terület kitöltése tömör háttérszínnel. Ez javítja a menü megjelenését, ha változó méretű bélyegképek szerepelnek benne, mert azokat egyenletes méretben jeleníti meg." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Gördülőszalag animációja" @@ -11676,10 +11680,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Második bélyegkép megjelenítése \"Lista\" típusú nézetekben. Csak akkor érvényes, ha a képernyő ténylegesen elég széles két bélyegképhez." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Háttér a bélyegképekhez" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "A bélyegképek körüli felhasználatlan terület kitöltése tömör háttérszínnel. Ez javítja a menü megjelenését, ha változó méretű bélyegképek szerepelnek benne, mert azokat egyenletes méretben jeleníti meg." diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 00817ec338..8b9e1f1b11 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -7022,6 +7022,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Migliora automaticamente le immagini delle copertine con una larghezza/altezza inferiore al valore specificato. Migliora la qualità dell'immagine. Ha un impatto moderato sulle prestazioni." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Sfondi delle miniature" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Abilita il riempimento di spazio inutilizzato nelle immagini delle copertine con uno sfondo solido. Ciò assicura una dimensione di visualizzazione uniforme per tutte le immagini, migliorando l'aspetto del menu quando si visualizzano le copertine di contenuto vario con diverse dimensioni di base." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Animazione del testo scorrevole" @@ -11734,7 +11742,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Genera gli sfondi delle copertine" + "Sfondi delle miniature" ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 5fef924962..da5d08d47e 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -6822,6 +6822,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "指定された値より小さい幅/高さの画像を自動的に拡大し、画質を改善します。パフォーマンスにやや影響します。" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "サムネイル画像の未使用スペースを単色の背景で塗りつぶします。すべての画像の表示サイズが均一になることで、基本サイズが異なるコンテンツが混在した際のメニューの見栄えを改善します。" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "ティッカーテキストのアニメーション" @@ -11524,10 +11528,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "[リスト] 形式のサムネイル表示モードを使用している場合、セカンダリーサムネイルを表示します。この設定は画面に 2 つのサムネイルを表示するのに十分な幅がある場合にのみ適用されます。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "サムネイルの背景を描画" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "サムネイル画像の未使用スペースを単色の背景で塗りつぶします。すべての画像の表示サイズが均一になることで、基本サイズが異なるコンテンツが混在した際のメニューの見栄えを改善します。" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index bd4624f956..85bce7ca63 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -7146,6 +7146,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "지정된 값보다 작은 크기의 미리보기 이미지를 자동으로 확대합니다. 이미지 품질이 개선됩니다. 약간의 성능 저하가 있을 수 있습니다." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "미리보기 테두리에 단색의 테두리 배경을 추가합니다. 미리보기를 항상 일정한 크기로 표시하여 미리보기의 크기 또는 비율이 일정하지 않더라도 일관된 모습을 유지합니다." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "한 줄 텍스트 애니메이션" @@ -11948,10 +11952,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "미리보기를 '목록' 형식으로 표시할 때 두 번째 미리보기를 표시합니다. 두 번째 미리보기를 표시할 공간이 부족할 경우 표시되지 않습니다." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "미리보기에 배경 추가" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "미리보기 테두리에 단색의 테두리 배경을 추가합니다. 미리보기를 항상 일정한 크기로 표시하여 미리보기의 크기 또는 비율이 일정하지 않더라도 일관된 모습을 유지합니다." diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index 2c7a3c7267..420bb0eb4c 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -6182,6 +6182,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Automatycznie przeskaluj miniatury o szerokości / wysokości mniejszej niż określona wartość. Poprawia jakość obrazu. Ma umiarkowany wpływ na wydajność." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Tła miniaturek" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Umożliwia wypełnianie nieużywanego miejsca w obrazach miniatur jednolitym tłem. Zapewnia to jednolity rozmiar wyświetlania wszystkich obrazów, poprawiając wygląd menu podczas oglądania mieszanych miniatur zawartości o różnych podstawowych wymiarach." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Animacja paska tekstu" @@ -10362,7 +10370,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Rysuj tła miniatur" + "Tła miniaturek" ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 6005798949..8e1592dc3a 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -6222,6 +6222,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Redimensiona automaticamente imagens em miniatura com altura e/ou largura menor do que o valor especificado. Tem um impacto moderado no desempenho." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Preenche o espaço não utilizado nas imagens em miniatura com um fundo sólido. Isso garante um tamanho de exibição uniforme para todas as imagens, melhorando a aparência do menu ao exibir itens com miniaturas de diferentes tamanhos." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Animação de textos longos" @@ -10484,10 +10488,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Exibe uma miniatura secundária ao usar formatos de lista de miniaturas nas listas de reprodução. Observe que essa configuração só terá efeito se a tela tiver largura o suficiente para exibir duas miniaturas." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Gerar fundos de miniatura" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Preenche o espaço não utilizado nas imagens em miniatura com um fundo sólido. Isso garante um tamanho de exibição uniforme para todas as imagens, melhorando a aparência do menu ao exibir itens com miniaturas de diferentes tamanhos." @@ -13238,6 +13238,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Você deve pausar ou desativar as conquistas no modo hardcore para carregar jogos salvos." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "Você deve pausar ou desativar o Modo Hardcore de Conquistas para carregar saves srm." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "Um jogo salvo foi carregado. Conquistas no Modo Hardcore foram desativadas para a sessão atual." diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 851fca550e..6d8f659317 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -7134,6 +7134,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Автоматически масштабировать эскизы с шириной/высотой меньше заданного значения. Повышает качество изображения, умеренно влияя на производительность." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Включает заполнение свободного пространства вокруг миниатюр сплошным фоном. Обеспечивает единую размерность для всех изображений, улучшая отображение меню при просмотре эскизов разного размера." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Анимация бегущей строки" @@ -11904,10 +11908,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Включает дополнительный эскиз при просмотре плейлиста в режиме 'Список'. Настройка применяется только если ширины экрана достаточно для отображения двух эскизов." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Добавлять фон к эскизам" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Включает заполнение свободного пространства вокруг миниатюр сплошным фоном. Обеспечивает единую размерность для всех изображений, улучшая отображение меню при просмотре эскизов разного размера." diff --git a/intl/msg_hash_sv.h b/intl/msg_hash_sv.h index 3486f05f15..9cdec01215 100644 --- a/intl/msg_hash_sv.h +++ b/intl/msg_hash_sv.h @@ -6502,6 +6502,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Uppskala automatiskt miniatyrbilder med en bredd/höjd som är mindre än det angivna värdet. Förbättrar bildkvalitén. Har en måttlig inverkan på prestanda." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Möjliggör utfyllnad av oanvänt utrymme i miniatyrbilder med en solid bakgrund. Detta säkerställer en enhetlig visningsstorlek för alla bilder, vilket förbättrar menyutseendet när du tittar på miniatyrbilder av blandat innehåll med olika basmått." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Rull-textanimering" @@ -10564,10 +10568,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Visar en sekundär miniatyrbild när du använder miniatyrvisningslägen av typen 'Lista'. Den här inställningen gäller endast när skärmen har tillräcklig fysisk bredd för att visa två miniatyrer." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Rita miniatyrbakgrunder" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Möjliggör utfyllnad av oanvänt utrymme i miniatyrbilder med en solid bakgrund. Detta säkerställer en enhetlig visningsstorlek för alla bilder, vilket förbättrar menyutseendet när du tittar på miniatyrbilder av blandat innehåll med olika basmått." diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 34c8355fb1..debf7a2448 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -7106,6 +7106,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Belirtilen değerden daha küçük bir genişlik/yüksekliğe sahip küçük resim görüntülerini otomatik olarak yükseltin. Görüntü kalitesini artırır. Orta düzeyde performansa eksi etkisi vardır." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Küçük Resim Arkaplanları" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Sağlam bir arka plana sahip küçük resim görüntülerinde kullanılmayan alanın dolmasını sağlar. Bu, tüm görüntüler için tekdüze bir görüntü boyutu sağlayarak, farklı taban boyutlarına sahip karışık içerikli küçük resimleri görüntülerken menü görünümünü iyileştirir." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Kayan Yazı Animasyonu" @@ -11954,7 +11962,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Küçük Resim Arkaplan Çizimi" + "Küçük Resim Arkaplanları" ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index e1d3c2bc70..a299da4425 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -7082,6 +7082,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Автоматично збільшувати мініатюри зображень з шириною/висотою менше, ніж зазначене значення. Покращує якість зображення. Має помірний вплив продуктивності." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Дозволяє додавати невикористаний простір в мініатюрах із суцільним фоном. Це забезпечує однорідний розмір відображення для всіх зображень, покращує зовнішній вигляд меню, при перегляді змішаних мініатюр вмісту з різними базовими розмірами." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Анімація тексту рухомого рядка" @@ -11956,10 +11960,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Відображає вторинні мініатюри при використанні режимів перегляду списку відтворення. Цей параметр застосовується лише тоді, коли екран має достатню фізичну ширину, щоб показати два ескізи." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "Малювати тло мініатюри" - ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Дозволяє додавати невикористаний простір в мініатюрах із суцільним фоном. Це забезпечує однорідний розмір відображення для всіх зображень, покращує зовнішній вигляд меню, при перегляді змішаних мініатюр вмісту з різними базовими розмірами." diff --git a/intl/progress.h b/intl/progress.h index d5ee3f474d..7ebd5691e9 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 86 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 88 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -47,7 +47,7 @@ #define LANGUAGE_PROGRESS_ESPERANTO_APPROVED 0 /* Spanish */ -#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 100 #define LANGUAGE_PROGRESS_SPANISH_APPROVED 91 /* Persian */ @@ -143,7 +143,7 @@ #define LANGUAGE_PROGRESS_TATAR_APPROVED 0 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ From 67a2793ab465dbf10e2610ea94b51d286cc87f08 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 7 May 2025 00:16:24 +0000 Subject: [PATCH 044/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 84 ++++++++++++++++++++++++++++++++++++++++++++++ intl/msg_hash_ko.h | 12 +++++++ intl/msg_hash_uk.h | 8 +++++ intl/progress.h | 6 ++-- 4 files changed, 107 insertions(+), 3 deletions(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index b4147befce..61be855fb0 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -3039,6 +3039,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY, "Latència de l'àudio (ms)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_LATENCY, + "Latència màxima d'àudio en mil·lisegons. El controlador intentarà mantenir la latència real en un 50% d'aquest valor. Aquesta opció no es complirà si el controlador d'àudio no pot produir aquesta latència." + ) #ifdef HAVE_MICROPHONE /* Settings > Audio > Input */ @@ -3090,6 +3094,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_WASAPI_EXCLUSIVE_MODE, "Mode WASAPI exclusiu" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MICROPHONE_WASAPI_EXCLUSIVE_MODE, + "Permet a RetroArch a prendre el control del dispositiu de micròfon quan es fa servir el controlador de micròfon WASAPI. Si aquesta opció està deshabilitada, RetroArch farà servir el mode compartit." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_WASAPI_FLOAT_FORMAT, "Format WASAPI de coma flotant" @@ -3474,6 +3482,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_DUTY_CYCLE, "Cicle de treball del turbo" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TURBO_DUTY_CYCLE, + "El nombre de fotogrames que es premen els botons del període de turbo. Si aquest número és igual o major que el període de turbo, els botons mai s'amollaran." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_TURBO_DUTY_CYCLE_HALF, "Mig cicle" @@ -3502,6 +3514,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_TURBO_MODE_SINGLEBUTTON_HOLD, "Botó simple (Mantenir)" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_TURBO_MODE_CLASSIC, + "Mode clàssic de maneig amb dos botons. Manté clicat un botó i clica el botó Turbo al mateix temps per activar la seqüència.\nEl turbo es pot assignar mitjançant la configuració." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_BIND, "Assignació del turbo" @@ -4416,6 +4432,10 @@ MSG_HASH( "Determina el nombre de fotogrames a executar de bestreta. Poden haver fluctuacions de senyal si el nombre de fotogrames endarrerits supera al valor intern del joc." ) #if !(defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUNAHEAD_MODE_NO_SECOND_INSTANCE, + "Executa lògiques addicionals del nucli per reduir la latència. Una instància executa la lògica fins al següent fotograma i torna a carregar l'estat actual. Fotogrames preventius executa els fotogrames anteriors amb accions d'entrada noves quan cal millorar l'eficàcia." + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_RUNAHEAD_MODE_SINGLE_INSTANCE, @@ -4517,6 +4537,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ALWAYS_RELOAD_CORE_ON_RUN_CONTENT, "Recarrega sempre el nucli en executar contingut" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ALWAYS_RELOAD_CORE_ON_RUN_CONTENT, + "Reinicia RetroArch quan s'inicia contingut, encara que el nucli ja s'hagi carregat. Això augmenta l'estabilitat del sistema a canvi d'augmentar el temps de càrrega." + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, @@ -4692,6 +4716,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUTOSAVE_INTERVAL, "Desa automàticament la SaveRAM no volàtil a intervals marcats (en segons)." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_AUTOSAVE_INTERVAL, + "Desa automàticament la memòria no volàtil SRAM de manera regular. L'interval es mesura en segons. Si assignes un valor de 0, el desat es desactiva." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REPLAY_CHECKPOINT_INTERVAL, "Interval de punts de control de repetició" @@ -4953,6 +4981,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_FASTFORWARD_RATIO, "Taxa d'avançament ràpid" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FASTFORWARD_RATIO, + "La velocitat màxima a la qual s'executa el contingut en un avançament ràpid (per exemple, 5.0x per un contingut a 60 fps serà 300 fps). Si el valor 0, l'avançament ràpid anirà a la màxima velocitat possible." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FASTFORWARD_FRAMESKIP, "Omet fotogrames en l'avançament ràpid" @@ -6007,6 +6039,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, "Estableix una contrasenya per desactivar el mode quiosc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_KIOSK_MODE_PASSWORD, + "Estableix una contrasenya per mostrar el mode quiosc, permetent deshabilitar-la des del menú principal seleccionant 'Deshabilitar el mode quiosc' i introduint la contrasenya." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NAVIGATION_WRAPAROUND, "Navegació en bucle" @@ -6946,6 +6982,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Escala automàticament les imatges amb una amplada/alçada més petita que el valor especificat. Millora la qualitat de la imatge. Té un efecte moderat en el rendiment." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Fons de les miniatures" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Animació de text en moviment" @@ -7668,6 +7708,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_COMPRESSION, "Comprimeix les llistes de reproducció" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_COMPRESSION, + "Arxiva les llistes de reproducció i desa-les al disc. Redueix la mida del fitxer i els temps de càrrega a canvi d'augmentar (lleugerament) el consum de CPU. Es poden comprimir llistes amb el format antic o bé amb el nou." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_INLINE_CORE_NAME, "Mostra els nuclis associats a les llistes de reproducció" @@ -9738,6 +9782,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_FILTER, "Filtre" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_SHADER_FILTER_PASS, + "Filtre de maquinari que s'aplicarà. Si està seleccionat a 'Predeterminat', el filtre serà lineal o més proper en funció de 'Filtre bilineal', en la configuració del vídeo." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SCALE, "Escala" @@ -9888,6 +9936,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, "Desa la personalització de directori de continguts" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + "Desa un fitxer de configuració d’excepcions que s’aplicarà a tot el contingut carregat des de la mateixa carpeta que el fitxer actual. Tindrà prioritat sobre la configuració principal." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, "Elimina la personalització de les carpetes de contingut" @@ -9955,6 +10007,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_RESUME, "Reprèn el mode expert d’assoliments" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ACHIEVEMENT_RESUME, + "Reprèn el mode hardcore en els assoliments per aquesta sessió. Això deshabilitarà els trucs, el rebobinat, la càmera lenta, poder carregar estats desats i reiniciar el joc actual." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_SERVER_UNREACHABLE, "El servidor de RetroAchievements no està disponible" @@ -10831,6 +10887,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_INLINE_THUMBNAILS, "Mostra miniatures de les llistes de reproducció" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_INLINE_THUMBNAILS, + "Mostra les miniatures de forma seqüencial a les llistes de reproducció. Clica RetroPad Select per activar o desactivar aquesta opció. En desactivar aquesta opció, encara es poden mostrar les miniatures a pantalla completa, clicant al botó RetroPad Start." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_THUMBNAILS_RGUI, "Miniatura superior" @@ -10867,6 +10927,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_THUMBNAIL_DELAY, "Retard en les miniatures (ms)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_THUMBNAIL_DELAY, + "Aplica un retard entre el moment en què se selecciona un element d'una llista de reproducció i la càrrega de la miniatura corresponent. Un valor mínim de 256 ms elimina qualsevol retard, també en els equips més lents." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_EXTENDED_ASCII, "Suport per ASCII ampliat" @@ -11197,6 +11261,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE, "Canal de shaders" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_RIBBON_ENABLE, + "Escull un fons animat. Alguns efectes poden consumir molts recursos de la GPU. Si el rendiment és baix, desactiva aquesta opció o utilitza un efecte més simple." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, "Color del tema" @@ -11568,6 +11636,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Mostra les miniatures secundàries en les llistes" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, + "Mostra una miniatura secundària si es fa servir els formats tipus llista de miniatures a les llistes de reproducció. Aquesta configuració només té efecte si la pantalla té l'amplada suficient per mostrar dues miniatures." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, + "Fons de les miniatures" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_THUMBNAILS_MATERIALUI, "Miniatura principal" @@ -15215,6 +15291,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_TIMEZONE, "Seleccioneu la zona horària per ajustar la data i l’hora a la vostra ubicació." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_TIMEZONE, + "Mostra una llista de fusos horaris disponibles. Després de selecciona un fus horari, l'hora i la data s'ajusten a aquest. Es dona per suposat que el rellotge del sistema o del maquinari està posat a UTC." + ) #ifdef HAVE_LAKKA_SWITCH MSG_HASH( MENU_ENUM_LABEL_VALUE_LAKKA_SWITCH_OPTIONS, @@ -15388,6 +15468,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_3DS_DISPLAY_MODE, "Mode de pantalla 3DS" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_3DS_DISPLAY_MODE, + "Escull entre els modes 3D i 2D. En el mode 3D, els píxels són quadrats i s'aplica un efecte de profunditat quan es veuen en el menú ràpid. El mode 2D dona un millor rendiment." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_400X240, "2D (Efecte de graella de píxels)" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 85bce7ca63..6a60503304 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -7146,6 +7146,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "지정된 값보다 작은 크기의 미리보기 이미지를 자동으로 확대합니다. 이미지 품질이 개선됩니다. 약간의 성능 저하가 있을 수 있습니다." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "썸네일 백그라운드" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, "미리보기 테두리에 단색의 테두리 배경을 추가합니다. 미리보기를 항상 일정한 크기로 표시하여 미리보기의 크기 또는 비율이 일정하지 않더라도 일관된 모습을 유지합니다." @@ -11952,6 +11956,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "미리보기를 '목록' 형식으로 표시할 때 두 번째 미리보기를 표시합니다. 두 번째 미리보기를 표시할 공간이 부족할 경우 표시되지 않습니다." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, + "썸네일 백그라운드" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "미리보기 테두리에 단색의 테두리 배경을 추가합니다. 미리보기를 항상 일정한 크기로 표시하여 미리보기의 크기 또는 비율이 일정하지 않더라도 일관된 모습을 유지합니다." @@ -14966,6 +14974,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "상태저장을 불러오려면 도전과제 하드코어 모드를 일시정지 또는 비활성화해야 합니다." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "Srm 저장 파일을 불러오려면 업적 하드코어 모드를 일시 정지하거나 비활성화해야 합니다." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "상태저장을 불러왔습니다. 도전과제 하드코어 모드가 현재 세션에서 비활성화되었습니다." diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index a299da4425..337d4f9698 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -7082,6 +7082,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Автоматично збільшувати мініатюри зображень з шириною/висотою менше, ніж зазначене значення. Покращує якість зображення. Має помірний вплив продуктивності." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Фони мініатюр" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, "Дозволяє додавати невикористаний простір в мініатюрах із суцільним фоном. Це забезпечує однорідний розмір відображення для всіх зображень, покращує зовнішній вигляд меню, при перегляді змішаних мініатюр вмісту з різними базовими розмірами." @@ -11960,6 +11964,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Відображає вторинні мініатюри при використанні режимів перегляду списку відтворення. Цей параметр застосовується лише тоді, коли екран має достатню фізичну ширину, щоб показати два ескізи." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, + "Фони мініатюр" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Дозволяє додавати невикористаний простір в мініатюрах із суцільним фоном. Це забезпечує однорідний розмір відображення для всіх зображень, покращує зовнішній вигляд меню, при перегляді змішаних мініатюр вмісту з різними базовими розмірами." diff --git a/intl/progress.h b/intl/progress.h index 7ebd5691e9..3e026bf4f1 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 88 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 90 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -91,7 +91,7 @@ #define LANGUAGE_PROGRESS_JAPANESE_APPROVED 0 /* Korean */ -#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_KOREAN_APPROVED 0 /* Dutch */ @@ -143,7 +143,7 @@ #define LANGUAGE_PROGRESS_TATAR_APPROVED 0 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ From d3cf9aa6510d6933ffc486f64506efb541fe6f90 Mon Sep 17 00:00:00 2001 From: pstef Date: Wed, 7 May 2025 23:15:39 +0200 Subject: [PATCH 045/175] Improve CLI --entryslot (#17874) Accepted values are 0 to 999. Rewrite this part to use strtol and test for values in that range. Co-authored-by: pstef <3462925+pstef@users.noreply.github.com> --- retroarch.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/retroarch.c b/retroarch.c index 9a1203671b..927a754121 100644 --- a/retroarch.c +++ b/retroarch.c @@ -7476,13 +7476,16 @@ static bool retroarch_parse_input_and_config( case 'e': { char *endptr; - int16_t entry_state_slot = (unsigned)strtoul(optarg, &endptr, 0); + long entry_state_slot = strtol(optarg, &endptr, 0); - if (entry_state_slot > -1 && string_is_empty(endptr)) - runloop_st->entry_state_slot = entry_state_slot; - else + if (endptr == optarg || *endptr != '\0' || + entry_state_slot < 0 || entry_state_slot > 999) + { RARCH_WARN("[State]: --entryslot argument \"%s\" is not a valid " "entry state slot index. Ignoring.\n", optarg); + } + else + runloop_st->entry_state_slot = entry_state_slot; } break; case RA_OPT_DATABASE_SCAN: From 0b547bdd49209919c18b41ba3267aad1a8246c8e Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Thu, 8 May 2025 00:26:54 +0300 Subject: [PATCH 046/175] Remove language mention from User menu sublabel (#17876) --- intl/msg_hash_us.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index eeb0168a6f..c52def956d 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1534,7 +1534,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Change account, username, and language settings." + "Change privacy, account and username settings." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, From 10738f532cc51805b75c5a9ff32322eceb6352f4 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Thu, 8 May 2025 00:56:59 +0300 Subject: [PATCH 047/175] Add shader hold hotkey and improve toggling logic (#17840) --- command.h | 1 + config.def.keybinds.h | 21 +++++++++ configuration.c | 1 + gfx/common/gl3_defines.h | 1 + gfx/common/vulkan_common.h | 1 + gfx/drivers/d3d11.c | 3 +- gfx/drivers/d3d12.c | 3 +- gfx/drivers/gl3.c | 76 +++++++++++++++++++++++---------- gfx/drivers/vulkan.c | 83 ++++++++++++++++++++++++------------ gfx/video_defines.h | 3 +- gfx/video_driver.c | 8 ++++ gfx/video_driver.h | 1 + gfx/video_shader_parse.c | 32 ++++++++++---- gfx/video_shader_parse.h | 5 ++- input/input_defines.h | 1 + intl/msg_hash_us.h | 8 ++++ menu/cbs/menu_cbs_sublabel.c | 4 ++ menu/menu_driver.c | 23 +++++++++- menu/menu_setting.c | 3 +- msg_hash.h | 2 + retroarch.c | 51 +++++++++++++++------- runloop.c | 12 ++++++ 22 files changed, 261 insertions(+), 82 deletions(-) diff --git a/command.h b/command.h index 8fa57ec7b3..6f614fabd7 100644 --- a/command.h +++ b/command.h @@ -488,6 +488,7 @@ static const struct cmd_map map[] = { { "DISK_PREV", RARCH_DISK_PREV }, { "SHADER_TOGGLE", RARCH_SHADER_TOGGLE }, + { "SHADER_HOLD", RARCH_SHADER_HOLD }, { "SHADER_NEXT", RARCH_SHADER_NEXT }, { "SHADER_PREV", RARCH_SHADER_PREV }, diff --git a/config.def.keybinds.h b/config.def.keybinds.h index f4d6a6bb28..c83b7059c7 100644 --- a/config.def.keybinds.h +++ b/config.def.keybinds.h @@ -472,6 +472,13 @@ static const struct retro_keybind retro_keybinds_1[] = { RARCH_SHADER_TOGGLE, NO_BTN, NO_BTN, 0, true }, + { + NULL, NULL, + AXIS_NONE, AXIS_NONE, + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, RETROK_UNKNOWN, + RARCH_SHADER_HOLD, NO_BTN, NO_BTN, 0, + true + }, { NULL, NULL, AXIS_NONE, AXIS_NONE, @@ -1114,6 +1121,13 @@ static const struct retro_keybind retro_keybinds_1[] = { RARCH_SHADER_TOGGLE, NO_BTN, NO_BTN, 0, true }, + { + NULL, NULL, + AXIS_NONE, AXIS_NONE, + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, RETROK_UNKNOWN, + RARCH_SHADER_HOLD, NO_BTN, NO_BTN, 0, + true + }, { NULL, NULL, AXIS_NONE, AXIS_NONE, @@ -1766,6 +1780,13 @@ static const struct retro_keybind retro_keybinds_1[] = { RARCH_SHADER_TOGGLE, NO_BTN, NO_BTN, 0, true }, + { + NULL, NULL, + AXIS_NONE, AXIS_NONE, + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, RETROK_UNKNOWN, + RARCH_SHADER_HOLD, NO_BTN, NO_BTN, 0, + true + }, { NULL, NULL, AXIS_NONE, AXIS_NONE, diff --git a/configuration.c b/configuration.c index cba24cabf5..fc547dfdb1 100644 --- a/configuration.c +++ b/configuration.c @@ -373,6 +373,7 @@ const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = { DECLARE_META_BIND(2, disk_prev, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV), DECLARE_META_BIND(2, shader_toggle, RARCH_SHADER_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_TOGGLE), + DECLARE_META_BIND(2, shader_hold, RARCH_SHADER_HOLD, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD), DECLARE_META_BIND(2, shader_next, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT), DECLARE_META_BIND(2, shader_prev, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV), diff --git a/gfx/common/gl3_defines.h b/gfx/common/gl3_defines.h index 2a90ac3283..c3ed727490 100644 --- a/gfx/common/gl3_defines.h +++ b/gfx/common/gl3_defines.h @@ -73,6 +73,7 @@ typedef struct gl3 const gfx_ctx_driver_t *ctx_driver; void *ctx_data; gl3_filter_chain_t *filter_chain; + gl3_filter_chain_t *filter_chain_default; GLuint *overlay_tex; float *overlay_vertex_coord; float *overlay_tex_coord; diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index 3a6dc9dd91..a83dff025c 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -551,6 +551,7 @@ struct vk_draw_triangles typedef struct vk { vulkan_filter_chain_t *filter_chain; + vulkan_filter_chain_t *filter_chain_default; vulkan_context_t *context; void *ctx_data; const gfx_ctx_driver_t *ctx_driver; diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index 29e81d591d..5ea83039a0 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -1004,6 +1004,7 @@ static uint32_t d3d11_get_flags(void *data) #if defined(HAVE_SLANG) && defined(HAVE_SPIRV_CROSS) BIT32_SET(flags, GFX_CTX_FLAGS_SHADERS_SLANG); BIT32_SET(flags, GFX_CTX_FLAGS_SUBFRAME_SHADERS); + BIT32_SET(flags, GFX_CTX_FLAGS_FAST_TOGGLE_SHADERS); #endif return flags; @@ -3056,7 +3057,7 @@ static bool d3d11_gfx_frame( texture = d3d11->frame.texture; - if (d3d11->shader_preset) + if (d3d11->shader_preset && video_info->shader_active) { for (i = 0; i < d3d11->shader_preset->passes; i++) { diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index b9dcbe9923..82c5664b69 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -1152,6 +1152,7 @@ static uint32_t d3d12_get_flags(void *data) #if defined(HAVE_SLANG) && defined(HAVE_SPIRV_CROSS) BIT32_SET(flags, GFX_CTX_FLAGS_SHADERS_SLANG); BIT32_SET(flags, GFX_CTX_FLAGS_SUBFRAME_SHADERS); + BIT32_SET(flags, GFX_CTX_FLAGS_FAST_TOGGLE_SHADERS); #endif return flags; @@ -3565,7 +3566,7 @@ static bool d3d12_gfx_frame( texture = d3d12->frame.texture; - if (d3d12->shader_preset) + if (d3d12->shader_preset && video_info->shader_active) { cmd->lpVtbl->SetGraphicsRootSignature(cmd, d3d12->desc.sl_rootSignature); diff --git a/gfx/drivers/gl3.c b/gfx/drivers/gl3.c index 5d7bef3332..7c1c907786 100644 --- a/gfx/drivers/gl3.c +++ b/gfx/drivers/gl3.c @@ -1332,6 +1332,10 @@ static void gl3_destroy_resources(gl3_t *gl) gl3_filter_chain_free(gl->filter_chain); gl->filter_chain = NULL; + if (gl->filter_chain_default) + gl3_filter_chain_free(gl->filter_chain_default); + gl->filter_chain_default = NULL; + glBindVertexArray(0); if (gl->vao != 0) glDeleteVertexArrays(1, &gl->vao); @@ -1710,14 +1714,17 @@ static bool gl3_init_default_filter_chain(gl3_t *gl) if (!gl->ctx_driver) return false; - gl->filter_chain = gl3_filter_chain_create_default( + if (gl->filter_chain_default) + return true; + + gl->filter_chain_default = gl3_filter_chain_create_default( gl->video_info.smooth ? GLSLANG_FILTER_CHAIN_LINEAR : GLSLANG_FILTER_CHAIN_NEAREST); - if (!gl->filter_chain) + if (!gl->filter_chain_default) { - RARCH_ERR("Failed to create filter chain.\n"); + RARCH_ERR("[GLCore]: Failed to create default filter chain.\n"); return false; } @@ -1726,6 +1733,9 @@ static bool gl3_init_default_filter_chain(gl3_t *gl) static bool gl3_init_filter_chain_preset(gl3_t *gl, const char *shader_path) { + if (!gl->ctx_driver) + return false; + gl->filter_chain = gl3_filter_chain_create_from_preset( shader_path, gl->video_info.smooth @@ -2107,7 +2117,7 @@ static void *gl3_init(const video_info_t *video, if (!gl_check_error(&error_string)) { - RARCH_ERR("%s\n", error_string); + RARCH_ERR("[GLCore]: %s\n", error_string); free(error_string); goto error; } @@ -2650,6 +2660,7 @@ static bool gl3_frame(void *data, const void *frame, { struct gl3_filter_chain_texture texture; struct gl3_streamed_texture *streamed = NULL; + gl3_filter_chain_t *filter_chain = NULL; gl3_t *gl = (gl3_t*)data; unsigned width = video_info->width; unsigned height = video_info->height; @@ -2734,26 +2745,44 @@ static bool gl3_frame(void *data, const void *frame, texture.padded_width = streamed->width; texture.padded_height = streamed->height; } - gl3_filter_chain_set_frame_count(gl->filter_chain, frame_count); + + /* Fast toggle shader filter chain logic */ + filter_chain = gl->filter_chain; + + if (!video_info->shader_active && gl->filter_chain != gl->filter_chain_default) + { + if (!gl->filter_chain_default) + gl3_init_default_filter_chain(gl); + + if (gl->filter_chain_default) + filter_chain = gl->filter_chain_default; + else + return false; + } + + if (!filter_chain && gl->filter_chain_default) + filter_chain = gl->filter_chain_default; + + gl3_filter_chain_set_frame_count(filter_chain, frame_count); #ifdef HAVE_REWIND - gl3_filter_chain_set_frame_direction(gl->filter_chain, state_manager_frame_is_reversed() ? -1 : 1); + gl3_filter_chain_set_frame_direction(filter_chain, state_manager_frame_is_reversed() ? -1 : 1); #else - gl3_filter_chain_set_frame_direction(gl->filter_chain, 1); + gl3_filter_chain_set_frame_direction(filter_chain, 1); #endif - gl3_filter_chain_set_frame_time_delta(gl->filter_chain, (uint32_t)video_driver_get_frame_time_delta_usec()); + gl3_filter_chain_set_frame_time_delta(filter_chain, (uint32_t)video_driver_get_frame_time_delta_usec()); - gl3_filter_chain_set_original_fps(gl->filter_chain, video_driver_get_original_fps()); + gl3_filter_chain_set_original_fps(filter_chain, video_driver_get_original_fps()); - gl3_filter_chain_set_rotation(gl->filter_chain, retroarch_get_rotation()); + gl3_filter_chain_set_rotation(filter_chain, retroarch_get_rotation()); - gl3_filter_chain_set_core_aspect(gl->filter_chain, video_driver_get_core_aspect()); + gl3_filter_chain_set_core_aspect(filter_chain, video_driver_get_core_aspect()); /* OriginalAspectRotated: return 1/aspect for 90 and 270 rotated content */ uint32_t rot = retroarch_get_rotation(); float core_aspect_rot = video_driver_get_core_aspect(); if (rot == 1 || rot == 3) core_aspect_rot = 1/core_aspect_rot; - gl3_filter_chain_set_core_aspect_rot(gl->filter_chain, core_aspect_rot); + gl3_filter_chain_set_core_aspect_rot(filter_chain, core_aspect_rot); /* Sub-frame info for multiframe shaders (per real content frame). Should always be 1 for non-use of subframes*/ @@ -2765,13 +2794,13 @@ static bool gl3_frame(void *data, const void *frame, || video_info->runloop_is_paused || (gl->flags & GL3_FLAG_MENU_TEXTURE_ENABLE)) gl3_filter_chain_set_shader_subframes( - gl->filter_chain, 1); + filter_chain, 1); else gl3_filter_chain_set_shader_subframes( - gl->filter_chain, video_info->shader_subframes); + filter_chain, video_info->shader_subframes); gl3_filter_chain_set_current_shader_subframe( - gl->filter_chain, 1); + filter_chain, 1); } #ifdef GL3_ROLLING_SCANLINE_SIMULATION @@ -2783,25 +2812,25 @@ static bool gl3_frame(void *data, const void *frame, && !video_info->runloop_is_paused && (!(gl->flags & GL3_FLAG_MENU_TEXTURE_ENABLE))) gl3_filter_chain_set_simulate_scanline( - gl->filter_chain, true); + filter_chain, true); else gl3_filter_chain_set_simulate_scanline( - gl->filter_chain, false); + filter_chain, false); #endif /* GL3_ROLLING_SCANLINE_SIMULATION */ - gl3_filter_chain_set_input_texture(gl->filter_chain, &texture); - gl3_filter_chain_build_offscreen_passes(gl->filter_chain, + gl3_filter_chain_set_input_texture(filter_chain, &texture); + gl3_filter_chain_build_offscreen_passes(filter_chain, &gl->filter_chain_vp); glBindFramebuffer(GL_FRAMEBUFFER, 0); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); - gl3_filter_chain_build_viewport_pass(gl->filter_chain, + gl3_filter_chain_build_viewport_pass(filter_chain, &gl->filter_chain_vp, (gl->flags & GL3_FLAG_HW_RENDER_BOTTOM_LEFT) ? gl->mvp.data : gl->mvp_yflip.data); - gl3_filter_chain_end_frame(gl->filter_chain); + gl3_filter_chain_end_frame(filter_chain); #ifdef HAVE_OVERLAY if ((gl->flags & GL3_FLAG_OVERLAY_ENABLE) && overlay_behind_menu) @@ -2940,9 +2969,9 @@ static bool gl3_frame(void *data, const void *frame, for (i = 1; i < (int) video_info->shader_subframes; i++) { gl3_filter_chain_set_shader_subframes( - gl->filter_chain, video_info->shader_subframes); + filter_chain, video_info->shader_subframes); gl3_filter_chain_set_current_shader_subframe( - gl->filter_chain, i+1); + filter_chain, i+1); if (!gl3_frame(gl, NULL, 0, 0, frame_count, 0, msg, video_info)) @@ -2975,6 +3004,7 @@ static uint32_t gl3_get_flags(void *data) BIT32_SET(flags, GFX_CTX_FLAGS_SCREENSHOTS_SUPPORTED); BIT32_SET(flags, GFX_CTX_FLAGS_OVERLAY_BEHIND_MENU_SUPPORTED); BIT32_SET(flags, GFX_CTX_FLAGS_SUBFRAME_SHADERS); + BIT32_SET(flags, GFX_CTX_FLAGS_FAST_TOGGLE_SHADERS); return flags; } diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index 7063b3e872..0a80a93459 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -2829,6 +2829,9 @@ static bool vulkan_init_default_filter_chain(vk_t *vk) if (!vk->context) return false; + if (vk->filter_chain_default) + return true; + info.device = vk->context->device; info.gpu = vk->context->gpu; info.memory_properties = &vk->context->memory_properties; @@ -2844,15 +2847,15 @@ static bool vulkan_init_default_filter_chain(vk_t *vk) info.swapchain.render_pass = vk->render_pass; info.swapchain.num_indices = vk->context->num_swapchain_images; - vk->filter_chain = vulkan_filter_chain_create_default( + vk->filter_chain_default = vulkan_filter_chain_create_default( &info, vk->video.smooth ? GLSLANG_FILTER_CHAIN_LINEAR : GLSLANG_FILTER_CHAIN_NEAREST); - if (!vk->filter_chain) + if (!vk->filter_chain_default) { - RARCH_ERR("Failed to create filter chain.\n"); + RARCH_ERR("[Vulkan]: Failed to create default filter chain.\n"); return false; } @@ -2901,6 +2904,9 @@ static bool vulkan_init_filter_chain_preset(vk_t *vk, const char *shader_path) { struct vulkan_filter_chain_create_info info; + if (!vk->context) + return false; + info.device = vk->context->device; info.gpu = vk->context->gpu; info.memory_properties = &vk->context->memory_properties; @@ -3106,6 +3112,9 @@ static void vulkan_free(void *data) if (vk->filter_chain) vulkan_filter_chain_free((vulkan_filter_chain_t*)vk->filter_chain); + if (vk->filter_chain_default) + vulkan_filter_chain_free((vulkan_filter_chain_t*)vk->filter_chain_default); + #ifdef VULKAN_HDR_SWAPCHAIN if (vk->context->flags & VK_CTX_FLAG_HDR_SUPPORT) { @@ -3647,10 +3656,10 @@ static void vulkan_check_swapchain(vk_t *vk) filter_info.num_indices = vk->context->num_swapchain_images; if ( !vulkan_filter_chain_update_swapchain_info( - (vulkan_filter_chain_t*)vk->filter_chain, + (vk->filter_chain) ? vk->filter_chain : vk->filter_chain_default, &filter_info) ) - RARCH_ERR("Failed to update filter chain info. This will probably lead to a crash ...\n"); + RARCH_ERR("[Vulkan]: Failed to update filter chain info.\n"); } static void vulkan_set_nonblock_state(void *data, bool state, @@ -4365,6 +4374,7 @@ static bool vulkan_frame(void *data, const void *frame, VkCommandBufferBeginInfo begin_info; VkSemaphore signal_semaphores[2]; vk_t *vk = (vk_t*)data; + vulkan_filter_chain_t *filter_chain = NULL; bool waits_for_semaphores = false; unsigned width = video_info->width; unsigned height = video_info->height; @@ -4391,11 +4401,29 @@ static bool vulkan_frame(void *data, const void *frame, unsigned swapchain_index = vk->context->current_swapchain_index; bool overlay_behind_menu = video_info->overlay_behind_menu; + bool use_main_buffer = true; + + /* Fast toggle shader filter chain logic */ + filter_chain = vk->filter_chain; + + if (!video_info->shader_active && vk->filter_chain != vk->filter_chain_default) + { + if (!vk->filter_chain_default) + vulkan_init_default_filter_chain(vk); + + if (vk->filter_chain_default) + filter_chain = vk->filter_chain_default; + else + return false; + } + + if (!filter_chain && vk->filter_chain_default) + filter_chain = vk->filter_chain_default; #ifdef VULKAN_HDR_SWAPCHAIN - bool use_main_buffer = + use_main_buffer = ( vk->context->flags & VK_CTX_FLAG_HDR_ENABLE) - && (!vk->filter_chain || !vulkan_filter_chain_emits_hdr10(vk->filter_chain)); + && (!filter_chain || !vulkan_filter_chain_emits_hdr10(filter_chain)); #endif /* VULKAN_HDR_SWAPCHAIN */ /* Bookkeeping on start of frame. */ @@ -4516,9 +4544,9 @@ static bool vulkan_frame(void *data, const void *frame, /* Notify filter chain about the new sync index. */ vulkan_filter_chain_notify_sync_index( - (vulkan_filter_chain_t*)vk->filter_chain, frame_index); + (vulkan_filter_chain_t*)filter_chain, frame_index); vulkan_filter_chain_set_frame_count( - (vulkan_filter_chain_t*)vk->filter_chain, frame_count); + (vulkan_filter_chain_t*)filter_chain, frame_count); /* Sub-frame info for multiframe shaders (per real content frame). Should always be 1 for non-use of subframes*/ @@ -4531,13 +4559,13 @@ static bool vulkan_frame(void *data, const void *frame, || (vk->context->swap_interval > 1) || (vk->flags & VK_FLAG_MENU_ENABLE)) vulkan_filter_chain_set_shader_subframes( - (vulkan_filter_chain_t*)vk->filter_chain, 1); + (vulkan_filter_chain_t*)filter_chain, 1); else vulkan_filter_chain_set_shader_subframes( - (vulkan_filter_chain_t*)vk->filter_chain, video_info->shader_subframes); + (vulkan_filter_chain_t*)filter_chain, video_info->shader_subframes); vulkan_filter_chain_set_current_shader_subframe( - (vulkan_filter_chain_t*)vk->filter_chain, 1); + (vulkan_filter_chain_t*)filter_chain, 1); } #ifdef VULKAN_ROLLING_SCANLINE_SIMULATION @@ -4551,32 +4579,32 @@ static bool vulkan_frame(void *data, const void *frame, && (!(vk->flags & VK_FLAG_MENU_ENABLE)) && !(vk->context->swap_interval > 1)) vulkan_filter_chain_set_simulate_scanline( - (vulkan_filter_chain_t*)vk->filter_chain, true); + (vulkan_filter_chain_t*)filter_chain, true); else vulkan_filter_chain_set_simulate_scanline( - (vulkan_filter_chain_t*)vk->filter_chain, false); + (vulkan_filter_chain_t*)filter_chain, false); #endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */ #ifdef HAVE_REWIND vulkan_filter_chain_set_frame_direction( - (vulkan_filter_chain_t*)vk->filter_chain, + (vulkan_filter_chain_t*)filter_chain, state_manager_frame_is_reversed() ? -1 : 1); #else vulkan_filter_chain_set_frame_direction( - (vulkan_filter_chain_t*)vk->filter_chain, + (vulkan_filter_chain_t*)filter_chain, 1); #endif vulkan_filter_chain_set_frame_time_delta( - (vulkan_filter_chain_t*)vk->filter_chain, (uint32_t)video_driver_get_frame_time_delta_usec()); + (vulkan_filter_chain_t*)filter_chain, (uint32_t)video_driver_get_frame_time_delta_usec()); vulkan_filter_chain_set_original_fps( - (vulkan_filter_chain_t*)vk->filter_chain, video_driver_get_original_fps()); + (vulkan_filter_chain_t*)filter_chain, video_driver_get_original_fps()); vulkan_filter_chain_set_rotation( - (vulkan_filter_chain_t*)vk->filter_chain, retroarch_get_rotation()); + (vulkan_filter_chain_t*)filter_chain, retroarch_get_rotation()); vulkan_filter_chain_set_core_aspect( - (vulkan_filter_chain_t*)vk->filter_chain, video_driver_get_core_aspect()); + (vulkan_filter_chain_t*)filter_chain, video_driver_get_core_aspect()); /* OriginalAspectRotated: return 1/aspect for 90 and 270 rotated content */ uint32_t rot = retroarch_get_rotation(); @@ -4584,7 +4612,7 @@ static bool vulkan_frame(void *data, const void *frame, if (rot == 1 || rot == 3) core_aspect_rot = 1/core_aspect_rot; vulkan_filter_chain_set_core_aspect_rot( - (vulkan_filter_chain_t*)vk->filter_chain, core_aspect_rot); + (vulkan_filter_chain_t*)filter_chain, core_aspect_rot); /* Render offscreen filter chain passes. */ { @@ -4648,13 +4676,13 @@ static bool vulkan_frame(void *data, const void *frame, } vulkan_filter_chain_set_input_texture((vulkan_filter_chain_t*) - vk->filter_chain, &input); + filter_chain, &input); } vulkan_set_viewport(vk, width, height, false, true); vulkan_filter_chain_build_offscreen_passes( - (vulkan_filter_chain_t*)vk->filter_chain, + (vulkan_filter_chain_t*)filter_chain, vk->cmd, &vk->vk_vp); #if defined(HAVE_MENU) @@ -4712,7 +4740,7 @@ static bool vulkan_frame(void *data, const void *frame, vkCmdBeginRenderPass(vk->cmd, &rp_info, VK_SUBPASS_CONTENTS_INLINE); vulkan_filter_chain_build_viewport_pass( - (vulkan_filter_chain_t*)vk->filter_chain, vk->cmd, + (vulkan_filter_chain_t*)filter_chain, vk->cmd, &vk->vk_vp, vk->mvp.data); #ifdef HAVE_OVERLAY @@ -4802,7 +4830,7 @@ static bool vulkan_frame(void *data, const void *frame, /* End the filter chain frame. * This must happen outside a render pass. */ - vulkan_filter_chain_end_frame((vulkan_filter_chain_t*)vk->filter_chain, vk->cmd); + vulkan_filter_chain_end_frame((vulkan_filter_chain_t*)filter_chain, vk->cmd); if ( (backbuffer->image != VK_NULL_HANDLE) @@ -5115,9 +5143,9 @@ static bool vulkan_frame(void *data, const void *frame, for (j = 1; j < (int) video_info->shader_subframes; j++) { vulkan_filter_chain_set_shader_subframes( - (vulkan_filter_chain_t*)vk->filter_chain, video_info->shader_subframes); + (vulkan_filter_chain_t*)filter_chain, video_info->shader_subframes); vulkan_filter_chain_set_current_shader_subframe( - (vulkan_filter_chain_t*)vk->filter_chain, j+1); + (vulkan_filter_chain_t*)filter_chain, j+1); if (!vulkan_frame(vk, NULL, 0, 0, frame_count, 0, msg, video_info)) { @@ -5466,6 +5494,7 @@ static uint32_t vulkan_get_flags(void *data) BIT32_SET(flags, GFX_CTX_FLAGS_SCREENSHOTS_SUPPORTED); BIT32_SET(flags, GFX_CTX_FLAGS_OVERLAY_BEHIND_MENU_SUPPORTED); BIT32_SET(flags, GFX_CTX_FLAGS_SUBFRAME_SHADERS); + BIT32_SET(flags, GFX_CTX_FLAGS_FAST_TOGGLE_SHADERS); return flags; } diff --git a/gfx/video_defines.h b/gfx/video_defines.h index 4a5845b3b0..34ebb43bc4 100644 --- a/gfx/video_defines.h +++ b/gfx/video_defines.h @@ -248,7 +248,8 @@ enum display_flags GFX_CTX_FLAGS_SCREENSHOTS_SUPPORTED, GFX_CTX_FLAGS_OVERLAY_BEHIND_MENU_SUPPORTED, GFX_CTX_FLAGS_CRT_SWITCHRES, - GFX_CTX_FLAGS_SUBFRAME_SHADERS + GFX_CTX_FLAGS_SUBFRAME_SHADERS, + GFX_CTX_FLAGS_FAST_TOGGLE_SHADERS }; enum shader_uniform_type diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 7fb5f83c65..9efecff999 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -2818,6 +2818,7 @@ void video_driver_build_info(video_frame_info_t *video_info) #ifdef HAVE_MENU struct menu_state *menu_st = menu_state_get_ptr(); #endif + uint8_t menu_shdr_flags = 0; #ifdef HAVE_GFX_WIDGETS dispgfx_widget_t *p_dispwidget = dispwidget_get_ptr(); #endif @@ -2826,6 +2827,12 @@ void video_driver_build_info(video_frame_info_t *video_info) VIDEO_DRIVER_IS_THREADED_INTERNAL(video_st); VIDEO_DRIVER_THREADED_LOCK(video_st, is_threaded); +#endif + +#ifdef HAVE_MENU +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) + menu_shdr_flags = menu_shader_get()->flags; +#endif #endif custom_vp = &settings->video_vp_custom; #ifdef HAVE_GFX_WIDGETS @@ -2896,6 +2903,7 @@ void video_driver_build_info(video_frame_info_t *video_info) video_info->scale_width = video_st->scale_width; video_info->scale_height = video_st->scale_height; + video_info->shader_active = !(menu_shdr_flags & SHDR_FLAG_DISABLED) ? true : false; video_info->hdr_enable = settings->bools.video_hdr_enable; video_info->libretro_running = false; diff --git a/gfx/video_driver.h b/gfx/video_driver.h index a5cb80d986..7492155403 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -494,6 +494,7 @@ typedef struct video_frame_info bool hdr_enable; bool overlay_behind_menu; bool scan_subframes; + bool shader_active; } video_frame_info_t; typedef void (*update_window_title_cb)(void*); diff --git a/gfx/video_shader_parse.c b/gfx/video_shader_parse.c index c66d19f249..37b85e022f 100644 --- a/gfx/video_shader_parse.c +++ b/gfx/video_shader_parse.c @@ -3140,27 +3140,41 @@ const char *video_shader_get_current_shader_preset(void) return NULL; } -void video_shader_toggle(settings_t *settings) +void video_shader_toggle(settings_t *settings, bool write) { - bool toggle = !settings->bools.video_shader_enable; + bool enabled = settings->bools.video_shader_enable; #ifdef HAVE_MENU struct video_shader *menu_shdr = menu_shader_get(); struct menu_state *menu_st = menu_state_get_ptr(); - menu_shdr->flags |= SHDR_FLAG_MODIFIED; - if (toggle) + menu_shdr->flags &= ~SHDR_FLAG_MODIFIED; + menu_shdr->flags &= ~SHDR_FLAG_TEMPORARY; +#endif + + /* Cold start from hotkey requires enabling shaders initially */ + if (!write && !enabled) + { + write = true; + enabled = true; + configuration_set_bool(settings, settings->bools.video_shader_enable, true); + } +#ifdef HAVE_MENU + else if (!write) + enabled = (menu_shdr->flags & SHDR_FLAG_DISABLED); +#endif + +#ifdef HAVE_MENU + if (enabled) menu_shdr->flags &= ~SHDR_FLAG_DISABLED; else menu_shdr->flags |= SHDR_FLAG_DISABLED; + if (!write && video_driver_test_all_flags(GFX_CTX_FLAGS_FAST_TOGGLE_SHADERS)) + menu_shdr->flags |= SHDR_FLAG_TEMPORARY; + menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH | MENU_ST_FLAG_PREVENT_POPULATE; #endif command_event(CMD_EVENT_SHADERS_APPLY_CHANGES, NULL); - - /* TODO/FIXME: Due to general_write_handler being called twice, - * this has be done in this order in order to truly disable */ - if (!toggle) - configuration_set_bool(settings, settings->bools.video_shader_enable, toggle); } diff --git a/gfx/video_shader_parse.h b/gfx/video_shader_parse.h index 3a35463647..d95878f073 100644 --- a/gfx/video_shader_parse.h +++ b/gfx/video_shader_parse.h @@ -88,7 +88,8 @@ enum video_shader_flags /* Indicative of whether shader was modified - * for instance from the menus */ SHDR_FLAG_MODIFIED = (1 << 1), - SHDR_FLAG_DISABLED = (1 << 2) + SHDR_FLAG_DISABLED = (1 << 2), + SHDR_FLAG_TEMPORARY = (1 << 3) }; enum gfx_wrap_type @@ -289,7 +290,7 @@ bool video_shader_apply_shader( const char *video_shader_get_preset_extension(enum rarch_shader_type type); -void video_shader_toggle(settings_t *settings); +void video_shader_toggle(settings_t *settings, bool write); RETRO_END_DECLS diff --git a/input/input_defines.h b/input/input_defines.h index 7c03962b2a..cb47fe4d6b 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -155,6 +155,7 @@ enum RARCH_DISK_PREV, RARCH_SHADER_TOGGLE, + RARCH_SHADER_HOLD, RARCH_SHADER_NEXT, RARCH_SHADER_PREV, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index c52def956d..7d766fc49d 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -4039,6 +4039,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Switches the currently selected shader on/off." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Shaders (Hold)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "Keeps the currently selected shader on/off while key is pressed." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Next Shader" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 4d45a099de..94193a84a4 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -451,6 +451,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_disk_next, ME DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_disk_prev, MENU_ENUM_SUBLABEL_INPUT_META_DISK_PREV) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_shader_toggle, MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_shader_hold, MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_shader_next, MENU_ENUM_SUBLABEL_INPUT_META_SHADER_NEXT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_shader_prev, MENU_ENUM_SUBLABEL_INPUT_META_SHADER_PREV) #ifdef HAVE_CHEATS @@ -2383,6 +2384,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case RARCH_SHADER_TOGGLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_meta_shader_toggle); return 0; + case RARCH_SHADER_HOLD: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_meta_shader_hold); + return 0; case RARCH_CHEAT_TOGGLE: #ifdef HAVE_CHEATS diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 86596d3937..7a2c823277 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -2873,15 +2873,31 @@ void menu_shader_manager_apply_changes( const char *dir_menu_config) { enum rarch_shader_type type = RARCH_SHADER_NONE; + settings_t *settings = config_get_ptr(); if (!shader) return; type = menu_shader_manager_get_type(shader); + /* Allow cold start from hotkey */ + if ( type == RARCH_SHADER_NONE + && settings->bools.video_shader_enable + && !(shader->flags & SHDR_FLAG_DISABLED)) + { + const char *preset = video_shader_get_current_shader_preset(); + enum rarch_shader_type type = video_shader_parse_type(preset); + video_shader_apply_shader(settings, type, preset, false); + return; + } + + /* Temporary state does not save anything */ + if (shader->flags & SHDR_FLAG_TEMPORARY) + return; + if ( shader->passes - && (type != RARCH_SHADER_NONE) - && (!(shader->flags & SHDR_FLAG_DISABLED))) + && type != RARCH_SHADER_NONE + && !(shader->flags & SHDR_FLAG_DISABLED)) { menu_shader_manager_save_preset(shader, NULL, dir_video_shader, dir_menu_config, true); @@ -2889,6 +2905,9 @@ void menu_shader_manager_apply_changes( } menu_shader_manager_set_preset(NULL, type, NULL, true); + + /* Reinforce disabled state on failure */ + configuration_set_bool(settings, settings->bools.video_shader_enable, false); } static bool menu_shader_manager_save_preset_internal( diff --git a/menu/menu_setting.c b/menu/menu_setting.c index b8953eab9d..82b990e8fe 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -8136,7 +8136,8 @@ static void general_write_handler(rarch_setting_t *setting) { case MENU_ENUM_LABEL_VIDEO_SHADERS_ENABLE: #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) - video_shader_toggle(settings); + video_shader_toggle(settings, true); + configuration_set_bool(settings, settings->bools.video_shader_enable, *setting->value.target.boolean); #endif break; case MENU_ENUM_LABEL_VIDEO_THREADED: diff --git a/msg_hash.h b/msg_hash.h index 6273a1c125..d4afd2092a 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1140,6 +1140,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_TOGGLE, + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, @@ -1240,6 +1241,7 @@ enum msg_hash_enums MENU_ENUM_SUBLABEL_INPUT_META_DISK_PREV, MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, MENU_ENUM_SUBLABEL_INPUT_META_SHADER_NEXT, MENU_ENUM_SUBLABEL_INPUT_META_SHADER_PREV, diff --git a/retroarch.c b/retroarch.c index 927a754121..e23408e7d5 100644 --- a/retroarch.c +++ b/retroarch.c @@ -3091,9 +3091,23 @@ bool command_event(enum event_command cmd, void *data) break; case CMD_EVENT_SHADER_TOGGLE: #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) - video_shader_toggle(settings); + video_shader_toggle(settings, false); #endif break; + case CMD_EVENT_SHADER_PRESET_LOADED: + ui_companion_event_command(cmd); + break; + case CMD_EVENT_SHADERS_APPLY_CHANGES: +#ifdef HAVE_MENU +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) + menu_shader_manager_apply_changes(menu_shader_get(), + settings->paths.directory_video_shader, + settings->paths.directory_menu_config + ); +#endif +#endif + ui_companion_event_command(cmd); + break; case CMD_EVENT_AI_SERVICE_TOGGLE: { #ifdef HAVE_TRANSLATE @@ -3645,6 +3659,16 @@ bool command_event(enum event_command cmd, void *data) runloop_st->runtime_shader_preset_path[0] = '\0'; #endif +#ifdef HAVE_MENU +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) + /* Restore shader option state after temporary fast toggling */ + if (menu_shader_get()->flags & SHDR_FLAG_TEMPORARY) + { + bool enabled = !(menu_shader_get()->flags & SHDR_FLAG_DISABLED); + configuration_set_bool(settings, settings->bools.video_shader_enable, enabled); + } +#endif +#endif video_driver_restore_cached(settings); if ( (flags & CONTENT_ST_FLAG_IS_INITED) @@ -4621,20 +4645,6 @@ bool command_event(enum event_command cmd, void *data) return false; #endif break; - case CMD_EVENT_SHADER_PRESET_LOADED: - ui_companion_event_command(cmd); - break; - case CMD_EVENT_SHADERS_APPLY_CHANGES: -#ifdef HAVE_MENU -#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) - menu_shader_manager_apply_changes(menu_shader_get(), - settings->paths.directory_video_shader, - settings->paths.directory_menu_config - ); -#endif -#endif - ui_companion_event_command(cmd); - break; case CMD_EVENT_PAUSE_TOGGLE: { bool paused = (runloop_st->flags & RUNLOOP_FLAG_PAUSED) ? true : false; @@ -8538,6 +8548,17 @@ bool retroarch_main_quit(void) } #endif +#ifdef HAVE_MENU +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) + /* Restore shader option state after temporary fast toggling */ + if (menu_shader_get()->flags & SHDR_FLAG_TEMPORARY) + { + bool enabled = !(menu_shader_get()->flags & SHDR_FLAG_DISABLED); + configuration_set_bool(settings, settings->bools.video_shader_enable, enabled); + } +#endif +#endif + /* Save configs before quitting * as for UWP depending on `OnSuspending` is not important as we can call it directly here * specifically we need to get width,height which requires UI thread and it will not be available on exit diff --git a/runloop.c b/runloop.c index 68393a588d..07959cce6a 100644 --- a/runloop.c +++ b/runloop.c @@ -6793,6 +6793,18 @@ static enum runloop_state_enum runloop_check_state( RARCH_SHADER_PREV, CMD_EVENT_SHADER_PREV, RARCH_SHADER_TOGGLE, CMD_EVENT_SHADER_TOGGLE); + { + /* Check shader hold hotkey */ + static bool old_shader_hold_button_state = false; + bool new_shader_hold_button_state = BIT256_GET( + current_bits, RARCH_SHADER_HOLD); + + if (old_shader_hold_button_state != new_shader_hold_button_state) + command_event(CMD_EVENT_SHADER_TOGGLE, NULL); + + old_shader_hold_button_state = new_shader_hold_button_state; + } + if (settings->bools.video_shader_watch_files) { static rarch_timer_t timer = {0}; From a8d65325a7e5e60e48c072385524efe0ba811e24 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Thu, 8 May 2025 01:06:34 +0300 Subject: [PATCH 048/175] Set default lightgun Start+Select keybinds for port 1 (#17877) --- config.def.keybinds.h | 38 ++++---------------------------------- 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/config.def.keybinds.h b/config.def.keybinds.h index c83b7059c7..e6190e0db8 100644 --- a/config.def.keybinds.h +++ b/config.def.keybinds.h @@ -661,16 +661,6 @@ static const struct retro_keybind retro_keybinds_1[] = { RARCH_OSK, NO_BTN, NO_BTN, 0, true }, -#if 0 - /* Deprecated */ - { - NULL, NULL, - AXIS_NONE, AXIS_NONE, - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, RETROK_UNKNOWN, - RARCH_SEND_DEBUG_INFO, NO_BTN, NO_BTN, 0, - true - }, -#endif #elif defined(DINGUX) { NULL, NULL, @@ -1310,16 +1300,6 @@ static const struct retro_keybind retro_keybinds_1[] = { RARCH_OSK, NO_BTN, NO_BTN, 0, true }, -#if 0 - /* Deprecated */ - { - NULL, NULL, - AXIS_NONE, AXIS_NONE, - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, RETROK_UNKNOWN, - RARCH_SEND_DEBUG_INFO, NO_BTN, NO_BTN, 0, - true - }, -#endif #else { NULL, NULL, @@ -1527,15 +1507,15 @@ static const struct retro_keybind retro_keybinds_1[] = { { NULL, NULL, AXIS_NONE, AXIS_NONE, - MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, - RARCH_LIGHTGUN_START, NO_BTN, NO_BTN, 0, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_RETURN, + RARCH_LIGHTGUN_START, RETRO_DEVICE_ID_MOUSE_BUTTON_4, NO_BTN, 0, true }, { NULL, NULL, AXIS_NONE, AXIS_NONE, - MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, - RARCH_LIGHTGUN_SELECT, NO_BTN, NO_BTN, 0, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_RSHIFT, + RARCH_LIGHTGUN_SELECT, RETRO_DEVICE_ID_MOUSE_BUTTON_5, NO_BTN, 0, true }, { @@ -1969,16 +1949,6 @@ static const struct retro_keybind retro_keybinds_1[] = { RARCH_OSK, NO_BTN, NO_BTN, 0, true }, -#if 0 - /* Deprecated */ - { - NULL, NULL, - AXIS_NONE, AXIS_NONE, - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, RETROK_UNKNOWN, - RARCH_SEND_DEBUG_INFO, NO_BTN, NO_BTN, 0, - true - }, -#endif #endif }; From 7cffc6bb604c488d731ebd3b3da76a0a07730eea Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 8 May 2025 00:15:58 +0000 Subject: [PATCH 049/175] Fetch translations from Crowdin --- intl/msg_hash_ar.h | 4 ---- intl/msg_hash_be.h | 12 ++++++++---- intl/msg_hash_ca.h | 40 ++++++++++++++++++++++++++++++++++++---- intl/msg_hash_chs.h | 4 ---- intl/msg_hash_cht.h | 4 ---- intl/msg_hash_cs.h | 4 ---- intl/msg_hash_cy.h | 4 ---- intl/msg_hash_da.h | 4 ---- intl/msg_hash_de.h | 4 ---- intl/msg_hash_el.h | 4 ---- intl/msg_hash_eo.h | 4 ---- intl/msg_hash_es.h | 4 ---- intl/msg_hash_fa.h | 4 ---- intl/msg_hash_fi.h | 4 ---- intl/msg_hash_fr.h | 4 ---- intl/msg_hash_gl.h | 4 ---- intl/msg_hash_hu.h | 4 ---- intl/msg_hash_id.h | 4 ---- intl/msg_hash_it.h | 4 ---- intl/msg_hash_ja.h | 4 ---- intl/msg_hash_ko.h | 4 ---- intl/msg_hash_nl.h | 4 ---- intl/msg_hash_no.h | 4 ---- intl/msg_hash_pl.h | 4 ---- intl/msg_hash_pt_br.h | 4 ---- intl/msg_hash_pt_pt.h | 4 ---- intl/msg_hash_ru.h | 4 ---- intl/msg_hash_sk.h | 4 ---- intl/msg_hash_sr.h | 4 ---- intl/msg_hash_sv.h | 4 ---- intl/msg_hash_tr.h | 4 ---- intl/msg_hash_uk.h | 4 ---- intl/msg_hash_val.h | 4 ---- intl/msg_hash_vn.h | 4 ---- intl/progress.h | 22 +++++++++++----------- 35 files changed, 55 insertions(+), 147 deletions(-) diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index de7ef7137b..a7381565cd 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -1516,10 +1516,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "المستخدم" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "تغيير إعدادات الحساب واسم المستخدم واللغة." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "الدلائل" diff --git a/intl/msg_hash_be.h b/intl/msg_hash_be.h index 8c96d5b567..3eeed0ac94 100644 --- a/intl/msg_hash_be.h +++ b/intl/msg_hash_be.h @@ -1516,10 +1516,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Карыстальнік" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Змяніць налады ўліковага запісу, імя карыстальніка ды мовы." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Каталог" @@ -7054,6 +7050,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Аўтаматычна маштабаваць эскізы з шырынёй/вышынёй менш зададзенага значэння. Падвышае якасць малюнка, умерана ўплываючы на ​​прадукцыйнасць." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Фоны мініяцюр" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, "Уключае запаўненне вольнай прасторы вакол мініяцюр суцэльным фонам. Забяспечвае адзіную памернасць для ўсіх малюнкаў, паляпшаючы адлюстраванне меню пры праглядзе эскізаў рознага памеру." @@ -11872,6 +11872,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Уключае дадатковы эскіз пры праглядзе плэйліста ў рэжыме 'Спіс'. Настройка прымяняецца толькі калі шырыні экрана дастаткова для адлюстравання двух эскізаў." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, + "Фоны мініяцюр" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Уключае запаўненне вольнай прасторы вакол мініяцюр суцэльным фонам. Забяспечвае адзіную памернасць для ўсіх малюнкаў, паляпшаючы адлюстраванне меню пры праглядзе эскізаў рознага памеру." diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 61be855fb0..099545d1e4 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -1504,10 +1504,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Usuari" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Canvia les opcions del compte, el nom d’usuari i la llengua." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Directoris" @@ -2779,6 +2775,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, "Redueix la latència a canvi d'augmentar la probabilitat que es produeixen estrebades de vídeo." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_FRAME_DELAY, + "Selecciona quants mil·lisegons passen entre l'execució del nucli i la presentació de la imatge. Redueix la latència a canvi d'augmentar el risc d'estrebades.\nEls valors iguals o superiors a 20 es consideren com un percentatge de duració dels fotogrames." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_AUTO, "Retard automàtic de fotograma" @@ -3161,6 +3161,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA, "Ajuda a mitigar imperfeccions en la sincronització de l'àudio i vídeo. Teniu en compte que si es desactiva és pràcticament impossible obtenir una sincronització correcta." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_AUDIO_RATE_CONTROL_DELTA, + "Establir aquest valor a 0 per desactivar el control de la freqüència. Qualsevol altre valor canviarà el valor delta de control de la freqüència d'àudio.\nDefineix la quantitat de freqüències d'entrada que poden ajustar-se dinàmicament. La freqüència d'entrada es defineix com:\nFreqüències d'entra * (1.0 +/- (delta de control de freqüència))" + ) /* Settings > Audio > MIDI */ @@ -3518,6 +3522,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_TURBO_MODE_CLASSIC, "Mode clàssic de maneig amb dos botons. Manté clicat un botó i clica el botó Turbo al mateix temps per activar la seqüència.\nEl turbo es pot assignar mitjançant la configuració." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_TURBO_MODE_SINGLEBUTTON, + "Mode d'alternança. Clica al botó Turbo una vegada per activar la seqüència de clicar i alliberar el botó seleccionat i torna a clicar el botó Turbo per desactivar-lo.\nEl turbo pot assignar-se a la configuració." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_BIND, "Assignació del turbo" @@ -4665,6 +4673,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_GLOBAL_CORE_OPTIONS, "Fes servir el fitxer global d'opcions del nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_GLOBAL_CORE_OPTIONS, + "Desa tota la configuració dels nuclis en un únic fitxer comú (retroarch-core-options.cfg). Si aquesta opció no està activada, les opcions de cada nucli es desaran en fitxers separats en les carpetes que marqui la configuració de RetroArch." + ) /* Settings > Saving */ @@ -4728,6 +4740,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_REPLAY_CHECKPOINT_INTERVAL, "Marca automàticament i a intervals regulars (en segons) l'estat del joc a mesura que s'enregistra una repetició." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_REPLAY_CHECKPOINT_INTERVAL, + "Desa automàticament l'estat del joc a intervals regulars durant la reproducció de la repetició. Aquesta opció està desactivada per defecte. L'interval es mesura en mil·lisegons. Un valor de 0 deshabilita el punt de control de la gravació." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX, "Augmenta automàticament l'índex de l'estat desat" @@ -6986,6 +7002,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, "Fons de les miniatures" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Permet cobrir l'espai no utilitzat en les miniatures amb fons pla. Això garanteix que totes les imatges tinguin una mida uniforme, millorant visualment els menús en veure miniatures de continguts i mides diferents." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, "Animació de text en moviment" @@ -8012,6 +8032,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, "Guanya assoliments en jocs clàssics. Per a més informació visiteu «https://retroachievements.org»." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_ACCOUNTS_RETRO_ACHIEVEMENTS, + "Detalls d'inici de sessió pel teu compte de RetroAchievements. Ves a retroachievements.org per aconseguir un compte gratuït.\nDesprés de fer el registre correctament, cal posar el nom d'usuari i la contrasenya a RetroArch." + ) /* Settings > User > Accounts > RetroAchievements */ @@ -9663,6 +9687,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_DISK_TRAY_EJECT, "Expulsar disc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DISK_TRAY_EJECT, + "Obre la safata del disc virtual i extreu el disc que s'estava carregant. Si l'opció 'Fes pausa al contingut quan el menú estigui actiu' està activada, alguns nuclis no poden registrar canvis fins que hagin passat uns segons amb el contingut reprès i després de cada acció de control de discs." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DISK_TRAY_INSERT, "Insereix disc" @@ -11644,6 +11672,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Fons de les miniatures" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, + "Permet cobrir l'espai no utilitzat en les miniatures amb fons pla. Això garanteix que totes les imatges tinguin una mida uniforme, millorant visualment els menús en veure miniatures de continguts i mides diferents." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_THUMBNAILS_MATERIALUI, "Miniatura principal" diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index ec39b56de4..adf282d0d8 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -1520,10 +1520,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "用户" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "更改帐号、用户名和语言设置。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "文件夹" diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 002c9172b9..e6a4a90cd6 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -1448,10 +1448,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "使用者" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "變更帳號和名稱的設定。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "資料夾" diff --git a/intl/msg_hash_cs.h b/intl/msg_hash_cs.h index 8b6fa3d61d..35a8c47179 100644 --- a/intl/msg_hash_cs.h +++ b/intl/msg_hash_cs.h @@ -1480,10 +1480,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Uživatel" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Změnit účet, uživatelské jméno a nastavení jazyka." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Adresáře" diff --git a/intl/msg_hash_cy.h b/intl/msg_hash_cy.h index dd56170da8..d6fef867f8 100644 --- a/intl/msg_hash_cy.h +++ b/intl/msg_hash_cy.h @@ -956,10 +956,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Defnyddiwr" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Newid gosodiadau cyfrif, enw defnyddiwr a iaith." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Cyfeiriadur" diff --git a/intl/msg_hash_da.h b/intl/msg_hash_da.h index e69a5cb863..d90fd019cb 100644 --- a/intl/msg_hash_da.h +++ b/intl/msg_hash_da.h @@ -840,10 +840,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Bruger" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Skift konto, brugernavn og sprogindstillinger." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Mappe" diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 93198867cf..cd5b14d9cc 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -1448,10 +1448,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Benutzer" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Konten, Benutzername und Sprache ändern." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Verzeichnisse" diff --git a/intl/msg_hash_el.h b/intl/msg_hash_el.h index ee33f6d25a..ee3051bff8 100644 --- a/intl/msg_hash_el.h +++ b/intl/msg_hash_el.h @@ -1476,10 +1476,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Χρήστης" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Αλλαγή ρυθμίσεων λογαριασμού, ονόματος χρήστη και γλώσσας." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Ευρετήρια" diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index 06282b591a..dbcc30e4b1 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -296,10 +296,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_SETTINGS, "Change settings for the playlists." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Change accounts, username, and language." - ) MSG_HASH( MENU_ENUM_SUBLABEL_DIRECTORY_SETTINGS, "Change default directories for this system." diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index 0a1ec877d3..07c68da1a3 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -1508,10 +1508,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Usuario" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Cambia los ajustes de cuentas, del nombre de usuario y del idioma." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Directorios" diff --git a/intl/msg_hash_fa.h b/intl/msg_hash_fa.h index 23444b604d..05a0b68b5d 100644 --- a/intl/msg_hash_fa.h +++ b/intl/msg_hash_fa.h @@ -1364,10 +1364,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "کاربر" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "تنظیمات حساب، نام کاربری و زبان." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "پوشه" diff --git a/intl/msg_hash_fi.h b/intl/msg_hash_fi.h index ac6fd98407..feaeb510b6 100644 --- a/intl/msg_hash_fi.h +++ b/intl/msg_hash_fi.h @@ -1484,10 +1484,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Käyttäjä" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Muuta tiliä, käyttäjänimeä ja kielen asetuksia." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Kansio" diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 7290d16910..bfb26905cc 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -1484,10 +1484,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Utilisateur" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Modifier les réglages de compte, de pseudo et de langue." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Dossiers" diff --git a/intl/msg_hash_gl.h b/intl/msg_hash_gl.h index 322101ea34..817a381447 100644 --- a/intl/msg_hash_gl.h +++ b/intl/msg_hash_gl.h @@ -1508,10 +1508,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Usuario" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Cambia os axustes das contas, o nome de usuario e a lingua." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Directorio" diff --git a/intl/msg_hash_hu.h b/intl/msg_hash_hu.h index a6e6eb191e..947dde3d12 100644 --- a/intl/msg_hash_hu.h +++ b/intl/msg_hash_hu.h @@ -1492,10 +1492,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Felhasználó" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Fiókok, felhasználónév, és a nyelv beállítása." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Könyvtárak" diff --git a/intl/msg_hash_id.h b/intl/msg_hash_id.h index 2d9841faf2..ed359accc1 100644 --- a/intl/msg_hash_id.h +++ b/intl/msg_hash_id.h @@ -1284,10 +1284,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Pengguna" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Ubah pengaturan akun, nama pengguna, dan bahasa." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Direktori" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 8b9e1f1b11..73fc7399e6 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -1468,10 +1468,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Utente" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Modifica account, nome utente, e la lingua." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Cartella" diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index da5d08d47e..03e7725d1f 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -1508,10 +1508,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "ユーザー" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "アカウント、ユーザー名および言語の設定を変更します。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "ディレクトリ" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 6a60503304..aee1689648 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -1520,10 +1520,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "사용자" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "계정, 사용자 이름, 언어 설정을 변경합니다." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "디렉토리" diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 67aa301923..44a488e05f 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -1268,10 +1268,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Gebruiker" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Wijzig account-, gebruikersnaam- en taalinstellingen." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Map" diff --git a/intl/msg_hash_no.h b/intl/msg_hash_no.h index bbc320045e..ed66a1c5fa 100644 --- a/intl/msg_hash_no.h +++ b/intl/msg_hash_no.h @@ -1288,10 +1288,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Bruker" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Endre innstillinger for brukerkonto, brukernavn og språk." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Mapper" diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index 420bb0eb4c..2d87ed3deb 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -1492,10 +1492,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Użytkownik" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Zmień konto, nazwę użytkownika i ustawienia językowe." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Katalog" diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 8e1592dc3a..ea1d1b5ea2 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -1496,10 +1496,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Usuário" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Altera as configurações de conta, nome de usuário e idioma." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Diretório" diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index e189e88011..2105e36210 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -1484,10 +1484,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Utilizador" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Modificar as definições de conta, nome de utilizador e idioma." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Pasta" diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 6d8f659317..0f59cd1131 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -1516,10 +1516,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Пользователь" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Настройки аккаунтов, имени пользователя и языка интерфейса." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Каталоги" diff --git a/intl/msg_hash_sk.h b/intl/msg_hash_sk.h index 3cc45e8c21..eba8422df0 100644 --- a/intl/msg_hash_sk.h +++ b/intl/msg_hash_sk.h @@ -1324,10 +1324,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Používateľ" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Zmeniť účet, užívateľské meno a nastavenie jazyka." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Priečinok" diff --git a/intl/msg_hash_sr.h b/intl/msg_hash_sr.h index b5095eb486..a3c96f3129 100644 --- a/intl/msg_hash_sr.h +++ b/intl/msg_hash_sr.h @@ -1232,10 +1232,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Korisnik" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Izmeni podešavanja naloga, korisničkog imena i jezika." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Direktorijum" diff --git a/intl/msg_hash_sv.h b/intl/msg_hash_sv.h index 9cdec01215..4d1f15e098 100644 --- a/intl/msg_hash_sv.h +++ b/intl/msg_hash_sv.h @@ -1468,10 +1468,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Användare" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Ändra konto, användarnamn och språkinställningar." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Katalog" diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index debf7a2448..33fcf75c40 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -1504,10 +1504,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Kullanıcı" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Hesap, kullanıcı adı veya dil ayarlarını değiştir." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Dizin" diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index 337d4f9698..d2d129835c 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -1516,10 +1516,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Користувач" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Зміна налаштувань облікового запису, користувача та мови." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Каталоги" diff --git a/intl/msg_hash_val.h b/intl/msg_hash_val.h index b806c60e17..8aa487d045 100644 --- a/intl/msg_hash_val.h +++ b/intl/msg_hash_val.h @@ -1220,10 +1220,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Usuari" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Canvia els ajustos del compte, nom d'usuari i de llengua." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Directoris" diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 8942639fba..a4ab0f5401 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -1168,10 +1168,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Người dùng" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Thay đổi cài đặt tài khoản, tên đăng nhập và ngôn ngữ." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Thư mục" diff --git a/intl/progress.h b/intl/progress.h index 3e026bf4f1..f40de65070 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 90 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 91 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -31,7 +31,7 @@ #define LANGUAGE_PROGRESS_DANISH_APPROVED 0 /* German */ -#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_GERMAN_APPROVED 13 /* Greek */ @@ -47,7 +47,7 @@ #define LANGUAGE_PROGRESS_ESPERANTO_APPROVED 0 /* Spanish */ -#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 99 #define LANGUAGE_PROGRESS_SPANISH_APPROVED 91 /* Persian */ @@ -59,8 +59,8 @@ #define LANGUAGE_PROGRESS_FINNISH_APPROVED 45 /* French */ -#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 100 -#define LANGUAGE_PROGRESS_FRENCH_APPROVED 100 +#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_FRENCH_APPROVED 99 /* Galician */ #define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 99 @@ -83,7 +83,7 @@ #define LANGUAGE_PROGRESS_INDONESIAN_APPROVED 0 /* Italian */ -#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_ITALIAN_APPROVED 0 /* Japanese */ @@ -91,7 +91,7 @@ #define LANGUAGE_PROGRESS_JAPANESE_APPROVED 0 /* Korean */ -#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_KOREAN_APPROVED 0 /* Dutch */ @@ -135,15 +135,15 @@ #define LANGUAGE_PROGRESS_SWEDISH_APPROVED 50 /* Turkish */ -#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 100 -#define LANGUAGE_PROGRESS_TURKISH_APPROVED 100 +#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_TURKISH_APPROVED 99 /* Tatar */ #define LANGUAGE_PROGRESS_TATAR_TRANSLATED 0 #define LANGUAGE_PROGRESS_TATAR_APPROVED 0 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ @@ -155,7 +155,7 @@ #define LANGUAGE_PROGRESS_VIETNAMESE_APPROVED 0 /* Chinese Simplified */ -#define LANGUAGE_PROGRESS_CHINESE_SIMPLIFIED_TRANSLATED 95 +#define LANGUAGE_PROGRESS_CHINESE_SIMPLIFIED_TRANSLATED 94 #define LANGUAGE_PROGRESS_CHINESE_SIMPLIFIED_APPROVED 43 /* Chinese Traditional */ From 6c7b648570eb306c2163dfbc364d5ca260a1afa3 Mon Sep 17 00:00:00 2001 From: Aleksey Samoilov Date: Thu, 8 May 2025 17:58:20 +0400 Subject: [PATCH 050/175] [Wayland]: Add support for xdg-toplevel-icon-v1 --- .gitignore | 2 + Makefile.common | 1 + .../staging/xdg-toplevel-icon/README | 4 + .../xdg-toplevel-icon-v1.xml | 205 ++++++++++++++++++ gfx/common/wayland/generate_wayland_protos.sh | 1 + gfx/common/wayland_common.c | 85 ++++++-- input/common/wayland_common.c | 4 + input/common/wayland_common.h | 3 + 8 files changed, 281 insertions(+), 24 deletions(-) create mode 100644 deps/wayland-protocols/staging/xdg-toplevel-icon/README create mode 100644 deps/wayland-protocols/staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml diff --git a/.gitignore b/.gitignore index a29b8ebd83..cce661252b 100644 --- a/.gitignore +++ b/.gitignore @@ -241,6 +241,8 @@ gfx/common/wayland/content-type-v1.h gfx/common/wayland/content-type-v1.c gfx/common/wayland/single-pixel-buffer-v1.h gfx/common/wayland/single-pixel-buffer-v1.c +gfx/common/wayland/xdg-toplevel-icon-v1.h +gfx/common/wayland/xdg-toplevel-icon-v1.c # libretro-common samples libretro-common/samples/streams/rzip/rzip diff --git a/Makefile.common b/Makefile.common index c9ed198348..2175fbd298 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1284,6 +1284,7 @@ ifeq ($(HAVE_WAYLAND), 1) gfx/common/wayland_common.o \ gfx/common/wayland/fractional-scale-v1.o \ gfx/common/wayland/viewporter.o \ + gfx/common/wayland/xdg-toplevel-icon-v1.o \ gfx/common/wayland/xdg-shell.o \ gfx/common/wayland/idle-inhibit-unstable-v1.o \ gfx/common/wayland/xdg-decoration-unstable-v1.o \ diff --git a/deps/wayland-protocols/staging/xdg-toplevel-icon/README b/deps/wayland-protocols/staging/xdg-toplevel-icon/README new file mode 100644 index 0000000000..76a394f5da --- /dev/null +++ b/deps/wayland-protocols/staging/xdg-toplevel-icon/README @@ -0,0 +1,4 @@ +xdg_toplevel_icon protocol + +Maintainers: +Matthias Klumpp (@mak) diff --git a/deps/wayland-protocols/staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml b/deps/wayland-protocols/staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml new file mode 100644 index 0000000000..fc409fef7c --- /dev/null +++ b/deps/wayland-protocols/staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml @@ -0,0 +1,205 @@ + + + + + Copyright © 2023-2024 Matthias Klumpp + Copyright © 2024 David Edmundson + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice (including the next + paragraph) shall be included in all copies or substantial portions of the + Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + + + This protocol allows clients to set icons for their toplevel surfaces + either via the XDG icon stock (using an icon name), or from pixel data. + + A toplevel icon represents the individual toplevel (unlike the application + or launcher icon, which represents the application as a whole), and may be + shown in window switchers, window overviews and taskbars that list + individual windows. + + This document adheres to RFC 2119 when using words like "must", + "should", "may", etc. + + Warning! The protocol described in this file is currently in the testing + phase. Backward compatible changes may be added together with the + corresponding interface version bump. Backward incompatible changes can + only be done by creating a new major version of the extension. + + + + + This interface allows clients to create toplevel window icons and set + them on toplevel windows to be displayed to the user. + + + + + Destroy the toplevel icon manager. + This does not destroy objects created with the manager. + + + + + + Creates a new icon object. This icon can then be attached to a + xdg_toplevel via the 'set_icon' request. + + + + + + + This request assigns the icon 'icon' to 'toplevel', or clears the + toplevel icon if 'icon' was null. + This state is double-buffered and is applied on the next + wl_surface.commit of the toplevel. + + After making this call, the xdg_toplevel_icon_v1 provided as 'icon' + can be destroyed by the client without 'toplevel' losing its icon. + The xdg_toplevel_icon_v1 is immutable from this point, and any + future attempts to change it must raise the + 'xdg_toplevel_icon_v1.immutable' protocol error. + + The compositor must set the toplevel icon from either the pixel data + the icon provides, or by loading a stock icon using the icon name. + See the description of 'xdg_toplevel_icon_v1' for details. + + If 'icon' is set to null, the icon of the respective toplevel is reset + to its default icon (usually the icon of the application, derived from + its desktop-entry file, or a placeholder icon). + If this request is passed an icon with no pixel buffers or icon name + assigned, the icon must be reset just like if 'icon' was null. + + + + + + + + This event indicates an icon size the compositor prefers to be + available if the client has scalable icons and can render to any size. + + When the 'xdg_toplevel_icon_manager_v1' object is created, the + compositor may send one or more 'icon_size' events to describe the list + of preferred icon sizes. If the compositor has no size preference, it + may not send any 'icon_size' event, and it is up to the client to + decide a suitable icon size. + + A sequence of 'icon_size' events must be finished with a 'done' event. + If the compositor has no size preferences, it must still send the + 'done' event, without any preceding 'icon_size' events. + + + + + + + This event is sent after all 'icon_size' events have been sent. + + + + + + + This interface defines a toplevel icon. + An icon can have a name, and multiple buffers. + In order to be applied, the icon must have either a name, or at least + one buffer assigned. Applying an empty icon (with no buffer or name) to + a toplevel should reset its icon to the default icon. + + It is up to compositor policy whether to prefer using a buffer or loading + an icon via its name. See 'set_name' and 'add_buffer' for details. + + + + + + + + + + + Destroys the 'xdg_toplevel_icon_v1' object. + The icon must still remain set on every toplevel it was assigned to, + until the toplevel icon is reset explicitly. + + + + + + This request assigns an icon name to this icon. + Any previously set name is overridden. + + The compositor must resolve 'icon_name' according to the lookup rules + described in the XDG icon theme specification[1] using the + environment's current icon theme. + + If the compositor does not support icon names or cannot resolve + 'icon_name' according to the XDG icon theme specification it must + fall back to using pixel buffer data instead. + + If this request is made after the icon has been assigned to a toplevel + via 'set_icon', a 'immutable' error must be raised. + + [1]: https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html + + + + + + + This request adds pixel data supplied as wl_buffer to the icon. + + The client should add pixel data for all icon sizes and scales that + it can provide, or which are explicitly requested by the compositor + via 'icon_size' events on xdg_toplevel_icon_manager_v1. + + The wl_buffer supplying pixel data as 'buffer' must be backed by wl_shm + and must be a square (width and height being equal). + If any of these buffer requirements are not fulfilled, a 'invalid_buffer' + error must be raised. + + If this icon instance already has a buffer of the same size and scale + from a previous 'add_buffer' request, data from the last request + overrides the preexisting pixel data. + + The wl_buffer must be kept alive for as long as the xdg_toplevel_icon + it is associated with is not destroyed, otherwise a 'no_buffer' error + is raised. The buffer contents must not be modified after it was + assigned to the icon. As a result, the region of the wl_shm_pool's + backing storage used for the wl_buffer must not be modified after this + request is sent. The wl_buffer.release event is unused. + + If this request is made after the icon has been assigned to a toplevel + via 'set_icon', a 'immutable' error must be raised. + + + + + + diff --git a/gfx/common/wayland/generate_wayland_protos.sh b/gfx/common/wayland/generate_wayland_protos.sh index c26b3cbbc6..d45de79218 100755 --- a/gfx/common/wayland/generate_wayland_protos.sh +++ b/gfx/common/wayland/generate_wayland_protos.sh @@ -73,3 +73,4 @@ generate_source 'staging/cursor-shape' 'cursor-shape-v1' generate_source 'unstable/tablet' 'tablet-unstable-v2' generate_source 'staging/content-type' 'content-type-v1' generate_source 'staging/single-pixel-buffer' 'single-pixel-buffer-v1' +generate_source 'staging/xdg-toplevel-icon' 'xdg-toplevel-icon-v1' diff --git a/gfx/common/wayland_common.c b/gfx/common/wayland_common.c index 8b0f557bcb..b2f9359845 100644 --- a/gfx/common/wayland_common.c +++ b/gfx/common/wayland_common.c @@ -295,6 +295,10 @@ void gfx_ctx_wl_destroy_resources_common(gfx_ctx_wayland_data_t *wl) zxdg_toplevel_decoration_v1_destroy(wl->deco); if (wl->xdg_toplevel) xdg_toplevel_destroy(wl->xdg_toplevel); + if (wl->xdg_toplevel_icon_manager) + xdg_toplevel_icon_manager_v1_destroy(wl->xdg_toplevel_icon_manager); + if (wl->xdg_toplevel_icon) + xdg_toplevel_icon_v1_destroy(wl->xdg_toplevel_icon); if (wl->xdg_surface) xdg_surface_destroy(wl->xdg_surface); if (wl->surface) @@ -363,30 +367,32 @@ void gfx_ctx_wl_destroy_resources_common(gfx_ctx_wayland_data_t *wl) wl_display_disconnect(wl->input.dpy); } - wl->input.dpy = NULL; - wl->registry = NULL; - wl->compositor = NULL; - wl->shm = NULL; - wl->data_device_manager = NULL; - wl->xdg_shell = NULL; - wl->seat = NULL; - wl->relative_pointer_manager = NULL; - wl->pointer_constraints = NULL; - wl->content_type = NULL; - wl->content_type_manager = NULL; - wl->cursor_shape_manager = NULL; - wl->cursor_shape_device = NULL; - wl->idle_inhibit_manager = NULL; - wl->deco_manager = NULL; - wl->single_pixel_manager = NULL; - wl->surface = NULL; - wl->xdg_surface = NULL; - wl->xdg_toplevel = NULL; - wl->deco = NULL; - wl->idle_inhibitor = NULL; - wl->wl_touch = NULL; - wl->wl_pointer = NULL; - wl->wl_keyboard = NULL; + wl->input.dpy = NULL; + wl->registry = NULL; + wl->compositor = NULL; + wl->shm = NULL; + wl->data_device_manager = NULL; + wl->xdg_shell = NULL; + wl->seat = NULL; + wl->relative_pointer_manager = NULL; + wl->pointer_constraints = NULL; + wl->content_type = NULL; + wl->content_type_manager = NULL; + wl->cursor_shape_manager = NULL; + wl->cursor_shape_device = NULL; + wl->idle_inhibit_manager = NULL; + wl->deco_manager = NULL; + wl->single_pixel_manager = NULL; + wl->surface = NULL; + wl->xdg_surface = NULL; + wl->xdg_toplevel = NULL; + wl->xdg_toplevel_icon = NULL; + wl->xdg_toplevel_icon_manager = NULL; + wl->deco = NULL; + wl->idle_inhibitor = NULL; + wl->wl_touch = NULL; + wl->wl_pointer = NULL; + wl->wl_keyboard = NULL; wl->width = 0; wl->height = 0; @@ -586,6 +592,29 @@ static void shm_buffer_paint_icon( } } +static bool wl_create_toplevel_icon(gfx_ctx_wayland_data_t *wl) +{ + wl->xdg_toplevel_icon = xdg_toplevel_icon_manager_v1_create_icon( + wl->xdg_toplevel_icon_manager); + xdg_toplevel_icon_v1_set_name(wl->xdg_toplevel_icon, WAYLAND_APP_ID); + + const int icon_size = wl->buffer_scale > 1 ? 128 : 64; + shm_buffer_t *icon_buffer = create_shm_buffer(wl, + icon_size, icon_size, WL_SHM_FORMAT_ARGB8888); + + if (icon_buffer) + { + shm_buffer_paint_icon(icon_buffer, icon_size, icon_size, 1, icon_size / 16); + xdg_toplevel_icon_v1_add_buffer( + wl->xdg_toplevel_icon, icon_buffer->wl_buffer, 1); + } + + xdg_toplevel_icon_manager_v1_set_icon( + wl->xdg_toplevel_icon_manager, wl->xdg_toplevel, wl->xdg_toplevel_icon); + + return true; +} + static void shm_buffer_paint_checkerboard( shm_buffer_t *buffer, int width, int height, int scale, @@ -778,6 +807,11 @@ bool gfx_ctx_wl_init_common( RARCH_LOG("[Wayland]: Compositor doesn't support the %s protocol!\n", wp_single_pixel_buffer_manager_v1_interface.name); } + if (!wl->xdg_toplevel_icon_manager) + { + RARCH_LOG("[Wayland]: Compositor doesn't support the %s protocol!\n", xdg_toplevel_icon_manager_v1_interface.name); + } + wl->surface = wl_compositor_create_surface(wl->compositor); if (wl->viewporter) wl->viewport = wp_viewporter_get_viewport(wl->viewporter, wl->surface); @@ -842,6 +876,9 @@ bool gfx_ctx_wl_init_common( wl->deco = zxdg_decoration_manager_v1_get_toplevel_decoration( wl->deco_manager, wl->xdg_toplevel); + if (wl->xdg_toplevel_icon_manager) + wl_create_toplevel_icon(wl); + /* Waiting for xdg_toplevel to be configured before starting to draw */ wl_surface_commit(wl->surface); wl->configured = true; diff --git a/input/common/wayland_common.c b/input/common/wayland_common.c index f17d2fe2ca..8eb59f829b 100644 --- a/input/common/wayland_common.c +++ b/input/common/wayland_common.c @@ -806,6 +806,10 @@ static void wl_registry_handle_global(void *data, struct wl_registry *reg, wl->single_pixel_manager = (struct wp_single_pixel_buffer_manager_v1*) wl_registry_bind( reg, id, &wp_single_pixel_buffer_manager_v1_interface, MIN(version, 1)); + else if (string_is_equal(interface, xdg_toplevel_icon_manager_v1_interface.name) && found++) + wl->xdg_toplevel_icon_manager = (struct xdg_toplevel_icon_manager_v1*) + wl_registry_bind( + reg, id, &xdg_toplevel_icon_manager_v1_interface, MIN(version, 1)); if (found > 1) RARCH_LOG("[Wayland]: Registered interface %s at version %u\n", diff --git a/input/common/wayland_common.h b/input/common/wayland_common.h index 125af85307..9d00619327 100644 --- a/input/common/wayland_common.h +++ b/input/common/wayland_common.h @@ -44,6 +44,7 @@ #include "../../gfx/common/wayland/viewporter.h" #include "../../gfx/common/wayland/xdg-decoration-unstable-v1.h" #include "../../gfx/common/wayland/xdg-shell.h" +#include "../../gfx/common/wayland/xdg-toplevel-icon-v1.h" #define FRACTIONAL_SCALE_V1_DEN 120 #define FRACTIONAL_SCALE_MULT(v, scale_num) \ @@ -159,6 +160,8 @@ typedef struct gfx_ctx_wayland_data struct wp_fractional_scale_v1 *fractional_scale; struct xdg_wm_base *xdg_shell; struct xdg_toplevel *xdg_toplevel; + struct xdg_toplevel_icon_v1 *xdg_toplevel_icon; + struct xdg_toplevel_icon_manager_v1 *xdg_toplevel_icon_manager; struct wl_keyboard *wl_keyboard; struct wl_pointer *wl_pointer; struct zwp_relative_pointer_v1 *wl_relative_pointer; From c4ee58a81ad615842a640ac771234aa9660f17f9 Mon Sep 17 00:00:00 2001 From: Aleksey Samoilov Date: Thu, 8 May 2025 18:10:28 +0400 Subject: [PATCH 051/175] Fix intend --- gfx/common/wayland_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gfx/common/wayland_common.c b/gfx/common/wayland_common.c index b2f9359845..344efad9f2 100644 --- a/gfx/common/wayland_common.c +++ b/gfx/common/wayland_common.c @@ -877,7 +877,7 @@ bool gfx_ctx_wl_init_common( wl->deco_manager, wl->xdg_toplevel); if (wl->xdg_toplevel_icon_manager) - wl_create_toplevel_icon(wl); + wl_create_toplevel_icon(wl); /* Waiting for xdg_toplevel to be configured before starting to draw */ wl_surface_commit(wl->surface); From 9cf03289ec44d80d54823d75cb8a8457b7da0e56 Mon Sep 17 00:00:00 2001 From: Aleksey Samoilov Date: Thu, 8 May 2025 18:55:51 +0400 Subject: [PATCH 052/175] Check if icon_buffer is created --- gfx/common/wayland_common.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gfx/common/wayland_common.c b/gfx/common/wayland_common.c index 344efad9f2..4a0fe96777 100644 --- a/gfx/common/wayland_common.c +++ b/gfx/common/wayland_common.c @@ -608,6 +608,11 @@ static bool wl_create_toplevel_icon(gfx_ctx_wayland_data_t *wl) xdg_toplevel_icon_v1_add_buffer( wl->xdg_toplevel_icon, icon_buffer->wl_buffer, 1); } + else + { + RARCH_ERR("[Wayland] Failed to create toplevel icon buffer\n"); + return false; + } xdg_toplevel_icon_manager_v1_set_icon( wl->xdg_toplevel_icon_manager, wl->xdg_toplevel, wl->xdg_toplevel_icon); From 2d3c18e48dd9645d6fe18b063ed321eef8a934ea Mon Sep 17 00:00:00 2001 From: BinBashBanana <51469593+BinBashBanana@users.noreply.github.com> Date: Thu, 8 May 2025 11:01:43 -0700 Subject: [PATCH 053/175] Emscripten improvements pt. 4 --- CHANGES.md | 4 + Makefile.emscripten | 25 +- audio/drivers/audioworklet.c | 3 + camera/drivers/rwebcam.c | 5 +- config.def.h | 4 - emscripten/library_platform_emscripten.js | 124 ++++++-- emscripten/library_rwebaudio.js | 2 +- emscripten/library_rwebcam.js | 314 ++++++++++++++------ emscripten/template.html | 134 --------- frontend/drivers/platform_emscripten.c | 193 +++++++++++- frontend/drivers/platform_emscripten.h | 56 ++++ gfx/drivers_context/emscriptenegl_ctx.c | 45 +-- gfx/drivers_context/emscriptenwebgl_ctx.c | 72 ++--- input/drivers/rwebinput_input.c | 112 ++++++- input/drivers_joypad/rwebpad_joypad.c | 86 +++++- input/input_driver.h | 2 + libretro-common/include/retro_timers.h | 22 +- pkg/emscripten/libretro-thread/index.html | 2 +- pkg/emscripten/libretro-thread/libretro.css | 16 + pkg/emscripten/libretro-thread/libretro.js | 14 +- pkg/emscripten/libretro/index.html | 2 +- pkg/emscripten/libretro/libretro.js | 8 +- retroarch.c | 6 +- 23 files changed, 851 insertions(+), 400 deletions(-) delete mode 100644 emscripten/template.html diff --git a/CHANGES.md b/CHANGES.md index a9ad792ab4..1cb87c7e44 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,8 @@ # Future +- EMSCRIPTEN: Support suspend screensaver +- EMSCRIPTEN/RWEBCAM: Fix camera driver +- EMSCRIPTEN/RWEBINPUT: Add accelerometer/gyroscope support +- EMSCRIPTEN/RWEBPAD: Add rumble support # 1.21.0 - 3DS: Fix unique IDs for newer cores diff --git a/Makefile.emscripten b/Makefile.emscripten index 0d44cb2580..7f3fc7b437 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -11,7 +11,7 @@ TARGET_BASE := $(subst .js,,$(TARGET)) OS = Emscripten OBJ := -DEFINES := -DRARCH_INTERNAL -DHAVE_MAIN -DEMSCRIPTEN -DNO_CANVAS_RESIZE +DEFINES := -DRARCH_INTERNAL -DHAVE_MAIN -DEMSCRIPTEN DEFINES += -DHAVE_FILTERS_BUILTIN -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORE_INFO HAVE_PATCH = 1 @@ -106,6 +106,9 @@ ASYNC ?= 0 LTO ?= 0 PTHREAD_POOL_SIZE ?= 4 +ASYNCIFY_ADD ?= dynCall_*,emscripten_mainloop +ASYNCIFY_REMOVE ?= threaded_worker + STACK_SIZE ?= 4194304 INITIAL_HEAP ?= 134217728 @@ -123,7 +126,7 @@ INITIAL_HEAP ?= 134217728 OBJDIR := obj-emscripten -EXPORTED_FUNCTIONS = _main,_malloc,_free,_cmd_savefiles,_cmd_save_state,_cmd_load_state,_cmd_undo_save_state,_cmd_undo_load_state,_cmd_take_screenshot,\ +EXPORTED_FUNCTIONS = _main,_malloc,_free,_cmd_savefiles,_cmd_save_state,_cmd_load_state,_cmd_undo_save_state,_cmd_undo_load_state,_cmd_toggle_fullscreen,_cmd_take_screenshot,\ _cmd_toggle_menu,_cmd_reload_config,_cmd_toggle_grab_mouse,_cmd_toggle_game_focus,_cmd_reset,_cmd_toggle_pause,_cmd_pause,_cmd_unpause,\ _cmd_set_volume,_cmd_set_shader,_cmd_cheat_set_code,_cmd_cheat_get_code,_cmd_cheat_toggle_index,_cmd_cheat_get_code_state,_cmd_cheat_realloc,\ _cmd_cheat_get_size,_cmd_cheat_apply_cheats,EmscriptenSendCommand,EmscriptenReceiveCommandReply @@ -168,7 +171,7 @@ LDFLAGS := -L. --no-heap-copy -s STACK_SIZE=$(STACK_SIZE) -s INITIAL_MEMORY=$(IN -s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS="$(EXPORTED_FUNCTIONS)" \ -s MODULARIZE=1 -s EXPORT_ES6=1 -s EXPORT_NAME="libretro_$(subst -,_,$(LIBRETRO))" \ -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=0 \ - -s ENVIRONMENT=web,worker \ + -s ENVIRONMENT=web,worker -s WASM_BIGINT=1 \ --extern-pre-js emscripten/pre.js \ --js-library emscripten/library_rwebcam.js \ --js-library emscripten/library_platform_emscripten.js @@ -240,7 +243,7 @@ ifeq ($(HAVE_THREADS), 1) endif ifeq ($(WASM_WORKERS), 1) - LDFLAGS += -s WASM_WORKERS=2 + LDFLAGS += -s WASM_WORKERS=1 endif ifeq ($(ASYNC), 1) @@ -251,7 +254,7 @@ ifeq ($(ASYNC), 1) endif else ifeq ($(MIN_ASYNC), 1) DEFINES += -DEMSCRIPTEN_ASYNCIFY -DEMSCRIPTEN_MIN_ASYNCIFY - LDFLAGS += -s ASYNCIFY=1 -s ASYNCIFY_STACK_SIZE=8192 -s ASYNCIFY_IGNORE_INDIRECT=1 -s ASYNCIFY_ADD='dynCall_*,emscripten_mainloop' -s ASYNCIFY_REMOVE='threaded_worker' + LDFLAGS += -s ASYNCIFY=1 -s ASYNCIFY_STACK_SIZE=8192 -s ASYNCIFY_IGNORE_INDIRECT=1 -s ASYNCIFY_ADD='$(ASYNCIFY_ADD)' -s ASYNCIFY_REMOVE='$(ASYNCIFY_REMOVE)' ifeq ($(DEBUG), 1) LDFLAGS += -s ASYNCIFY_ADVISE #-s ASYNCIFY_DEBUG=1 endif @@ -297,21 +300,11 @@ all: $(TARGET) $(libretro_new): ; mv_libretro: - mv -f $(libretro) $(libretro_new) || true + $(Q)mv -f $(libretro) $(libretro_new) || true -# until emscripten adds something like WASM_WORKERS=2 but for audio worklets, DIY. -ifeq ($(HAVE_AUDIOWORKLET), 1) $(TARGET): $(RARCH_OBJ) $(libretro_new) mv_libretro @$(if $(Q), $(shell echo echo "LD $@ \ $(libretro_new) $(LIBS) $(LDFLAGS)"),) $(Q)$(LD) -o $@ $(RARCH_OBJ) $(libretro_new) $(LIBS) $(LDFLAGS) - $(Q)tr -d '\n' < "$(TARGET_BASE).aw.js" | sed -e "s/[\/&]/\\\\&/g" -e "s/'/\\\\\\\\&/g" > _audioworklet.js - $(Q)sed -i.bak -e "s/\"$(TARGET_BASE)\.aw\.js\"/URL.createObjectURL(new Blob(['$$(cat _audioworklet.js)'],{type:'text\/javascript'}))/" -- "$@" - $(Q)rm -f "$(TARGET_BASE).aw.js" _audioworklet.js "$@".bak -else -$(TARGET): $(RARCH_OBJ) $(libretro_new) mv_libretro - @$(if $(Q), $(shell echo echo "LD $@ \ $(libretro_new) $(LIBS) $(LDFLAGS)"),) - $(Q)$(LD) -o $@ $(RARCH_OBJ) $(libretro_new) $(LIBS) $(LDFLAGS) -endif $(OBJDIR)/%.o: %.c @mkdir -p $(dir $@) diff --git a/audio/drivers/audioworklet.c b/audio/drivers/audioworklet.c index d5425ff88a..adcaa67c96 100644 --- a/audio/drivers/audioworklet.c +++ b/audio/drivers/audioworklet.c @@ -382,6 +382,9 @@ bool audioworklet_external_block(void) { audioworklet_data_t *audioworklet = audioworklet_static_data; + if (!audioworklet) + return false; + #ifdef EMSCRIPTEN_AUDIO_FAKE_BLOCK if (!audioworklet->block_requested) return false; diff --git a/camera/drivers/rwebcam.c b/camera/drivers/rwebcam.c index 5a08e951ac..292be416e7 100644 --- a/camera/drivers/rwebcam.c +++ b/camera/drivers/rwebcam.c @@ -14,6 +14,7 @@ * If not, see . */ +#include #include #include @@ -23,7 +24,7 @@ #include "../../retroarch.h" /* forward declarations */ -void *RWebCamInit(uint64_t caps, unsigned width, unsigned height); +void *RWebCamInit(uint64_t caps, unsigned width, unsigned height, bool debug); void RWebCamFree(void *data); bool RWebCamStart(void *data); void RWebCamStop(void *data); @@ -34,7 +35,7 @@ static void *rwebcam_init(const char *device, uint64_t caps, unsigned width, unsigned height) { (void)device; - return RWebCamInit(caps, width, height); + return RWebCamInit(caps, width, height, !!getenv("RWEBCAM_DEBUG")); } static void rwebcam_free(void *data) diff --git a/config.def.h b/config.def.h index d31f27feab..0bfb35bd9b 100644 --- a/config.def.h +++ b/config.def.h @@ -1290,11 +1290,7 @@ #endif /* Pause gameplay when window loses focus. */ -#if defined(EMSCRIPTEN) -#define DEFAULT_PAUSE_NONACTIVE false -#else #define DEFAULT_PAUSE_NONACTIVE true -#endif /* Pause gameplay when controller disconnects. */ #define DEFAULT_PAUSE_ON_DISCONNECT false diff --git a/emscripten/library_platform_emscripten.js b/emscripten/library_platform_emscripten.js index 3d015a5649..4edfb92a0c 100644 --- a/emscripten/library_platform_emscripten.js +++ b/emscripten/library_platform_emscripten.js @@ -2,23 +2,14 @@ var LibraryPlatformEmscripten = { $RPE: { - powerStateChange: function(e) { - _platform_emscripten_update_power_state(true, Number.isFinite(e.target.dischargingTime) ? e.target.dischargingTime : 0x7FFFFFFF, e.target.level, e.target.charging); - }, - - updateMemoryUsage: function() { - // unfortunately this will be innacurate in threaded (worker) builds - var used = BigInt(performance.memory.usedJSHeapSize || 0); - var limit = BigInt(performance.memory.jsHeapSizeLimit || 0); - // emscripten currently only supports passing 32 bit ints, so pack it - _platform_emscripten_update_memory_usage(Number(used & 0xFFFFFFFFn), Number(used >> 32n), Number(limit & 0xFFFFFFFFn), Number(limit >> 32n)); - setTimeout(RPE.updateMemoryUsage, 5000); - }, + canvasWidth: 0, + canvasHeight: 0, + sentinelPromise: null, command_queue: [], command_reply_queue: [] }, - PlatformEmscriptenWatchCanvasSizeAndDpr__deps: ["platform_emscripten_update_canvas_dimensions"], + PlatformEmscriptenWatchCanvasSizeAndDpr__deps: ["platform_emscripten_update_canvas_dimensions_cb"], PlatformEmscriptenWatchCanvasSizeAndDpr: function(dpr) { if (RPE.observer) { RPE.observer.unobserve(Module.canvas); @@ -36,9 +27,11 @@ var LibraryPlatformEmscripten = { width = Math.round(entry.contentRect.width * window.devicePixelRatio); height = Math.round(entry.contentRect.height * window.devicePixelRatio); } + RPE.canvasWidth = width; + RPE.canvasHeight = height; // doubles are too big to pass as an argument to exported functions {{{ makeSetValue("dpr", "0", "window.devicePixelRatio", "double") }}}; - _platform_emscripten_update_canvas_dimensions(width, height, dpr); + _platform_emscripten_update_canvas_dimensions_cb(width, height, dpr); }); RPE.observer.observe(Module.canvas); window.addEventListener("resize", function() { @@ -47,27 +40,112 @@ var LibraryPlatformEmscripten = { }, false); }, - PlatformEmscriptenWatchWindowVisibility__deps: ["platform_emscripten_update_window_hidden"], + PlatformEmscriptenWatchWindowVisibility__deps: ["platform_emscripten_update_window_hidden_cb"], PlatformEmscriptenWatchWindowVisibility: function() { document.addEventListener("visibilitychange", function() { - _platform_emscripten_update_window_hidden(document.visibilityState == "hidden"); + _platform_emscripten_update_window_hidden_cb(document.visibilityState == "hidden"); }, false); }, - PlatformEmscriptenPowerStateInit__deps: ["platform_emscripten_update_power_state"], + $PlatformEmscriptenPowerStateChange__deps: ["platform_emscripten_update_power_state_cb"], + $PlatformEmscriptenPowerStateChange: function(e) { + _platform_emscripten_update_power_state_cb(true, Number.isFinite(e.target.dischargingTime) ? e.target.dischargingTime : 0x7FFFFFFF, e.target.level, e.target.charging); + }, + + PlatformEmscriptenPowerStateInit__deps: ["$PlatformEmscriptenPowerStateChange"], PlatformEmscriptenPowerStateInit: function() { if (!navigator.getBattery) return; navigator.getBattery().then(function(battery) { - battery.addEventListener("chargingchange", RPE.powerStateChange); - battery.addEventListener("levelchange", RPE.powerStateChange); - RPE.powerStateChange({target: battery}); + battery.addEventListener("chargingchange", PlatformEmscriptenPowerStateChange); + battery.addEventListener("levelchange", PlatformEmscriptenPowerStateChange); + PlatformEmscriptenPowerStateChange({target: battery}); }); }, - PlatformEmscriptenMemoryUsageInit__deps: ["platform_emscripten_update_memory_usage"], + $PlatformEmscriptenUpdateMemoryUsage__deps: ["platform_emscripten_update_memory_usage_cb"], + $PlatformEmscriptenUpdateMemoryUsage: function() { + // unfortunately this will be inaccurate in threaded (worker) builds + _platform_emscripten_update_memory_usage_cb(BigInt(performance.memory.usedJSHeapSize || 0), BigInt(performance.memory.jsHeapSizeLimit || 0)); + setTimeout(PlatformEmscriptenUpdateMemoryUsage, 5000); + }, + + PlatformEmscriptenMemoryUsageInit__deps: ["$PlatformEmscriptenUpdateMemoryUsage"], PlatformEmscriptenMemoryUsageInit: function() { if (!performance.memory) return; - RPE.updateMemoryUsage(); + PlatformEmscriptenUpdateMemoryUsage(); + }, + + PlatformEmscriptenWatchFullscreen__deps: ["platform_emscripten_update_fullscreen_state_cb"], + PlatformEmscriptenWatchFullscreen: function() { + document.addEventListener("fullscreenchange", function() { + _platform_emscripten_update_fullscreen_state_cb(!!document.fullscreenElement); + }, false); + }, + + PlatformEmscriptenGLContextEventInit__deps: ["platform_emscripten_gl_context_lost_cb", "platform_emscripten_gl_context_restored_cb"], + PlatformEmscriptenGLContextEventInit: function() { + Module.canvas.addEventListener("webglcontextlost", function(e) { + e.preventDefault(); + _platform_emscripten_gl_context_lost_cb(); + }); + Module.canvas.addEventListener("webglcontextrestored", function() { + _platform_emscripten_gl_context_restored_cb(); + }); + }, + + $PlatformEmscriptenDoSetCanvasSize: async function(width, height) { + // window.resizeTo is terrible; it uses window.outerWidth/outerHeight dimensions, + // which are on their own scale entirely, which also changes with the zoom level independently from the DPR. + // instead try 2 hardcoded sizes first and interpolate to find the correct size. + var expAX = 600; + var expAY = 450; + var expBX = expAX + 100; + var expBY = expAY + 100; + await new Promise(r => setTimeout(r, 0)); + window.resizeTo(expAX, expAY); + await new Promise(r => setTimeout(r, 50)); + var oldWidth = RPE.canvasWidth; + var oldHeight = RPE.canvasHeight; + window.resizeTo(expBX, expBY); + await new Promise(r => setTimeout(r, 50)); + var projX = (expBX - expAX) * (width - oldWidth) / (RPE.canvasWidth - oldWidth) + expAX; + var projY = (expBY - expAY) * (height - oldHeight) / (RPE.canvasHeight - oldHeight) + expAY; + window.resizeTo(Math.round(projX), Math.round(projY)); + }, + + PlatformEmscriptenSetCanvasSize__proxy: "sync", + PlatformEmscriptenSetCanvasSize__deps: ["$PlatformEmscriptenDoSetCanvasSize"], + PlatformEmscriptenSetCanvasSize: function(width, height) { + // c-accessible library functions should not be async + PlatformEmscriptenDoSetCanvasSize(width, height); + }, + + $PlatformEmscriptenDoSetWakeLock: async function(state) { + if (state && !RPE.sentinelPromise && navigator?.wakeLock?.request) { + try { + RPE.sentinelPromise = navigator.wakeLock.request("screen"); + } catch (e) {} + } else if (!state && RPE.sentinelPromise) { + try { + var sentinel = await RPE.sentinelPromise; + sentinel.release(); + } catch (e) {} + RPE.sentinelPromise = null; + } + }, + + PlatformEmscriptenSetWakeLock__proxy: "sync", + PlatformEmscriptenSetWakeLock__deps: ["$PlatformEmscriptenDoSetWakeLock"], + PlatformEmscriptenSetWakeLock: function(state) { + PlatformEmscriptenDoSetWakeLock(state); + }, + + PlatformEmscriptenGetSystemInfo: function() { + var userAgent = navigator?.userAgent?.toLowerCase?.(); + if (!userAgent) return 0; + var browser = 1 + ["chrom", "firefox", "safari"].findIndex(i => userAgent.includes(i)); + var os = 1 + [/windows/, /linux|cros|android/, /iphone|ipad/, /mac os/].findIndex(i => i.test(userAgent)); + return browser | (os << 16); }, $EmscriptenSendCommand__deps: ["platform_emscripten_command_raise_flag"], @@ -82,4 +160,4 @@ var LibraryPlatformEmscripten = { }; autoAddDeps(LibraryPlatformEmscripten, '$RPE'); -mergeInto(LibraryManager.library, LibraryPlatformEmscripten); +addToLibrary(LibraryPlatformEmscripten); diff --git a/emscripten/library_rwebaudio.js b/emscripten/library_rwebaudio.js index dfbca1e228..e7fa3dd76f 100644 --- a/emscripten/library_rwebaudio.js +++ b/emscripten/library_rwebaudio.js @@ -168,4 +168,4 @@ var LibraryRWebAudio = { }; autoAddDeps(LibraryRWebAudio, '$RA'); -mergeInto(LibraryManager.library, LibraryRWebAudio); +addToLibrary(LibraryRWebAudio); diff --git a/emscripten/library_rwebcam.js b/emscripten/library_rwebcam.js index 2aaef6e44d..a3517dce0b 100644 --- a/emscripten/library_rwebcam.js +++ b/emscripten/library_rwebcam.js @@ -5,133 +5,273 @@ var LibraryRWebCam = { RETRO_CAMERA_BUFFER_OPENGL_TEXTURE: 0, RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER: 1, tmp: null, - contexts: [], - counter: 0, - - ready: function(data) { - return RWC.contexts[data].runMode == 2 && !RWC.contexts[data].videoElement.paused && RWC.contexts[data].videoElement.videoWidth != 0 && RWC.contexts[data].videoElement.videoHeight != 0; - } + counter: 0 }, - RWebCamInit__deps: ['malloc'], - RWebCamInit: function(caps1, caps2, width, height) { - if (!navigator) return 0; - if (!navigator.mediaDevices.getUserMedia) return 0; + $RWebCamReady: function(c) { + try { + /* try to start video it was paused */ + if (RWC.contexts[c].videoElement.paused) RWC.contexts[c].videoElement.play(); + } catch (e) {} + return RWC.contexts[c].cameraRunning && !RWC.contexts[c].videoElement.paused && RWC.contexts[c].videoElement.videoWidth != 0 && RWC.contexts[c].videoElement.videoHeight != 0; + }, + + $RWebCamInitBrowser__proxy: "sync", + $RWebCamInitBrowser: function(width, height, glTex, rawFb, debug, proxied) { + if (!navigator?.mediaDevices?.getUserMedia) return 0; var c = ++RWC.counter; + RWC.contexts[c] = {width: width, height: height, glTex: glTex, rawFb: rawFb, debug: debug, proxied: proxied, idealWidth: width, idealHeight: height}; + return c; + }, - RWC.contexts[c] = []; - RWC.contexts[c].videoElement = document.createElement("video"); - RWC.contexts[c].videoElement.classList.add("retroarchWebcamVideo"); - if (width !== 0 && height !== 0) { - RWC.contexts[c].videoElement.width = width; - RWC.contexts[c].videoElement.height = height; + RWebCamInit__deps: ["malloc", "$RWebCamInitBrowser"], + RWebCamInit: function(caps, width, height, debug) { + var glTex = Number(caps) & (1 << RWC.RETRO_CAMERA_BUFFER_OPENGL_TEXTURE); + var rawFb = Number(caps) & (1 << RWC.RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER); + var c = RWebCamInitBrowser(width, height, glTex, rawFb, debug, ENVIRONMENT_IS_PTHREAD); + if (!c) return 0; + + if (debug) console.log("RWebCamInit", c); + + if (ENVIRONMENT_IS_PTHREAD) { + RWC.contexts[c] = {}; + RWC.contexts[c].debug = debug; + RWC.contexts[c].glTex = glTex; + RWC.contexts[c].rawFb = rawFb; } - RWC.contexts[c].runMode = 1; - RWC.contexts[c].glTex = caps1 & (1 << RWC.RETRO_CAMERA_BUFFER_OPENGL_TEXTURE); - RWC.contexts[c].rawFb = caps1 & (1 << RWC.RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER); - navigator.mediaDevices.getUserMedia({video: true, audio: false}).then(function(stream) { - RWC.contexts[c].videoElement.autoplay = true; - RWC.contexts[c].videoElement.srcObject = stream; - RWC.contexts[c].runMode = 2; - }).catch(function (err) { - console.log("webcam request failed", err); - RWC.runMode = 0; - }); - - // for getting/storing texture id in GL mode + /* for getting/storing texture id in GL mode */ if (!RWC.tmp) RWC.tmp = _malloc(4); return c; }, - RWebCamFree: function(data) { - RWC.contexts[data].videoElement.pause(); - RWC.contexts[data].videoElement = null; - RWC.contexts[data] = null; + $RWebCamFreeBrowser__proxy: "sync", + $RWebCamFreeBrowser: function(c) { + RWC.contexts[c] = null; }, - RWebCamStart__deps: ['glGenTextures', 'glBindTexture', 'glGetIntegerv', 'glTexParameteri', 'malloc'], - RWebCamStart: function(data) { - var ret = 0; - if (RWC.contexts[data].glTex) { + RWebCamFree__deps: ["$RWebCamFreeBrowser", "RWebCamStop"], + RWebCamFree: function(c) { + if (RWC.contexts[c].debug) console.log("RWebCamFree", c); + if (RWC.contexts[c].running) _RWebCamStop(c); /* need more checks in RA */ + RWebCamFreeBrowser(c); + if (ENVIRONMENT_IS_PTHREAD) RWC.contexts[c] = null; + }, + + $RWebCamStartBrowser__proxy: "sync", + $RWebCamStartBrowser: function(c) { + RWC.contexts[c].videoElement = document.createElement("video"); + RWC.contexts[c].videoElement.classList.add("retroarchWebcamVideo"); + if (RWC.contexts[c].debug) document.body.appendChild(RWC.contexts[c].videoElement); + + if (RWC.contexts[c].rawFb || RWC.contexts[c].proxied) { + RWC.contexts[c].rawFbCanvas = document.createElement("canvas"); + RWC.contexts[c].rawFbCanvas.classList.add("retroarchWebcamCanvas"); + if (RWC.contexts[c].debug) document.body.appendChild(RWC.contexts[c].rawFbCanvas); + } + + var videoOpts = true; + if (RWC.contexts[c].idealWidth && RWC.contexts[c].idealHeight) { + /* save us some cropping/scaling, only honored by some browsers */ + videoOpts = {width: RWC.contexts[c].idealWidth, height: RWC.contexts[c].idealHeight, aspectRatio: RWC.contexts[c].idealWidth / RWC.contexts[c].idealHeight}; + } + + navigator.mediaDevices.getUserMedia({audio: false, video: videoOpts}).then(function(stream) { + if (!RWC.contexts[c]?.running) { + /* too late */ + for (var track of stream.getVideoTracks()) { + track.stop(); + } + return; + } + RWC.contexts[c].videoElement.autoplay = true; + RWC.contexts[c].videoElement.srcObject = stream; + RWC.contexts[c].cameraRunning = true; + }).catch(function(e) { + console.log("[rwebcam] webcam request failed", e); + }); + + RWC.contexts[c].running = true; + }, + + RWebCamStart__deps: ["glGenTextures", "glBindTexture", "glGetIntegerv", "glTexParameteri", "malloc", "$RWebCamStartBrowser"], + RWebCamStart: function(c) { + if (RWC.contexts[c].debug) console.log("RWebCamStart", c); + if (RWC.contexts[c].running) return; + if (RWC.contexts[c].glTex) { _glGenTextures(1, RWC.tmp); - RWC.contexts[data].glTexId = {{{ makeGetValue('RWC.tmp', '0', 'i32') }}}; - if (RWC.contexts[data].glTexId !== 0) { - // save previous texture + RWC.contexts[c].glTexId = {{{ makeGetValue('RWC.tmp', 0, 'i32') }}}; + if (RWC.contexts[c].glTexId !== 0) { + /* save previous texture */ _glGetIntegerv(0x8069 /* GL_TEXTURE_BINDING_2D */, RWC.tmp); - var prev = {{{ makeGetValue('RWC.tmp', '0', 'i32') }}}; - _glBindTexture(0x0DE1 /* GL_TEXTURE_2D */, RWC.contexts[data].glTexId); + var prev = {{{ makeGetValue('RWC.tmp', 0, 'i32') }}}; + _glBindTexture(0x0DE1 /* GL_TEXTURE_2D */, RWC.contexts[c].glTexId); /* NPOT textures in WebGL must have these filters and clamping settings */ _glTexParameteri(0x0DE1 /* GL_TEXTURE_2D */, 0x2800 /* GL_TEXTURE_MAG_FILTER */, 0x2601 /* GL_LINEAR */); _glTexParameteri(0x0DE1 /* GL_TEXTURE_2D */, 0x2801 /* GL_TEXTURE_MIN_FILTER */, 0x2601 /* GL_LINEAR */); _glTexParameteri(0x0DE1 /* GL_TEXTURE_2D */, 0x2802 /* GL_TEXTURE_WRAP_S */, 0x812F /* GL_CLAMP_TO_EDGE */); _glTexParameteri(0x0DE1 /* GL_TEXTURE_2D */, 0x2803 /*GL_TEXTURE_WRAP_T */, 0x812F /* GL_CLAMP_TO_EDGE */); _glBindTexture(0x0DE1 /* GL_TEXTURE_2D */, prev); - RWC.contexts[data].glFirstFrame = true; - ret = 1; + RWC.contexts[c].glFirstFrame = true; } } - if (RWC.contexts[data].rawFb) { - RWC.contexts[data].rawFbCanvas = document.createElement("canvas"); - RWC.contexts[data].rawFbCanvas.classList.add("retroarchWebcamCanvas"); - ret = 1; - } - return ret; + RWebCamStartBrowser(c); + RWC.contexts[c].running = true; + return 1; }, - RWebCamStop__deps: ['glDeleteTextures', 'free'], - RWebCamStop: function(data) { - if (RWC.contexts[data].glTexId) { - _glDeleteTextures(1, RWC.contexts[data].glTexId); - } - - if (RWC.contexts[data].rawFbCanvas) { - if (RWC.contexts[data].rawBuffer) { - _free(RWC.contexts[data].rawBuffer); - RWC.contexts[data].rawBuffer = 0; - RWC.contexts[data].rawFbCanvasCtx = null + $RWebCamStopBrowser__proxy: "sync", + $RWebCamStopBrowser: function(c) { + if (RWC.contexts[c].debug && RWC.contexts[c].rawFbCanvas) document.body.removeChild(RWC.contexts[c].rawFbCanvas); + RWC.contexts[c].rawFbCanvasCtx = null; + RWC.contexts[c].rawFbCanvas = null; + RWC.contexts[c].videoElement.pause(); + if (RWC.contexts[c].cameraRunning) { + for (var track of RWC.contexts[c].videoElement.srcObject.getVideoTracks()) { + track.stop(); } - RWC.contexts[data].rawFbCanvas = null; } + if (RWC.contexts[c].debug) document.body.removeChild(RWC.contexts[c].videoElement); + RWC.contexts[c].videoElement = null; + RWC.contexts[c].running = false; }, - RWebCamPoll__deps: ['glBindTexture', 'glGetIntegerv'], - RWebCamPoll: function(data, frame_raw_cb, frame_gl_cb) { - if (!RWC.ready(data)) return 0; + RWebCamStop__deps: ["free", "glDeleteTextures", "$RWebCamStopBrowser"], + RWebCamStop: function(c) { + if (RWC.contexts[c].debug) console.log("RWebCamStop", c); + if (!RWC.contexts[c].running) return; + + if (RWC.contexts[c].glTexId) { + _glDeleteTextures(1, RWC.contexts[c].glTexId); + } + + if (RWC.contexts[c].rawBuffer) { + _free(RWC.contexts[c].rawBuffer); + RWC.contexts[c].rawBuffer = 0; + } + + RWebCamStopBrowser(c); + RWC.contexts[c].running = false; + }, + + $RWebCamCheckDimensions: function(c) { + if (!RWC.contexts[c].width) RWC.contexts[c].width = RWC.contexts[c].videoElement.videoWidth; + if (!RWC.contexts[c].height) RWC.contexts[c].height = RWC.contexts[c].videoElement.videoHeight; + }, + + $RWebCamStoreDimensions__proxy: "sync", + $RWebCamStoreDimensions__deps: ["$RWebCamReady", "$RWebCamCheckDimensions"], + $RWebCamStoreDimensions: function(c, ptr) { + if (!RWebCamReady(c)) return 0; + RWebCamCheckDimensions(c); + {{{ makeSetValue('ptr', 0, 'RWC.contexts[c].width', 'i32') }}}; + {{{ makeSetValue('ptr', 4, 'RWC.contexts[c].height', 'i32') }}}; + return 1; + }, + + $RWebCamGetImageData__deps: ["$RWebCamReady"], + $RWebCamGetImageData: function(c) { + if (!RWebCamReady(c)) return 0; + if (!RWC.contexts[c].rawFbCanvasCtx) { + RWC.contexts[c].rawFbCanvas.width = RWC.contexts[c].width; + RWC.contexts[c].rawFbCanvas.height = RWC.contexts[c].height; + RWC.contexts[c].rawFbCanvasCtx = RWC.contexts[c].rawFbCanvas.getContext("2d", {willReadFrequently: true}); + } + /* crop to desired aspect ratio if necessary */ + var oldAspect = RWC.contexts[c].videoElement.videoWidth / RWC.contexts[c].videoElement.videoHeight; + var newAspect = RWC.contexts[c].rawFbCanvas.width / RWC.contexts[c].rawFbCanvas.height; + var width = RWC.contexts[c].videoElement.videoWidth; + var height = RWC.contexts[c].videoElement.videoHeight; + var offsetX = 0; + var offsetY = 0; + if (oldAspect > newAspect) { + width = height * newAspect; + offsetX = (RWC.contexts[c].videoElement.videoWidth - width) / 2; + } else if (oldAspect < newAspect) { + height = width / newAspect; + offsetY = (RWC.contexts[c].videoElement.videoHeight - height) / 2; + } + RWC.contexts[c].rawFbCanvasCtx.drawImage(RWC.contexts[c].videoElement, + offsetX, offsetY, width, height, + 0, 0, RWC.contexts[c].rawFbCanvas.width, RWC.contexts[c].rawFbCanvas.height); + return RWC.contexts[c].rawFbCanvasCtx.getImageData(0, 0, RWC.contexts[c].rawFbCanvas.width, RWC.contexts[c].rawFbCanvas.height).data; + }, + + $RWebCamStoreImageData__proxy: "sync", + $RWebCamStoreImageData__deps: ["$RWebCamGetImageData"], + $RWebCamStoreImageData: function(c, ptr) { + var data = RWebCamGetImageData(c); + if (!data) return 0; + HEAPU8.set(data, ptr); + return 1; + }, + + RWebCamPoll__deps: ["$RWebCamReady", "glBindTexture", "glGetIntegerv", "malloc", "free", "$RWebCamStoreDimensions", "$RWebCamCheckDimensions", "$RWebCamStoreImageData"], + RWebCamPoll: function(c, frame_raw_cb, frame_gl_cb) { + if (RWC.contexts[c].debug) console.log("RWebCamPoll", c, ENVIRONMENT_IS_PTHREAD, RWC.contexts[c].rawBuffer, RWC.contexts[c].running); + if (!RWC.contexts[c].running) return 0; /* need more checks in RA */ var ret = 0; - if (RWC.contexts[data].glTexId !== 0 && frame_gl_cb !== 0) { - _glGetIntegerv(0x8069 /* GL_TEXTURE_BINDING_2D */, RWC.tmp); - var prev = {{{ makeGetValue('RWC.tmp', '0', 'i32') }}}; - _glBindTexture(0x0DE1 /* GL_TEXTURE_2D */, RWC.contexts[data].glTexId); - if (RWC.contexts[data].glFirstFrame) { - Module.ctx.texImage2D(Module.ctx.TEXTURE_2D, 0, Module.ctx.RGB, Module.ctx.RGB, Module.ctx.UNSIGNED_BYTE, RWC.contexts[data].videoElement); - RWC.contexts[data].glFirstFrame = false; + if ((RWC.contexts[c].rawFb && frame_raw_cb !== 0) || ENVIRONMENT_IS_PTHREAD) { + if (!RWC.contexts[c].rawBuffer) { + if (ENVIRONMENT_IS_PTHREAD) { + /* pull dimensions into this thread */ + var dimensions = _malloc(8); + var res = RWebCamStoreDimensions(c, dimensions); /* also checks ready(c) */ + if (!res) { + _free(dimensions); + return 0; + } + RWC.contexts[c].width = {{{ makeGetValue('dimensions', 0, 'i32') }}}; + RWC.contexts[c].height = {{{ makeGetValue('dimensions', 4, 'i32') }}}; + _free(dimensions); + RWC.contexts[c].length = RWC.contexts[c].width * RWC.contexts[c].height * 4; + } else { + if (!RWebCamReady(c)) return 0; + RWebCamCheckDimensions(c); + } + RWC.contexts[c].rawBuffer = _malloc(RWC.contexts[c].width * RWC.contexts[c].height * 4 + 1); + } + /* store at +1 so we can read data as XRGB */ + if (!RWebCamStoreImageData(c, RWC.contexts[c].rawBuffer + 1)) return 0; + } + + if (RWC.contexts[c].glTexId !== 0 && frame_gl_cb !== 0) { + var imageSrcGL; + if (ENVIRONMENT_IS_PTHREAD) { + imageSrcGL = HEAPU8.subarray(RWC.contexts[c].rawBuffer + 1, RWC.contexts[c].rawBuffer + RWC.contexts[c].length + 1); } else { - Module.ctx.texSubImage2D(Module.ctx.TEXTURE_2D, 0, 0, 0, Module.ctx.RGB, Module.ctx.UNSIGNED_BYTE, RWC.contexts[data].videoElement); + if (!RWebCamReady(c)) return 0; + imageSrcGL = RWC.contexts[c].videoElement; + } + + _glGetIntegerv(0x8069 /* GL_TEXTURE_BINDING_2D */, RWC.tmp); + var prev = {{{ makeGetValue('RWC.tmp', 0, 'i32') }}}; + _glBindTexture(0x0DE1 /* GL_TEXTURE_2D */, RWC.contexts[c].glTexId); + if (RWC.contexts[c].glFirstFrame) { + if (ENVIRONMENT_IS_PTHREAD) + Module.ctx.texImage2D(Module.ctx.TEXTURE_2D, 0, Module.ctx.RGBA, RWC.contexts[c].width, RWC.contexts[c].height, 0, Module.ctx.RGBA, Module.ctx.UNSIGNED_BYTE, imageSrcGL); + else + Module.ctx.texImage2D(Module.ctx.TEXTURE_2D, 0, Module.ctx.RGB, Module.ctx.RGB, Module.ctx.UNSIGNED_BYTE, imageSrcGL); + RWC.contexts[c].glFirstFrame = false; + } else { + if (ENVIRONMENT_IS_PTHREAD) + Module.ctx.texSubImage2D(Module.ctx.TEXTURE_2D, 0, 0, 0, RWC.contexts[c].width, RWC.contexts[c].height, Module.ctx.RGBA, Module.ctx.UNSIGNED_BYTE, imageSrcGL); + else + Module.ctx.texSubImage2D(Module.ctx.TEXTURE_2D, 0, 0, 0, Module.ctx.RGB, Module.ctx.UNSIGNED_BYTE, imageSrcGL); } _glBindTexture(0x0DE1 /* GL_TEXTURE_2D */, prev); - Runtime.dynCall('viii', frame_gl_cb, [RWC.contexts[data].glTexId, 0x0DE1 /* GL_TEXTURE_2D */, 0]); + {{{ makeDynCall('viip', 'frame_gl_cb') }}}(RWC.contexts[c].glTexId, 0x0DE1 /* GL_TEXTURE_2D */, 0); ret = 1; } - if (RWC.contexts[data].rawFbCanvas && frame_raw_cb !== 0) + if (RWC.contexts[c].rawFb && frame_raw_cb !== 0) { - if (!RWC.contexts[data].rawFbCanvasCtx) { - RWC.contexts[data].rawFbCanvas.width = RWC.contexts[data].videoElement.videoWidth; - RWC.contexts[data].rawFbCanvas.height = RWC.contexts[data].videoElement.videoHeight; - RWC.contexts[data].rawFbCanvasCtx = RWC.contexts[data].rawFbCanvas.getContext("2d"); - RWC.contexts[data].rawBuffer = _malloc(RWC.contexts[data].videoElement.videoWidth * RWC.contexts[data].videoElement.videoHeight * 4); - } - RWC.contexts[data].rawFbCanvasCtx.drawImage(RWC.contexts[data].videoElement, 0, 0, RWC.contexts[data].rawFbCanvas.width, RWC.contexts[data].rawFbCanvas.height); - var image = RWC.contexts[data].rawFbCanvasCtx.getImageData(0, 0, RWC.contexts[data].videoElement.videoWidth, RWC.contexts[data].videoElement.videoHeight); - Module.HEAPU8.set(image.data, RWC.contexts[data].rawBuffer); - Runtime.dynCall('viiii', frame_raw_cb, [RWC.contexts[data].rawBuffer, RWC.contexts[data].videoElement.videoWidth, RWC.contexts[data].videoElement.videoHeight, RWC.contexts[data].videoElement.videoWidth * 4]); - + {{{ makeDynCall('vpiii', 'frame_raw_cb') }}}(RWC.contexts[c].rawBuffer, RWC.contexts[c].width, RWC.contexts[c].height, RWC.contexts[c].width * 4); ret = 1; } @@ -140,4 +280,4 @@ var LibraryRWebCam = { }; autoAddDeps(LibraryRWebCam, '$RWC'); -mergeInto(LibraryManager.library, LibraryRWebCam); +addToLibrary(LibraryRWebCam); diff --git a/emscripten/template.html b/emscripten/template.html deleted file mode 100644 index 1ee0732476..0000000000 --- a/emscripten/template.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - RetroArch Web Player - - - - - -
- -
- - - -
-
-
- - -
-
-
- -
- -
- Controls:
-
- A button (OK in menu): X
- B button (Back in menu): Z
- X Button: S
- Y Button: A
- L Button: Q
- R Button: W
- D-pad: Arrow Keys
- Start Button: Enter
- Select Button: Shift
- Toggle Menu: F1
- Fast forward: Spacebar (toggle)
- Slow motion: E (hold)
- Save state: F2
- Load state: F4 -
- - - - - - diff --git a/frontend/drivers/platform_emscripten.c b/frontend/drivers/platform_emscripten.c index ff2cb3ec6f..778622808f 100644 --- a/frontend/drivers/platform_emscripten.c +++ b/frontend/drivers/platform_emscripten.c @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -60,7 +61,6 @@ #ifdef PROXY_TO_PTHREAD #include -#include #include #include #define PLATFORM_SETVAL(type, addr, val) emscripten_atomic_store_##type(addr, val) @@ -73,10 +73,17 @@ #include "platform_emscripten.h" void emscripten_mainloop(void); + +/* javascript library functions */ void PlatformEmscriptenWatchCanvasSizeAndDpr(double *dpr); void PlatformEmscriptenWatchWindowVisibility(void); void PlatformEmscriptenPowerStateInit(void); void PlatformEmscriptenMemoryUsageInit(void); +void PlatformEmscriptenWatchFullscreen(void); +void PlatformEmscriptenGLContextEventInit(void); +void PlatformEmscriptenSetCanvasSize(int width, int height); +void PlatformEmscriptenSetWakeLock(bool state); +uint32_t PlatformEmscriptenGetSystemInfo(void); typedef struct { @@ -88,12 +95,18 @@ typedef struct uint64_t memory_used; uint64_t memory_limit; double device_pixel_ratio; + enum platform_emscripten_browser browser; + enum platform_emscripten_os os; int raf_interval; int canvas_width; int canvas_height; int power_state_discharge_time; float power_state_level; bool has_async_atomics; + bool enable_set_canvas_size; + bool disable_detect_enter_fullscreen; + bool fullscreen; + bool gl_context_lost; volatile bool power_state_charging; volatile bool power_state_supported; volatile bool window_hidden; @@ -102,6 +115,22 @@ typedef struct static emscripten_platform_data_t *emscripten_platform_data = NULL; +/* defined here since implementation is frontend dependent */ +void retro_sleep(unsigned msec) +{ +#if defined(EMSCRIPTEN_ASYNCIFY) && !defined(HAVE_THREADS) + emscripten_sleep(msec); +#elif defined(EMSCRIPTEN_ASYNCIFY) + if (emscripten_is_main_browser_thread()) + emscripten_sleep(msec); + else + emscripten_thread_sleep(msec); +#else + /* also works on main thread, but uses busy wait */ + emscripten_thread_sleep(msec); +#endif +} + /* begin exported functions */ /* saves and states */ @@ -133,6 +162,11 @@ void cmd_undo_load_state(void) /* misc */ +void cmd_toggle_fullscreen(void) +{ + command_event(CMD_EVENT_FULLSCREEN_TOGGLE, NULL); +} + void cmd_take_screenshot(void) { command_event(CMD_EVENT_TAKE_SCREENSHOT, NULL); @@ -232,7 +266,7 @@ void cmd_cheat_apply_cheats(void) /* javascript callbacks */ -void platform_emscripten_update_canvas_dimensions(int width, int height, double *dpr) +void platform_emscripten_update_canvas_dimensions_cb(int width, int height, double *dpr) { printf("[INFO] Setting real canvas size: %d x %d\n", width, height); emscripten_set_canvas_element_size("#canvas", width, height); @@ -243,14 +277,14 @@ void platform_emscripten_update_canvas_dimensions(int width, int height, double PLATFORM_SETVAL(f64, &emscripten_platform_data->device_pixel_ratio, *dpr); } -void platform_emscripten_update_window_hidden(bool hidden) +void platform_emscripten_update_window_hidden_cb(bool hidden) { if (!emscripten_platform_data) return; emscripten_platform_data->window_hidden = hidden; } -void platform_emscripten_update_power_state(bool supported, int discharge_time, float level, bool charging) +void platform_emscripten_update_power_state_cb(bool supported, int discharge_time, float level, bool charging) { if (!emscripten_platform_data) return; @@ -260,12 +294,40 @@ void platform_emscripten_update_power_state(bool supported, int discharge_time, PLATFORM_SETVAL(f32, &emscripten_platform_data->power_state_level, level); } -void platform_emscripten_update_memory_usage(uint32_t used1, uint32_t used2, uint32_t limit1, uint32_t limit2) +void platform_emscripten_update_memory_usage_cb(uint64_t used, uint64_t limit) { if (!emscripten_platform_data) return; - PLATFORM_SETVAL(u64, &emscripten_platform_data->memory_used, used1 | ((uint64_t)used2 << 32)); - PLATFORM_SETVAL(u64, &emscripten_platform_data->memory_limit, limit1 | ((uint64_t)limit2 << 32)); + PLATFORM_SETVAL(u64, &emscripten_platform_data->memory_used, used); + PLATFORM_SETVAL(u64, &emscripten_platform_data->memory_limit, limit); +} + +static void fullscreen_update(void *data) +{ + command_event(CMD_EVENT_FULLSCREEN_TOGGLE, NULL); +} + +void platform_emscripten_update_fullscreen_state_cb(bool state) +{ + if (state == emscripten_platform_data->fullscreen || (state && emscripten_platform_data->disable_detect_enter_fullscreen)) + return; + + emscripten_platform_data->fullscreen = state; + platform_emscripten_run_on_program_thread_async(fullscreen_update, NULL); +} + +void platform_emscripten_gl_context_lost_cb(void) +{ + printf("[WARN] WebGL context lost!\n"); + emscripten_platform_data->gl_context_lost = true; +} + +void platform_emscripten_gl_context_restored_cb(void) +{ + printf("[INFO] WebGL context restored.\n"); + emscripten_platform_data->gl_context_lost = false; + /* there might be a better way to do this, but for now this works */ + command_event(CMD_EVENT_REINIT, NULL); } void platform_emscripten_command_raise_flag() @@ -315,7 +377,7 @@ void platform_emscripten_command_reply(const char *msg, size_t len) size_t platform_emscripten_command_read(char **into, size_t max_len) { - if (!emscripten_platform_data || !emscripten_platform_data->command_flag) + if (!emscripten_platform_data->command_flag) return 0; return MAIN_THREAD_EM_ASM_INT({ var next_command = RPE.command_queue.shift(); @@ -334,16 +396,12 @@ size_t platform_emscripten_command_read(char **into, size_t max_len) void platform_emscripten_get_canvas_size(int *width, int *height) { - if (!emscripten_platform_data) - goto error; - *width = PLATFORM_GETVAL(u32, &emscripten_platform_data->canvas_width); *height = PLATFORM_GETVAL(u32, &emscripten_platform_data->canvas_height); if (*width != 0 || *height != 0) return; -error: *width = 800; *height = 600; RARCH_ERR("[EMSCRIPTEN]: Could not get screen dimensions!\n"); @@ -354,6 +412,15 @@ double platform_emscripten_get_dpr(void) return PLATFORM_GETVAL(f64, &emscripten_platform_data->device_pixel_ratio); } +unsigned platform_emscripten_get_min_sleep_ms(void) +{ + if (emscripten_platform_data->browser == PLATFORM_EMSCRIPTEN_BROWSER_FIREFOX && + emscripten_platform_data->os == PLATFORM_EMSCRIPTEN_OS_WINDOWS) + return 16; + + return 5; +} + bool platform_emscripten_has_async_atomics(void) { return emscripten_platform_data->has_async_atomics; @@ -366,7 +433,7 @@ bool platform_emscripten_is_window_hidden(void) bool platform_emscripten_should_drop_iter(void) { - return (emscripten_platform_data->window_hidden && emscripten_platform_data->raf_interval); + return (emscripten_platform_data->gl_context_lost || (emscripten_platform_data->window_hidden && emscripten_platform_data->raf_interval)); } #ifdef PROXY_TO_PTHREAD @@ -413,6 +480,58 @@ void platform_emscripten_set_main_loop_interval(int interval) #endif } +void platform_emscripten_set_pointer_visibility(bool state) +{ + MAIN_THREAD_EM_ASM({ + if ($0) { + Module.canvas.style.removeProperty("cursor"); + } else { + Module.canvas.style.setProperty("cursor", "none"); + } + }, state); +} + +static void platform_emscripten_do_set_fullscreen_state(void *data) +{ + bool ran_user_cb = EM_ASM_INT({ + var func = $0 ? "fullscreenEnter" : "fullscreenExit"; + if (Module[func]) { + Module[func](); + return 1; + } + return 0; + }, emscripten_platform_data->fullscreen); + if (ran_user_cb) + return; + + if (emscripten_platform_data->fullscreen) + emscripten_request_fullscreen("#canvas", false); + else + emscripten_exit_fullscreen(); +} + +void platform_emscripten_set_fullscreen_state(bool state) +{ + if (state == emscripten_platform_data->fullscreen) + return; + + emscripten_platform_data->fullscreen = state; + platform_emscripten_run_on_browser_thread_sync(platform_emscripten_do_set_fullscreen_state, NULL); +} + +void platform_emscripten_set_wake_lock(bool state) +{ + PlatformEmscriptenSetWakeLock(state); +} + +void platform_emscripten_set_canvas_size(int width, int height) +{ + if (!emscripten_platform_data->enable_set_canvas_size) + return; + + PlatformEmscriptenSetCanvasSize(width, height); +} + /* frontend driver impl */ static void frontend_emscripten_get_env(int *argc, char *argv[], @@ -575,7 +694,7 @@ static void platform_emscripten_mount_filesystems(void) path_parent_dir(parent, strlen(parent)); if (!path_mkdir(parent)) { - printf("mkdir error %d\n", errno); + printf("[OPFS] mkdir error %d\n", errno); abort(); } free(parent); @@ -704,6 +823,7 @@ static int thread_main(int argc, char *argv[]) platform_emscripten_mount_filesystems(); #endif + PlatformEmscriptenGLContextEventInit(); emscripten_set_main_loop(emscripten_mainloop, 0, 0); #ifdef PROXY_TO_PTHREAD emscripten_set_main_loop_timing(EM_TIMING_SETIMMEDIATE, 0); @@ -737,6 +857,7 @@ static void raf_signaler(void) int main(int argc, char *argv[]) { int ret = 0; + uint32_t system_info; #ifdef PROXY_TO_PTHREAD pthread_attr_t attr; pthread_t thread; @@ -744,14 +865,58 @@ int main(int argc, char *argv[]) /* this never gets freed */ emscripten_platform_data = (emscripten_platform_data_t *)calloc(1, sizeof(emscripten_platform_data_t)); + system_info = PlatformEmscriptenGetSystemInfo(); + emscripten_platform_data->browser = system_info & 0xFFFF; + emscripten_platform_data->os = system_info >> 16; + + emscripten_platform_data->enable_set_canvas_size = !!getenv("ENABLE_SET_CANVAS_SIZE"); + emscripten_platform_data->disable_detect_enter_fullscreen = !!getenv("DISABLE_DETECT_ENTER_FULLSCREEN"); emscripten_platform_data->has_async_atomics = EM_ASM_INT({ return Atomics?.waitAsync?.toString().includes("[native code]"); }); + EM_ASM({ + /* keyboard events won't work without the canvas being focused */ + if (!Module.canvas.getAttribute("tabindex")) + Module.canvas.setAttribute("tabindex", "-1"); + Module.canvas.focus(); + Module.canvas.addEventListener("pointerdown", function() { + Module.canvas.focus(); + }, false); + + /* disable browser right click menu */ + Module.canvas.addEventListener("contextmenu", function(e) { + e.preventDefault(); + }, false); + + /* background should be black */ + Module.canvas.style.backgroundColor = "#000000"; + + /* border and padding may interfere with pointer event coordinates */ + Module.canvas.style.setProperty("padding", "0px", "important"); + Module.canvas.style.setProperty("border", "none", "important"); + + /* ensure canvas size is constrained by CSS, otherwise infinite resizing may occur */ + if (window.getComputedStyle(Module.canvas).display == "inline") { + console.warn("[WARN] Canvas should not use display: inline!"); + Module.canvas.style.display = "inline-block"; + } + var oldWidth = Module.canvas.clientWidth; + var oldHeight = Module.canvas.clientHeight; + Module.canvas.width = 64; + Module.canvas.height = 64; + if (oldWidth != Module.canvas.clientWidth || oldHeight != Module.canvas.clientHeight) { + console.warn("[WARN] Canvas size should be set using CSS properties!"); + Module.canvas.style.width = oldWidth + "px"; + Module.canvas.style.height = oldHeight + "px"; + } + }); + PlatformEmscriptenWatchCanvasSizeAndDpr(malloc(sizeof(double))); PlatformEmscriptenWatchWindowVisibility(); PlatformEmscriptenPowerStateInit(); PlatformEmscriptenMemoryUsageInit(); + PlatformEmscriptenWatchFullscreen(); emscripten_platform_data->raf_interval = 1; #ifdef PROXY_TO_PTHREAD diff --git a/frontend/drivers/platform_emscripten.h b/frontend/drivers/platform_emscripten.h index add2ad03c6..58dfa27946 100644 --- a/frontend/drivers/platform_emscripten.h +++ b/frontend/drivers/platform_emscripten.h @@ -20,6 +20,23 @@ #include +enum platform_emscripten_browser +{ + PLATFORM_EMSCRIPTEN_BROWSER_OTHER = 0, + PLATFORM_EMSCRIPTEN_BROWSER_CHROMIUM, + PLATFORM_EMSCRIPTEN_BROWSER_FIREFOX, + PLATFORM_EMSCRIPTEN_BROWSER_SAFARI +}; + +enum platform_emscripten_os +{ + PLATFORM_EMSCRIPTEN_OS_OTHER = 0, + PLATFORM_EMSCRIPTEN_OS_WINDOWS, + PLATFORM_EMSCRIPTEN_OS_LINUX, + PLATFORM_EMSCRIPTEN_OS_IOS, + PLATFORM_EMSCRIPTEN_OS_MACOS +}; + /** * Synchronously run a function on the browser thread. * @@ -77,6 +94,15 @@ void platform_emscripten_get_canvas_size(int *width, int *height); */ double platform_emscripten_get_dpr(void); +/** + * Get the minimum amount of time that setTimeout (retro_sleep on browser thread) can + * sleep for in a loop. + * This may vary between browsers: usually 5 ms, but much higher for firefox on windows. + * + * @return Minimum sleep in milliseconds. + */ +unsigned platform_emscripten_get_min_sleep_ms(void); + /** * Check if the browser supports Atomics.waitAsync. * @@ -128,4 +154,34 @@ void platform_emscripten_exit_fake_block(void); */ void platform_emscripten_set_main_loop_interval(int interval); +/** + * Hide or show the cursor. + * + * @param state True to show, false to hide. + */ +void platform_emscripten_set_pointer_visibility(bool state); + +/** + * Try to enter or exit fullscreen. + * + * @param state True to enter, false to exit. + */ +void platform_emscripten_set_fullscreen_state(bool state); + +/** + * Try to prevent the screen from dimming. + * + * @param state True to request, false to release. + */ +void platform_emscripten_set_wake_lock(bool state); + +/** + * Try to set the real screen dimensions of the canvas. + * Will only work if explicitly enabled by the embedder. + * + * @param width New width + * @param height New height + */ +void platform_emscripten_set_canvas_size(int width, int height); + #endif diff --git a/gfx/drivers_context/emscriptenegl_ctx.c b/gfx/drivers_context/emscriptenegl_ctx.c index 2cfbfd066c..c12866202a 100644 --- a/gfx/drivers_context/emscriptenegl_ctx.c +++ b/gfx/drivers_context/emscriptenegl_ctx.c @@ -63,16 +63,6 @@ static void gfx_ctx_emscripten_check_window(void *data, bool *quit, *quit = false; } -static void gfx_ctx_emscripten_swap_buffers(void *data) -{ -#ifdef HAVE_EGL - /* Doesn't really do anything in WebGL, but it might - * if we use WebGL workers in the future */ - emscripten_ctx_data_t *emscripten = (emscripten_ctx_data_t*)data; - egl_swap_buffers(&emscripten->egl); -#endif -} - static void gfx_ctx_emscripten_get_video_size(void *data, unsigned *width, unsigned *height) { @@ -181,11 +171,11 @@ error: } static bool gfx_ctx_emscripten_set_video_mode(void *data, - unsigned width, unsigned height, - bool fullscreen) + unsigned width, unsigned height, bool fullscreen) { - if (g_egl_inited) - return false; + platform_emscripten_set_fullscreen_state(fullscreen); + if (!fullscreen) + platform_emscripten_set_canvas_size(width, height); g_egl_inited = true; return true; @@ -212,9 +202,20 @@ static void gfx_ctx_emscripten_input_driver(void *data, *input_data = rwebinput; } -static bool gfx_ctx_emscripten_has_focus(void *data) { return g_egl_inited; } +static bool gfx_ctx_emscripten_has_focus(void *data) { + return g_egl_inited && !platform_emscripten_is_window_hidden(); +} -static bool gfx_ctx_emscripten_suppress_screensaver(void *data, bool enable) { return false; } +static bool gfx_ctx_emscripten_suppress_screensaver(void *data, bool enable) +{ + platform_emscripten_set_wake_lock(enable); + return true; +} + +static void gfx_ctx_emscripten_show_mouse(void *data, bool state) +{ + platform_emscripten_set_pointer_visibility(state); +} static float gfx_ctx_emscripten_translate_aspect(void *data, unsigned width, unsigned height) { return (float)width / height; } @@ -259,11 +260,11 @@ const gfx_ctx_driver_t gfx_ctx_emscripten = { gfx_ctx_emscripten_translate_aspect, NULL, /* update_title */ gfx_ctx_emscripten_check_window, - NULL, /* set_resize */ + NULL, /* set_resize: no-op */ gfx_ctx_emscripten_has_focus, gfx_ctx_emscripten_suppress_screensaver, - false, - gfx_ctx_emscripten_swap_buffers, + true, /* has_windowed */ + NULL, /* swap_buffers: no-op */ gfx_ctx_emscripten_input_driver, #ifdef HAVE_EGL egl_get_proc_address, @@ -272,11 +273,11 @@ const gfx_ctx_driver_t gfx_ctx_emscripten = { #endif gfx_ctx_emscripten_init_egl_image_buffer, gfx_ctx_emscripten_write_egl_image, - NULL, + gfx_ctx_emscripten_show_mouse, "egl_emscripten", gfx_ctx_emscripten_get_flags, gfx_ctx_emscripten_set_flags, gfx_ctx_emscripten_bind_hw_render, - NULL, - NULL + NULL, /* get_context_data */ + NULL /* make_current */ }; diff --git a/gfx/drivers_context/emscriptenwebgl_ctx.c b/gfx/drivers_context/emscriptenwebgl_ctx.c index a2e659ba27..9554f986f7 100644 --- a/gfx/drivers_context/emscriptenwebgl_ctx.c +++ b/gfx/drivers_context/emscriptenwebgl_ctx.c @@ -57,12 +57,6 @@ static void gfx_ctx_emscripten_webgl_check_window(void *data, bool *quit, *quit = false; } -/* https://github.com/emscripten-core/emscripten/issues/17816#issuecomment-1249719343 */ -static void gfx_ctx_emscripten_webgl_swap_buffers(void *data) -{ - (void)data; -} - static void gfx_ctx_emscripten_webgl_get_video_size(void *data, unsigned *width, unsigned *height) { @@ -114,7 +108,7 @@ static void *gfx_ctx_emscripten_webgl_init(void *video_driver) EmscriptenWebGLContextAttributes attrs = {0}; emscripten_webgl_init_context_attributes(&attrs); - attrs.alpha = false; + attrs.alpha = true; attrs.depth = true; attrs.stencil = true; attrs.antialias = false; @@ -152,57 +146,24 @@ error: return NULL; } -static bool gfx_ctx_emscripten_webgl_set_canvas_size(int width, int height) -{ -#ifdef NO_CANVAS_RESIZE - return false; -#endif - double dpr = platform_emscripten_get_dpr(); - EMSCRIPTEN_RESULT r = emscripten_set_element_css_size("#canvas", (double)width / dpr, (double)height / dpr); - RARCH_LOG("[EMSCRIPTEN/WebGL]: set canvas size to %d, %d\n", width, height); - - if (r != EMSCRIPTEN_RESULT_SUCCESS) - { - RARCH_ERR("[EMSCRIPTEN/WebGL]: error resizing canvas: %d\n", r); - return false; - } - return true; -} - static bool gfx_ctx_emscripten_webgl_set_video_mode(void *data, - unsigned width, unsigned height, - bool fullscreen) + unsigned width, unsigned height, bool fullscreen) { emscripten_ctx_data_t *emscripten = (emscripten_ctx_data_t*)data; if (!emscripten || !emscripten->ctx) return false; - if (width != 0 && height != 0) - { - if (!gfx_ctx_emscripten_webgl_set_canvas_size(width, height)) - return false; - } - emscripten->fb_width = width; - emscripten->fb_height = height; + platform_emscripten_set_fullscreen_state(fullscreen); + if (!fullscreen) + platform_emscripten_set_canvas_size(width, height); return true; } -bool gfx_ctx_emscripten_webgl_set_resize(void *data, unsigned width, unsigned height) -{ - emscripten_ctx_data_t *emscripten = (emscripten_ctx_data_t*)data; - if (!emscripten || !emscripten->ctx) - return false; - return gfx_ctx_emscripten_webgl_set_canvas_size(width, height); -} - static enum gfx_ctx_api gfx_ctx_emscripten_webgl_get_api(void *data) { return GFX_CTX_OPENGL_ES_API; } static bool gfx_ctx_emscripten_webgl_bind_api(void *data, - enum gfx_ctx_api api, unsigned major, unsigned minor) -{ - return true; -} + enum gfx_ctx_api api, unsigned major, unsigned minor) { return true; } static void gfx_ctx_emscripten_webgl_input_driver(void *data, const char *name, @@ -216,10 +177,19 @@ static void gfx_ctx_emscripten_webgl_input_driver(void *data, static bool gfx_ctx_emscripten_webgl_has_focus(void *data) { emscripten_ctx_data_t *emscripten = (emscripten_ctx_data_t*)data; - return emscripten && emscripten->ctx; + return emscripten && emscripten->ctx && !platform_emscripten_is_window_hidden(); } -static bool gfx_ctx_emscripten_webgl_suppress_screensaver(void *data, bool enable) { return false; } +static bool gfx_ctx_emscripten_webgl_suppress_screensaver(void *data, bool enable) +{ + platform_emscripten_set_wake_lock(enable); + return true; +} + +static void gfx_ctx_emscripten_webgl_show_mouse(void *data, bool state) +{ + platform_emscripten_set_pointer_visibility(state); +} static float gfx_ctx_emscripten_webgl_translate_aspect(void *data, unsigned width, unsigned height) { return (float)width / height; } @@ -260,16 +230,16 @@ const gfx_ctx_driver_t gfx_ctx_emscripten_webgl = { gfx_ctx_emscripten_webgl_translate_aspect, NULL, /* update_title */ gfx_ctx_emscripten_webgl_check_window, - gfx_ctx_emscripten_webgl_set_resize, + NULL, /* set_resize: no-op */ gfx_ctx_emscripten_webgl_has_focus, gfx_ctx_emscripten_webgl_suppress_screensaver, - false, - gfx_ctx_emscripten_webgl_swap_buffers, + true, /* has_windowed */ + NULL, /* swap_buffers: no-op: https://github.com/emscripten-core/emscripten/issues/17816#issuecomment-1249719343 */ gfx_ctx_emscripten_webgl_input_driver, gfx_ctx_emscripten_webgl_get_proc_address, NULL, NULL, - NULL, + gfx_ctx_emscripten_webgl_show_mouse, "webgl_emscripten", gfx_ctx_emscripten_webgl_get_flags, gfx_ctx_emscripten_webgl_set_flags, diff --git a/input/drivers/rwebinput_input.c b/input/drivers/rwebinput_input.c index 55982a056f..ce6fdd17a7 100644 --- a/input/drivers/rwebinput_input.c +++ b/input/drivers/rwebinput_input.c @@ -87,11 +87,21 @@ typedef struct rwebinput_mouse_states uint8_t buttons; } rwebinput_mouse_state_t; +typedef struct rwebinput_motion_states +{ + float x; + float y; + float z; + bool enabled; +} rwebinput_motion_state_t; + typedef struct rwebinput_input { rwebinput_mouse_state_t mouse; /* double alignment */ rwebinput_keyboard_event_queue_t keyboard; /* ptr alignment */ rwebinput_pointer_state_t pointer[MAX_TOUCH]; /* int alignment */ + rwebinput_motion_state_t accelerometer; /* float alignment */ + rwebinput_motion_state_t gyroscope; /* float alignment */ unsigned pointer_count; bool keys[RETROK_LAST]; bool pointerlock_active; @@ -406,6 +416,26 @@ static EM_BOOL rwebinput_pointerlockchange_cb(int event_type, return EM_TRUE; } +static EM_BOOL rwebinput_devicemotion_cb(int event_type, + const EmscriptenDeviceMotionEvent *device_motion_event, void *user_data) +{ + rwebinput_input_t *rwebinput = (rwebinput_input_t*)user_data; + + /* TODO: what units does mGBA want? does something need to be changed on the core side? */ + /* given in m/s^2 (inverted) */ + rwebinput->accelerometer.x = device_motion_event->accelerationIncludingGravityX / -9.8; + rwebinput->accelerometer.y = device_motion_event->accelerationIncludingGravityY / -9.8; + rwebinput->accelerometer.z = device_motion_event->accelerationIncludingGravityZ / -9.8; + /* XYZ == BetaGammaAlpha according to W3C? in my testing it is AlphaBetaGamma... */ + /* libretro wants radians/s but it is too fast in mGBA, see above comment */ + /* given in degrees/s */ + rwebinput->gyroscope.x = device_motion_event->rotationRateAlpha / 180; + rwebinput->gyroscope.y = device_motion_event->rotationRateBeta / 180; + rwebinput->gyroscope.z = device_motion_event->rotationRateGamma / 180; + + return EM_TRUE; +} + static void *rwebinput_input_init(const char *joypad_driver) { EMSCRIPTEN_RESULT r; @@ -746,6 +776,84 @@ static void rwebinput_input_free(void *data) free(data); } +static bool rwebinput_set_sensor_state(void *data, unsigned port, + enum retro_sensor_action action, unsigned rate) +{ + rwebinput_input_t *rwebinput = (rwebinput_input_t*)data; + EMSCRIPTEN_RESULT r; + bool old_state = rwebinput->accelerometer.enabled || rwebinput->gyroscope.enabled; + bool new_state; + + switch (action) + { + case RETRO_SENSOR_ACCELEROMETER_ENABLE: + rwebinput->accelerometer.enabled = true; + break; + case RETRO_SENSOR_ACCELEROMETER_DISABLE: + rwebinput->accelerometer.enabled = false; + break; + case RETRO_SENSOR_GYROSCOPE_ENABLE: + rwebinput->gyroscope.enabled = true; + break; + case RETRO_SENSOR_GYROSCOPE_DISABLE: + rwebinput->gyroscope.enabled = false; + break; + case RETRO_SENSOR_ILLUMINANCE_ENABLE: + case RETRO_SENSOR_ILLUMINANCE_DISABLE: + return false; /* not supported (browsers removed support for now) */ + default: + return false; + } + + new_state = rwebinput->accelerometer.enabled || rwebinput->gyroscope.enabled; + + if (!old_state && new_state) + { + r = emscripten_set_devicemotion_callback(rwebinput, false, rwebinput_devicemotion_cb); + if (r != EMSCRIPTEN_RESULT_SUCCESS) + { + RARCH_ERR( + "[EMSCRIPTEN/INPUT] failed to create devicemotion callback: %d\n", r); + return false; + } + } + else if (old_state && !new_state) + { + r = emscripten_set_devicemotion_callback(rwebinput, false, NULL); + if (r != EMSCRIPTEN_RESULT_SUCCESS) + { + RARCH_ERR( + "[EMSCRIPTEN/INPUT] failed to remove devicemotion callback: %d\n", r); + return false; + } + } + + return true; +} + +static float rwebinput_get_sensor_input(void *data, unsigned port, unsigned id) +{ + rwebinput_input_t *rwebinput = (rwebinput_input_t*)data; + + switch (id) + { + case RETRO_SENSOR_ACCELEROMETER_X: + return rwebinput->accelerometer.x; + case RETRO_SENSOR_ACCELEROMETER_Y: + return rwebinput->accelerometer.y; + case RETRO_SENSOR_ACCELEROMETER_Z: + return rwebinput->accelerometer.z; + case RETRO_SENSOR_GYROSCOPE_X: + return rwebinput->gyroscope.x; + case RETRO_SENSOR_GYROSCOPE_Y: + return rwebinput->gyroscope.y; + case RETRO_SENSOR_GYROSCOPE_Z: + return rwebinput->gyroscope.z; + } + + return 0.0f; +} + static void rwebinput_process_keyboard_events( rwebinput_input_t *rwebinput, rwebinput_keyboard_event_t *event) @@ -840,8 +948,8 @@ input_driver_t input_rwebinput = { rwebinput_input_poll, rwebinput_input_state, rwebinput_input_free, - NULL, - NULL, + rwebinput_set_sensor_state, + rwebinput_get_sensor_input, rwebinput_get_capabilities, "rwebinput", rwebinput_grab_mouse, diff --git a/input/drivers_joypad/rwebpad_joypad.c b/input/drivers_joypad/rwebpad_joypad.c index 09e75258cc..58bfbea023 100644 --- a/input/drivers_joypad/rwebpad_joypad.c +++ b/input/drivers_joypad/rwebpad_joypad.c @@ -30,9 +30,18 @@ #define NUM_BUTTONS 64 #define NUM_AXES 64 +struct rwebpad_joypad_rumble_state +{ + uint16_t pending_strong; + uint16_t pending_weak; + uint16_t strong; + uint16_t weak; +}; + typedef struct { struct EmscriptenGamepadEvent pads[DEFAULT_MAX_PADS]; + struct rwebpad_joypad_rumble_state rumble[DEFAULT_MAX_PADS]; bool live_pads[DEFAULT_MAX_PADS]; } rwebpad_joypad_data_t; @@ -45,6 +54,9 @@ static EM_BOOL rwebpad_gamepad_cb(int event_type, unsigned vid = 1; unsigned pid = 1; + if (gamepad_event->index >= DEFAULT_MAX_PADS) + return EM_FALSE; + switch (event_type) { case EMSCRIPTEN_EVENT_GAMEPADCONNECTED: @@ -93,12 +105,11 @@ static void *rwebpad_joypad_init(void *data) return (void*)(-1); } -static const char *rwebpad_joypad_name(unsigned pad) +static const char *rwebpad_joypad_name(unsigned port) { - if (pad >= DEFAULT_MAX_PADS || !rwebpad_joypad_data->live_pads[pad]) { + if (port >= DEFAULT_MAX_PADS || !rwebpad_joypad_data->live_pads[port]) return ""; - } - return rwebpad_joypad_data->pads[pad].id; + return rwebpad_joypad_data->pads[port].id; } static int32_t rwebpad_joypad_button(unsigned port, uint16_t joykey) @@ -116,7 +127,8 @@ static void rwebpad_joypad_get_buttons(unsigned port, input_bits_t *state) { EmscriptenGamepadEvent gamepad_state; unsigned i; - if (port >= DEFAULT_MAX_PADS || !rwebpad_joypad_data->live_pads[port]) { + if (port >= DEFAULT_MAX_PADS || !rwebpad_joypad_data->live_pads[port]) + { BIT256_CLEAR_ALL_PTR(state); return; } @@ -151,9 +163,8 @@ static int16_t rwebpad_joypad_axis_state( static int16_t rwebpad_joypad_axis(unsigned port, uint32_t joyaxis) { - if (port >= DEFAULT_MAX_PADS || !rwebpad_joypad_data->live_pads[port]) { + if (port >= DEFAULT_MAX_PADS || !rwebpad_joypad_data->live_pads[port]) return 0; - } return rwebpad_joypad_axis_state(&rwebpad_joypad_data->pads[port], port, joyaxis); } @@ -192,14 +203,41 @@ static int16_t rwebpad_joypad_state( return ret; } +static void rwebpad_joypad_update_rumble(unsigned port) +{ + bool rumble_old_state = rwebpad_joypad_data->rumble[port].strong || rwebpad_joypad_data->rumble[port].weak; + bool rumble_new_state = rwebpad_joypad_data->rumble[port].pending_strong || rwebpad_joypad_data->rumble[port].pending_weak; + rwebpad_joypad_data->rumble[port].strong = rwebpad_joypad_data->rumble[port].pending_strong; + rwebpad_joypad_data->rumble[port].weak = rwebpad_joypad_data->rumble[port].pending_weak; + + if (rumble_new_state) + { + EM_ASM({ + try { + JSEvents?.lastGamepadState?.[$0]?.vibrationActuator?.playEffect?.("dual-rumble", {startDelay: 0, duration: 200, strongMagnitude: $1 / 65536, weakMagnitude: $2 / 65536}); + } catch (e) {} + }, port, rwebpad_joypad_data->rumble[port].strong, rwebpad_joypad_data->rumble[port].weak); + } + else if (rumble_old_state && !rumble_new_state) + { + EM_ASM({ + try { + JSEvents?.lastGamepadState?.[$0]?.vibrationActuator?.reset?.(); + } catch (e) {} + }, port); + } +} + static void rwebpad_joypad_do_poll(void *data) { - int i; + unsigned port; emscripten_sample_gamepad_data(); - for (i = 0; i < DEFAULT_MAX_PADS; i++) + for (port = 0; port < DEFAULT_MAX_PADS; port++) { - if (rwebpad_joypad_data->live_pads[i]) - emscripten_get_gamepad_status(i, &rwebpad_joypad_data->pads[i]); + if (!rwebpad_joypad_data->live_pads[port]) + continue; + emscripten_get_gamepad_status(port, &rwebpad_joypad_data->pads[port]); + rwebpad_joypad_update_rumble(port); } } @@ -208,9 +246,29 @@ static void rwebpad_joypad_poll(void) platform_emscripten_run_on_browser_thread_sync(rwebpad_joypad_do_poll, NULL); } -static bool rwebpad_joypad_query_pad(unsigned pad) +static bool rwebpad_joypad_query_pad(unsigned port) { - return rwebpad_joypad_data->live_pads[pad]; + return rwebpad_joypad_data->live_pads[port]; +} + +static bool rwebpad_joypad_set_rumble(unsigned port, enum retro_rumble_effect effect, uint16_t strength) +{ + if (port >= DEFAULT_MAX_PADS || !rwebpad_joypad_data->live_pads[port]) + return false; + + switch (effect) + { + case RETRO_RUMBLE_STRONG: + rwebpad_joypad_data->rumble[port].pending_strong = strength; + break; + case RETRO_RUMBLE_WEAK: + rwebpad_joypad_data->rumble[port].pending_weak = strength; + break; + default: + return false; + } + + return true; } static void rwebpad_joypad_destroy(void) { } @@ -224,7 +282,7 @@ input_device_driver_t rwebpad_joypad = { rwebpad_joypad_get_buttons, rwebpad_joypad_axis, rwebpad_joypad_poll, - NULL, /* set_rumble */ + rwebpad_joypad_set_rumble, NULL, /* set_rumble_gain */ NULL, /* set_sensor_state */ NULL, /* get_sensor_input */ diff --git a/input/input_driver.h b/input/input_driver.h index 8835a96505..14f6f57a0d 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -96,6 +96,8 @@ #define DEFAULT_MAX_PADS 4 #elif defined(DINGUX) #define DEFAULT_MAX_PADS 2 +#elif defined(EMSCRIPTEN) +#define DEFAULT_MAX_PADS 4 #else #define DEFAULT_MAX_PADS 16 #endif /* defined(ANDROID) */ diff --git a/libretro-common/include/retro_timers.h b/libretro-common/include/retro_timers.h index 4882b483ea..2ff7d76f3d 100644 --- a/libretro-common/include/retro_timers.h +++ b/libretro-common/include/retro_timers.h @@ -39,9 +39,6 @@ #include #elif defined(_3DS) #include <3ds.h> -#elif defined(EMSCRIPTEN) -#include -#include #else #include #endif @@ -101,18 +98,15 @@ static int nanosleepDOS(const struct timespec *rqtp, struct timespec *rmtp) #define retro_sleep(msec) (usleep(1000 * (msec))) #elif defined(WIIU) #define retro_sleep(msec) (OSSleepTicks(ms_to_ticks((msec)))) -#elif defined(EMSCRIPTEN) && defined(EMSCRIPTEN_ASYNCIFY) && !defined(HAVE_THREADS) -#define retro_sleep(msec) (emscripten_sleep(msec)) -#elif defined(EMSCRIPTEN) && defined(EMSCRIPTEN_ASYNCIFY) -static INLINE void retro_sleep(unsigned msec) -{ - if (emscripten_is_main_browser_thread()) - emscripten_sleep(msec); - else - emscripten_thread_sleep(msec); +#elif defined(__EMSCRIPTEN__) +/* defined in frontend */ +#ifdef __cplusplus +extern "C" { +#endif +void retro_sleep(unsigned msec); +#ifdef __cplusplus } -#elif defined(EMSCRIPTEN) -#define retro_sleep(msec) (emscripten_thread_sleep(msec)) +#endif #else static INLINE void retro_sleep(unsigned msec) { diff --git a/pkg/emscripten/libretro-thread/index.html b/pkg/emscripten/libretro-thread/index.html index 211adf914a..07856601df 100644 --- a/pkg/emscripten/libretro-thread/index.html +++ b/pkg/emscripten/libretro-thread/index.html @@ -194,7 +194,7 @@
- +
diff --git a/pkg/emscripten/libretro-thread/libretro.css b/pkg/emscripten/libretro-thread/libretro.css index cf08d09936..385f4277d0 100644 --- a/pkg/emscripten/libretro-thread/libretro.css +++ b/pkg/emscripten/libretro-thread/libretro.css @@ -339,6 +339,9 @@ label { left: 50%; top: 50%; transform: translate(-50%, -50%); + left: round(50%, 1px); + top: round(50%, 1px); + transform: translate(round(-50%, 1px), round(-50%, 1px)); max-height: calc(100vh - 40px); max-width: calc(100vw - 40px); width: 750px; @@ -388,6 +391,19 @@ label { margin-top: 0px; } +/* debug */ + +.retroarchWebcamVideo, .retroarchWebcamCanvas { + position: absolute; + left: 0px; + top: 0px; + z-index: 5000; +} + +.retroarchWebcamCanvas { + top: 112px; +} + /* mobile */ @media only screen and (max-width: 720px) { diff --git a/pkg/emscripten/libretro-thread/libretro.js b/pkg/emscripten/libretro-thread/libretro.js index 324c4cc44a..7ca538b7ec 100644 --- a/pkg/emscripten/libretro-thread/libretro.js +++ b/pkg/emscripten/libretro-thread/libretro.js @@ -170,6 +170,10 @@ var Module = { module.ENV["OPFS_MOUNT"] = "/home/web_user"; } ], + locateFile: function(path, prefix) { + if (path.endsWith(".js")) return typeof this.mainScriptUrlOrBlob == "string" ? this.mainScriptUrlOrBlob : URL.createObjectURL(this.mainScriptUrlOrBlob); + return path; + }, onRuntimeInitialized: function() { appInitialized(); }, @@ -313,19 +317,15 @@ function startRetroArch() { btnMenu.classList.remove("disabled"); btnMenu.addEventListener("click", function() { - Module._cmd_toggle_menu(); + Module.retroArchSend("MENU_TOGGLE"); }); btnFullscreen.classList.remove("disabled"); btnFullscreen.addEventListener("click", function() { - Module.requestFullscreen(false); + Module.retroArchSend("FULLSCREEN_TOGGLE"); }); - // ensure the canvas is focused so that keyboard events work - Module.canvas.focus(); - Module.canvas.addEventListener("pointerdown", function() { - Module.canvas.focus(); - }, false); + // refocus the canvas so that keyboard events work menuBar.addEventListener("pointerdown", function() { setTimeout(function() { Module.canvas.focus(); diff --git a/pkg/emscripten/libretro/index.html b/pkg/emscripten/libretro/index.html index 31cd1bda9b..07e6803a1d 100644 --- a/pkg/emscripten/libretro/index.html +++ b/pkg/emscripten/libretro/index.html @@ -188,7 +188,7 @@ Show Top Navigation - + RetroArch Logo diff --git a/pkg/emscripten/libretro/libretro.js b/pkg/emscripten/libretro/libretro.js index d4dcb946fb..aa252ab5e0 100644 --- a/pkg/emscripten/libretro/libretro.js +++ b/pkg/emscripten/libretro/libretro.js @@ -187,18 +187,14 @@ function startRetroArch() { selectFiles(e.target.files); }); $('#btnMenu').removeClass("disabled").removeAttr("disabled").click(function() { - Module._cmd_toggle_menu(); + Module.retroArchSend("MENU_TOGGLE"); Module.canvas.focus(); }); $('#btnFullscreen').removeClass("disabled").removeAttr("disabled").click(function() { - Module.requestFullscreen(false); + Module.retroArchSend("FULLSCREEN_TOGGLE"); Module.canvas.focus(); }); - Module.canvas.focus(); - Module.canvas.addEventListener("pointerdown", function() { - Module.canvas.focus(); - }, false); Module.callMain(Module.arguments); } diff --git a/retroarch.c b/retroarch.c index e23408e7d5..65f455c8fd 100644 --- a/retroarch.c +++ b/retroarch.c @@ -6029,7 +6029,11 @@ void emscripten_mainloop(void) bool runloop_is_slowmotion = (runloop_flags & RUNLOOP_FLAG_SLOWMOTION) ? true : false; bool runloop_is_paused = (runloop_flags & RUNLOOP_FLAG_PAUSED) ? true : false; - /* firefox especially seems to bug without this */ + /* Prevents the program from running in any of the following conditions: + * 1. requestAnimationFrame is being used and the window is not visible. + * Firefox likes to call requestAnimationFrame at 1 FPS when the window isn't focused, + * we want to avoid this. + * 2. The GL context is lost and hasn't been recovered yet. */ if (platform_emscripten_should_drop_iter()) return; From c3cb4a8b5d8ca0c53879ba032407f9484c2217bc Mon Sep 17 00:00:00 2001 From: sonninnos Date: Thu, 8 May 2025 22:11:53 +0300 Subject: [PATCH 054/175] D3D11+12: Minor cleanups --- gfx/drivers/d3d11.c | 15 +++++++-------- gfx/drivers/d3d12.c | 26 ++++++++++++-------------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index 5ea83039a0..c2ba0dabdf 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -2736,7 +2736,7 @@ static void d3d11_init_render_targets(d3d11_video_t* d3d11, unsigned width, unsi height = d3d11->vp.height; } - RARCH_LOG("[D3D11]: Updating framebuffer size %ux%u.\n", width, height); + RARCH_DBG("[D3D11]: Updating framebuffer size %ux%u.\n", width, height); if ( (i != (d3d11->shader_preset->passes - 1)) || (width != d3d11->vp.width) @@ -3082,10 +3082,9 @@ static bool d3d11_gfx_frame( } if (d3d11->shader_preset->pass[i].frame_count_mod) - d3d11->pass[i].frame_count = - frame_count % d3d11->shader_preset->pass[i].frame_count_mod; + d3d11->pass[i].frame_count = frame_count % d3d11->shader_preset->pass[i].frame_count_mod; else - d3d11->pass[i].frame_count = frame_count; + d3d11->pass[i].frame_count = frame_count; #ifdef HAVE_REWIND d3d11->pass[i].frame_direction = state_manager_frame_is_reversed() ? -1 : 1; @@ -3097,10 +3096,10 @@ static bool d3d11_gfx_frame( d3d11->pass[i].rotation = retroarch_get_rotation(); d3d11->pass[i].core_aspect = video_driver_get_core_aspect(); /* OriginalAspectRotated: return 1 / aspect for 90 and 270 rotated content */ - d3d11->pass[i].core_aspect_rot = video_driver_get_core_aspect(); - uint32_t rot = retroarch_get_rotation(); - if (rot == 1 || rot == 3) - d3d11->pass[i].core_aspect_rot = 1/d3d11->pass[i].core_aspect_rot; + d3d11->pass[i].core_aspect_rot = d3d11->pass[i].core_aspect; + if ( d3d11->pass[i].rotation == VIDEO_ROTATION_90_DEG + || d3d11->pass[i].rotation == VIDEO_ROTATION_270_DEG) + d3d11->pass[i].core_aspect_rot = 1 / d3d11->pass[i].core_aspect_rot; /* Sub-frame info for multiframe shaders (per real content frame). Should always be 1 for non-use of subframes */ diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index 82c5664b69..bc6fa7d7f9 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -3135,7 +3135,7 @@ static void d3d12_init_render_targets(d3d12_video_t* d3d12, unsigned width, unsi height = d3d12->vp.height; } - RARCH_LOG("[D3D12]: Updating framebuffer size %ux%u.\n", width, height); + RARCH_DBG("[D3D12]: Updating framebuffer size %ux%u.\n", width, height); if (i == (d3d12->shader_preset->passes - 1)) { @@ -3588,25 +3588,23 @@ static bool d3d12_gfx_frame( cmd->lpVtbl->SetPipelineState(cmd, d3d12->pass[i].pipe); if (d3d12->shader_preset->pass[i].frame_count_mod) - d3d12->pass[i].frame_count = frame_count - % d3d12->shader_preset->pass[i].frame_count_mod; + d3d12->pass[i].frame_count = frame_count % d3d12->shader_preset->pass[i].frame_count_mod; else d3d12->pass[i].frame_count = frame_count; #ifdef HAVE_REWIND - if (state_manager_frame_is_reversed()) - d3d12->pass[i].frame_direction = -1; - else + d3d12->pass[i].frame_direction = state_manager_frame_is_reversed() ? -1 : 1; +#else + d3d12->pass[i].frame_direction = 1; #endif - d3d12->pass[i].frame_direction = 1; - d3d12->pass[i].frame_time_delta = (uint32_t)video_driver_get_frame_time_delta_usec(); - d3d12->pass[i].original_fps = video_driver_get_original_fps(); - d3d12->pass[i].rotation = retroarch_get_rotation(); - d3d12->pass[i].core_aspect = video_driver_get_core_aspect(); + d3d12->pass[i].frame_time_delta = (uint32_t)video_driver_get_frame_time_delta_usec(); + d3d12->pass[i].original_fps = video_driver_get_original_fps(); + d3d12->pass[i].rotation = retroarch_get_rotation(); + d3d12->pass[i].core_aspect = video_driver_get_core_aspect(); /* OriginalAspectRotated: return 1 / aspect for 90 and 270 rotated content */ - d3d12->pass[i].core_aspect_rot = video_driver_get_core_aspect(); - uint32_t rot = retroarch_get_rotation(); - if (rot == 1 || rot == 3) + d3d12->pass[i].core_aspect_rot = d3d12->pass[i].core_aspect; + if ( d3d12->pass[i].rotation == VIDEO_ROTATION_90_DEG + || d3d12->pass[i].rotation == VIDEO_ROTATION_270_DEG) d3d12->pass[i].core_aspect_rot = 1 / d3d12->pass[i].core_aspect_rot; /* Sub-frame info for multiframe shaders (per real content frame). From 7b37f85a99dadf2252336470896875f5856590b5 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Fri, 9 May 2025 00:56:13 +0300 Subject: [PATCH 055/175] XMB: Add temporary thumbnail toggle (#17881) --- menu/drivers/xmb.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 3f5c7ca7b8..8caf4db591 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -448,6 +448,7 @@ typedef struct xmb_handle bool show_fullscreen_thumbnails; bool want_fullscreen_thumbnails; bool skip_thumbnail_reset; + bool show_thumbnails; bool show_mouse; bool show_screensaver; bool use_ps3_layout; @@ -4799,10 +4800,12 @@ static int xmb_draw_item( { bool show_right_thumbnail = (gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_RIGHT) + && xmb->show_thumbnails && ( (xmb->thumbnails.right.status == GFX_THUMBNAIL_STATUS_AVAILABLE) || (xmb->thumbnails.right.status == GFX_THUMBNAIL_STATUS_PENDING))); bool show_left_thumbnail = (gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_LEFT) + && xmb->show_thumbnails && ( (xmb->thumbnails.left.status == GFX_THUMBNAIL_STATUS_AVAILABLE) || (xmb->thumbnails.left.status == GFX_THUMBNAIL_STATUS_PENDING))); @@ -5808,6 +5811,14 @@ static enum menu_action xmb_parse_menu_entry_action( return MENU_ACTION_NOOP; } break; + case MENU_ACTION_INFO: + if ( (xmb->is_playlist) + || (xmb->is_explore_list)) + { + xmb->show_thumbnails = !xmb->show_thumbnails; + new_action = MENU_ACTION_NOOP; + } + break; case MENU_ACTION_UP: case MENU_ACTION_DOWN: case MENU_ACTION_SCROLL_UP: @@ -7976,12 +7987,14 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) bool thumbnail_background = settings->bools.menu_thumbnail_background_enable; bool show_right_thumbnail = (gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_RIGHT)) + && xmb->show_thumbnails && ( (xmb->thumbnails.right.status == GFX_THUMBNAIL_STATUS_AVAILABLE) || ( xmb->thumbnails.right.status < GFX_THUMBNAIL_STATUS_AVAILABLE && xmb->thumbnails_right_status_prev <= GFX_THUMBNAIL_STATUS_AVAILABLE && xmb->thumbnails_right_status_prev != GFX_THUMBNAIL_STATUS_UNKNOWN)); bool show_left_thumbnail = (gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_LEFT)) + && xmb->show_thumbnails && ( (xmb->thumbnails.left.status == GFX_THUMBNAIL_STATUS_AVAILABLE) || ( xmb->thumbnails.left.status < GFX_THUMBNAIL_STATUS_AVAILABLE && xmb->thumbnails_left_status_prev <= GFX_THUMBNAIL_STATUS_AVAILABLE @@ -8700,6 +8713,7 @@ static void *xmb_init(void **userdata, bool video_is_threaded) xmb->fullscreen_thumbnails_available = false; xmb->show_fullscreen_thumbnails = false; xmb->skip_thumbnail_reset = false; + xmb->show_thumbnails = true; xmb->fullscreen_thumbnail_alpha = 0.0f; xmb->fullscreen_thumbnail_selection = 0; xmb->fullscreen_thumbnail_label[0] = '\0'; From f9bdd7bc87152b653a190df65c6c832405a1f7d0 Mon Sep 17 00:00:00 2001 From: Michael Burgardt Date: Thu, 8 May 2025 21:57:00 +0000 Subject: [PATCH 056/175] Update language list in sample files (#17829) --- .../example_categories/libretro_core_options.h | 7 +++++++ .../core_options/example_default/libretro_core_options.h | 8 +++++++- .../example_hide_option/libretro_core_options.h | 7 +++++++ .../example_translation/libretro_core_options.h | 5 ++++- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/libretro-common/samples/core_options/example_categories/libretro_core_options.h b/libretro-common/samples/core_options/example_categories/libretro_core_options.h index 4179c4ba0d..2183b84968 100644 --- a/libretro-common/samples/core_options/example_categories/libretro_core_options.h +++ b/libretro-common/samples/core_options/example_categories/libretro_core_options.h @@ -167,6 +167,13 @@ struct retro_core_options_v2 *options_intl[RETRO_LANGUAGE_LAST] = { NULL, /* RETRO_LANGUAGE_SWEDISH */ NULL, /* RETRO_LANGUAGE_UKRAINIAN */ NULL, /* RETRO_LANGUAGE_CZECH */ + NULL, /* RETRO_LANGUAGE_CATALAN_VALENCIA */ + NULL, /* RETRO_LANGUAGE_CATALAN */ + NULL, /* RETRO_LANGUAGE_BRITISH_ENGLISH */ + NULL, /* RETRO_LANGUAGE_HUNGARIAN */ + NULL, /* RETRO_LANGUAGE_BELARUSIAN */ + NULL, /* RETRO_LANGUAGE_GALICIAN */ + NULL, /* RETRO_LANGUAGE_NORWEGIAN */ }; #endif diff --git a/libretro-common/samples/core_options/example_default/libretro_core_options.h b/libretro-common/samples/core_options/example_default/libretro_core_options.h index fbb9cfcba0..78d8de27d1 100644 --- a/libretro-common/samples/core_options/example_default/libretro_core_options.h +++ b/libretro-common/samples/core_options/example_default/libretro_core_options.h @@ -125,7 +125,13 @@ struct retro_core_option_definition *option_defs_intl[RETRO_LANGUAGE_LAST] = { NULL, /* RETRO_LANGUAGE_SWEDISH */ NULL, /* RETRO_LANGUAGE_UKRAINIAN */ NULL, /* RETRO_LANGUAGE_CZECH */ - + NULL, /* RETRO_LANGUAGE_CATALAN_VALENCIA */ + NULL, /* RETRO_LANGUAGE_CATALAN */ + NULL, /* RETRO_LANGUAGE_BRITISH_ENGLISH */ + NULL, /* RETRO_LANGUAGE_HUNGARIAN */ + NULL, /* RETRO_LANGUAGE_BELARUSIAN */ + NULL, /* RETRO_LANGUAGE_GALICIAN */ + NULL, /* RETRO_LANGUAGE_NORWEGIAN */ }; #endif diff --git a/libretro-common/samples/core_options/example_hide_option/libretro_core_options.h b/libretro-common/samples/core_options/example_hide_option/libretro_core_options.h index df7afdd7e1..d2623908e7 100644 --- a/libretro-common/samples/core_options/example_hide_option/libretro_core_options.h +++ b/libretro-common/samples/core_options/example_hide_option/libretro_core_options.h @@ -140,6 +140,13 @@ struct retro_core_option_definition *option_defs_intl[RETRO_LANGUAGE_LAST] = { NULL, /* RETRO_LANGUAGE_SWEDISH */ NULL, /* RETRO_LANGUAGE_UKRAINIAN */ NULL, /* RETRO_LANGUAGE_CZECH */ + NULL, /* RETRO_LANGUAGE_CATALAN_VALENCIA */ + NULL, /* RETRO_LANGUAGE_CATALAN */ + NULL, /* RETRO_LANGUAGE_BRITISH_ENGLISH */ + NULL, /* RETRO_LANGUAGE_HUNGARIAN */ + NULL, /* RETRO_LANGUAGE_BELARUSIAN */ + NULL, /* RETRO_LANGUAGE_GALICIAN */ + NULL, /* RETRO_LANGUAGE_NORWEGIAN */ }; #endif diff --git a/libretro-common/samples/core_options/example_translation/libretro_core_options.h b/libretro-common/samples/core_options/example_translation/libretro_core_options.h index 1e4ea5d060..181aa24d70 100644 --- a/libretro-common/samples/core_options/example_translation/libretro_core_options.h +++ b/libretro-common/samples/core_options/example_translation/libretro_core_options.h @@ -139,7 +139,7 @@ struct retro_core_options_v2 options_us = { #ifndef HAVE_NO_LANGEXTRA struct retro_core_options_v2 *options_intl[RETRO_LANGUAGE_LAST] = { - &options_us, /* RETRO_LANGUAGE_ENGLISH */ + &options_us, /* RETRO_LANGUAGE_ENGLISH */ &options_ja, /* RETRO_LANGUAGE_JAPANESE */ &options_fr, /* RETRO_LANGUAGE_FRENCH */ &options_es, /* RETRO_LANGUAGE_SPANISH */ @@ -171,6 +171,9 @@ struct retro_core_options_v2 *options_intl[RETRO_LANGUAGE_LAST] = { &options_ca, /* RETRO_LANGUAGE_CATALAN */ &options_en, /* RETRO_LANGUAGE_BRITISH_ENGLISH */ &options_hu, /* RETRO_LANGUAGE_HUNGARIAN */ + &options_be, /* RETRO_LANGUAGE_BELARUSIAN */ + &options_gl, /* RETRO_LANGUAGE_GALICIAN */ + &options_no, /* RETRO_LANGUAGE_NORWEGIAN */ }; #endif From 726470977644c8e7bf8cd8c6c28a9b51f22b86a6 Mon Sep 17 00:00:00 2001 From: Aleksey Samoilov Date: Fri, 9 May 2025 02:15:22 +0400 Subject: [PATCH 057/175] Set toplevel icon for libdecor frame --- gfx/common/wayland_common.c | 26 ++++++++++++++++++++------ input/common/wayland_common.h | 1 + 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/gfx/common/wayland_common.c b/gfx/common/wayland_common.c index 4a0fe96777..7477736e24 100644 --- a/gfx/common/wayland_common.c +++ b/gfx/common/wayland_common.c @@ -592,11 +592,11 @@ static void shm_buffer_paint_icon( } } -static bool wl_create_toplevel_icon(gfx_ctx_wayland_data_t *wl) +static bool wl_create_toplevel_icon(gfx_ctx_wayland_data_t *wl, struct xdg_toplevel *toplevel) { - wl->xdg_toplevel_icon = xdg_toplevel_icon_manager_v1_create_icon( + struct xdg_toplevel_icon_v1 *icon = xdg_toplevel_icon_manager_v1_create_icon( wl->xdg_toplevel_icon_manager); - xdg_toplevel_icon_v1_set_name(wl->xdg_toplevel_icon, WAYLAND_APP_ID); + xdg_toplevel_icon_v1_set_name(icon, WAYLAND_APP_ID); const int icon_size = wl->buffer_scale > 1 ? 128 : 64; shm_buffer_t *icon_buffer = create_shm_buffer(wl, @@ -606,7 +606,7 @@ static bool wl_create_toplevel_icon(gfx_ctx_wayland_data_t *wl) { shm_buffer_paint_icon(icon_buffer, icon_size, icon_size, 1, icon_size / 16); xdg_toplevel_icon_v1_add_buffer( - wl->xdg_toplevel_icon, icon_buffer->wl_buffer, 1); + icon, icon_buffer->wl_buffer, 1); } else { @@ -615,7 +615,18 @@ static bool wl_create_toplevel_icon(gfx_ctx_wayland_data_t *wl) } xdg_toplevel_icon_manager_v1_set_icon( - wl->xdg_toplevel_icon_manager, wl->xdg_toplevel, wl->xdg_toplevel_icon); + wl->xdg_toplevel_icon_manager, toplevel, icon); + +#ifdef HAVE_LIBDECOR_H + if (wl->libdecor_frame) + { + wl->libdecor_icon = icon; + } + else +#endif + { + wl->xdg_toplevel_icon = icon; + } return true; } @@ -848,6 +859,9 @@ bool gfx_ctx_wl_init_common( goto error; } + struct xdg_toplevel *xdg_toplevel = wl->libdecor_frame_get_xdg_toplevel(wl->libdecor_frame); + wl_create_toplevel_icon(wl, xdg_toplevel); + wl->libdecor_frame_set_app_id(wl->libdecor_frame, WAYLAND_APP_ID); wl->libdecor_frame_set_title(wl->libdecor_frame, WINDOW_TITLE); wl->libdecor_frame_map(wl->libdecor_frame); @@ -882,7 +896,7 @@ bool gfx_ctx_wl_init_common( wl->deco_manager, wl->xdg_toplevel); if (wl->xdg_toplevel_icon_manager) - wl_create_toplevel_icon(wl); + wl_create_toplevel_icon(wl, wl->xdg_toplevel); /* Waiting for xdg_toplevel to be configured before starting to draw */ wl_surface_commit(wl->surface); diff --git a/input/common/wayland_common.h b/input/common/wayland_common.h index 9d00619327..7f685b61e6 100644 --- a/input/common/wayland_common.h +++ b/input/common/wayland_common.h @@ -175,6 +175,7 @@ typedef struct gfx_ctx_wayland_data #ifdef HAVE_LIBDECOR_H struct libdecor *libdecor_context; struct libdecor_frame *libdecor_frame; + struct xdg_toplevel_icon_v1 *libdecor_icon; #ifdef HAVE_DYLIB dylib_t libdecor; #define RA_WAYLAND_SYM(rc,fn,params) rc (*fn) params; From 6be300b07cac65b0661dbee3bb2664ca85188fac Mon Sep 17 00:00:00 2001 From: Aleksey Samoilov Date: Fri, 9 May 2025 02:20:07 +0400 Subject: [PATCH 058/175] Additional check for xdg-toplevel-icon for libdecor --- gfx/common/wayland_common.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gfx/common/wayland_common.c b/gfx/common/wayland_common.c index 7477736e24..984ffa9b85 100644 --- a/gfx/common/wayland_common.c +++ b/gfx/common/wayland_common.c @@ -859,8 +859,9 @@ bool gfx_ctx_wl_init_common( goto error; } - struct xdg_toplevel *xdg_toplevel = wl->libdecor_frame_get_xdg_toplevel(wl->libdecor_frame); - wl_create_toplevel_icon(wl, xdg_toplevel); + if (wl->xdg_toplevel_icon_manager) + struct xdg_toplevel *xdg_toplevel = wl->libdecor_frame_get_xdg_toplevel(wl->libdecor_frame); + wl_create_toplevel_icon(wl, xdg_toplevel); wl->libdecor_frame_set_app_id(wl->libdecor_frame, WAYLAND_APP_ID); wl->libdecor_frame_set_title(wl->libdecor_frame, WINDOW_TITLE); From ae9e8ba75c3d81b5c9327142f1459e55d93b8dab Mon Sep 17 00:00:00 2001 From: sonninnos Date: Fri, 9 May 2025 01:29:57 +0300 Subject: [PATCH 059/175] Ozone: Skip thumbnail background for metadata display --- menu/drivers/ozone.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index b326f401e1..541b09aea2 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -6438,7 +6438,7 @@ static void ozone_draw_thumbnail_bar( left_thumbnail_alpha = 1.0f; } - if (thumbnail_background) + if (thumbnail_background && !(ozone->flags & OZONE_FLAG_FORCE_METADATA_DISPLAY)) { float background_color[16] = { 0.0f, 0.0f, 0.0f, 1.0f, From cacff137995ee577f8afe9656c23226ad86a84b6 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Fri, 9 May 2025 01:44:20 +0300 Subject: [PATCH 060/175] Ozone: Improve metadata background fade --- menu/drivers/ozone.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index 541b09aea2..6d607c8e39 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -6438,13 +6438,13 @@ static void ozone_draw_thumbnail_bar( left_thumbnail_alpha = 1.0f; } - if (thumbnail_background && !(ozone->flags & OZONE_FLAG_FORCE_METADATA_DISPLAY)) + if (thumbnail_background) { float background_color[16] = { - 0.0f, 0.0f, 0.0f, 1.0f, - 0.0f, 0.0f, 0.0f, 1.0f, - 0.0f, 0.0f, 0.0f, 1.0f, - 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, left_thumbnail_alpha, + 0.0f, 0.0f, 0.0f, left_thumbnail_alpha, + 0.0f, 0.0f, 0.0f, left_thumbnail_alpha, + 0.0f, 0.0f, 0.0f, left_thumbnail_alpha, }; left_thumbnail_alignment = GFX_THUMBNAIL_ALIGN_CENTRE; From df1c342cb2fe7fd6c415bdae436e7c75a6a0b78a Mon Sep 17 00:00:00 2001 From: sonninnos Date: Fri, 9 May 2025 02:05:44 +0300 Subject: [PATCH 061/175] Ozone: C89 buildfix --- menu/drivers/ozone.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index 6d607c8e39..e263fbd5d2 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -6441,12 +6441,17 @@ static void ozone_draw_thumbnail_bar( if (thumbnail_background) { float background_color[16] = { - 0.0f, 0.0f, 0.0f, left_thumbnail_alpha, - 0.0f, 0.0f, 0.0f, left_thumbnail_alpha, - 0.0f, 0.0f, 0.0f, left_thumbnail_alpha, - 0.0f, 0.0f, 0.0f, left_thumbnail_alpha, + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f, }; + background_color[3] = + background_color[7] = + background_color[11] = + background_color[15] = left_thumbnail_alpha; + left_thumbnail_alignment = GFX_THUMBNAIL_ALIGN_CENTRE; gfx_display_draw_quad( From 8e154e0df686651959e43b1ead1b2a0e428593d3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 9 May 2025 00:16:12 +0000 Subject: [PATCH 062/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 68 +++++++++++++++++++++++++++++++++++++++++++ intl/msg_hash_de.h | 12 ++++++++ intl/msg_hash_es.h | 12 ++++++++ intl/msg_hash_fi.h | 4 +++ intl/msg_hash_fr.h | 12 ++++++++ intl/msg_hash_it.h | 8 +++++ intl/msg_hash_pt_br.h | 12 ++++++++ intl/msg_hash_ru.h | 24 +++++++++++++++ intl/msg_hash_tr.h | 12 ++++++++ intl/msg_hash_uk.h | 12 ++++++++ intl/progress.h | 16 +++++----- 11 files changed, 184 insertions(+), 8 deletions(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 099545d1e4..494b2a837a 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -1504,6 +1504,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Usuari" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Canvia la configuració de la privacitat, el compte i el nom d'usuari." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Directoris" @@ -3522,6 +3526,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_TURBO_MODE_CLASSIC, "Mode clàssic de maneig amb dos botons. Manté clicat un botó i clica el botó Turbo al mateix temps per activar la seqüència.\nEl turbo es pot assignar mitjançant la configuració." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_TURBO_MODE_CLASSIC_TOGGLE, + "Ús clàssic dels dos botons. Manté clicat un botó i clica a la vegada el botó de turbo per activar el mode turbo. Desactivar turbo: manté clicat el botó i torna a clicar el botó turbo.\nEl botó turbo es pot assignar dins de la configuració." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_TURBO_MODE_SINGLEBUTTON, "Mode d'alternança. Clica al botó Turbo una vegada per activar la seqüència de clicar i alliberar el botó seleccionat i torna a clicar el botó Turbo per desactivar-lo.\nEl turbo pot assignar-se a la configuració." @@ -3586,6 +3594,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_RETROPAD_BINDS, "Assignacions dels RetroPad" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_INPUT_RETROPAD_BINDS, + "Libretro fa servir un controlador virtual conegut com 'RetroPad' per comunicar els senyals entre els nuclis i els frontends i viceversa. Aquest menú determina com s'assignen els senyals dels controladors físics al RetroPad virtual i quins ports fa servir cada dispositiu.\nSi un controlador físic és reconegut i configurat automàticament, els usuaris no hauran d'utilitzar aquest menú en cap moment, i per canvis propis de cada nucli, caldria fer servir el menú ràpid." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, "Controls del port %u" @@ -3919,6 +3931,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Activa o desactiva el shader seleccionat." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Shaders (Mantenir)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "Manté el shader seleccionat activat o desactivat mentre la tecla és clicada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Següent shader" @@ -4200,6 +4220,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_ADC_TYPE, "Fes servir un joystick analògic específic per l'entrada de la creueta digital. 'Forçat' ignoren les entrades analògiques natives del nucli." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_INPUT_ADC_TYPE, + "Assigna el joystick analògic especificat com a senyal d'entrada de la creueta.\nSi el nucli suporta el control analògic de forma nativa, les assignacions de la creueta s'anul·laran a no ser que s'hagin forçat.\nEn forçar les assingaciona de creuete, el nucli no rebrà senyal de cap entrada analògica del joystick especificat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX, "Índex del dispositiu" @@ -5387,10 +5411,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_X_SEPARATION_LANDSCAPE, "Separació horitzontal de superposició (mode horitzontal)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_X_SEPARATION_LANDSCAPE, + "Si la configuració actual ho permet, ajusta l'espai entre els elements de la interfície de les meitats esquerra i dreta d'una superposició en fer servir l'a orientació horitzontal de pantalla. Els valors positius augmenten la separació entre les dues meitats i els valors negatius redueixen la separació." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_Y_SEPARATION_LANDSCAPE, "Separació vertical de superposició (mode horitzontal)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_Y_SEPARATION_LANDSCAPE, + "Si la configuració actual ho permet, ajusta l'espai entre els elements de la interfície de les meitats superior i inferior d'una superposició en fer servir l'a orientació horitzontal de pantalla. Els valors positius augmenten la separació entre les dues meitats i els valors negatius redueixen la separació." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_X_OFFSET_LANDSCAPE, "Desplaçament X de superposició (mode horitzontal)" @@ -5427,10 +5459,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_X_SEPARATION_PORTRAIT, "Separació vertical de superposició (mode vertical)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_X_SEPARATION_PORTRAIT, + "Si la configuració actual ho permet, ajusta l'espai entre els elements de la interfície de les meitats esquerra i dreta d'una superposició en fer servir l'a orientació vertical de pantalla. Els valors positius augmenten la separació entre les dues meitats i els valors negatius redueixen la separació." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_Y_SEPARATION_PORTRAIT, "Separació vertical de superposició (mode vertical)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_Y_SEPARATION_PORTRAIT, + "Si la configuració actual ho permet, ajusta l'espai entre els elements de la interfície de les meitats superior i inferior d'una superposició en fer servir l'a orientació vertical de pantalla. Els valors positius augmenten la separació entre les dues meitats i els valors negatius redueixen la separació." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY_X_OFFSET_PORTRAIT, "Desplaçament X de superposició (mode vertical)" @@ -7669,6 +7709,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_BACKUP_HISTORY_SIZE, "Mida de l'historial de còpies de seguretat del nucli" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_BACKUP_HISTORY_SIZE, + "Especifica la quantitat de còpies de seguretat automàtiques que es desaran per cada nucli instal·lat. En arribar a aquest límit, la següent còpia de seguretat produïda eliminarà la còpia de seguretat més antiga. Les còpies de seguretat manuals no es veuen afectades per aquesta opció." + ) /* Settings > Playlists */ @@ -7692,6 +7736,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_FAVORITES_SIZE, "Mida dels favorits" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_FAVORITES_SIZE, + "Limita el nombre d'entrades a la llista 'Preferits'. Un cop s'arriba al límit, les noves incorporacions no s'afegiran fins que altres entrades siguin eliminades. Posar un valor de -1 per tenir un valor d'entrades il·limitat.\nAVÍS: Si es disminueix aquest valor, s'eliminaran les entrades existents!" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Permet reanomenar els elements" @@ -7856,6 +7904,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_FUZZY_ARCHIVE_MATCH, "Cerca aproximada de fitxers" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_FUZZY_ARCHIVE_MATCH, + "Quan es fa una cerca en els fitxers comprimits d'una llista de reproducció, només es cercarà la coincidència en el nom del fitxer. Això evita que apareguin duplicats en l'historial." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SCAN_WITHOUT_CORE_MATCH, "Cerca sense coincidència de nucli" @@ -9695,6 +9747,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_DISK_TRAY_INSERT, "Insereix disc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DISK_TRAY_INSERT, + "Insereix un disc i tanca la safata virtual. Si l'opció 'Fes pausa al contingut quan el menú estigui actiu' està activada, alguns nuclis no poden registrar canvis fins que hagin passat uns segons amb el contingut reprès i després de cada acció de control de discs." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND, "Carrega un nou disc" @@ -9746,6 +9802,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET, "Carrega un shader predefinit. El pipeline de shaders es configurarà automàticament." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_SHADER_PRESET, + "Carrega directament una configuració de shaders. El menú de shaders s'actualitzarà.\nEl factor d'escala que es mostra en el menú serà correcte només si es fa servir mètodes d'escalat simples." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PREPEND, "Anteposar el preajust" @@ -10839,6 +10899,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_INTERNAL_UPSCALE_LEVEL, "Reescalat intern" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_INTERNAL_UPSCALE_LEVEL, + "Escala la interfície del menú abans de mostrar-la en pantalla. Si l'opció 'Filtre lineal del menú' està activada, elimina els efectes d'escalat (píxels no proporcionals) mantenint una imatge nítida. Té un impacte significatiu en el rendiment que augmenta si ho fa l'escalat." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_ASPECT_RATIO, "Relació d'aspecte" @@ -12505,6 +12569,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, "Avisa al controlador de vídeo que faci servir un mode de búfer concret." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_MAX_SWAPCHAIN_IMAGES, + "Nombre màxim d'imatges en swap chain. Això indica al controlador de vídeo que faci servir un búfer de vídeo concret.\nBúfer simple: 1\nBúfer doble: 2\nBúfer triple: 3\nEscull el búfer més apropiat per millorar la latència." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_WAITABLE_SWAPCHAINS, "Cadenes d'intercanvi en espera" diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index cd5b14d9cc..9739f24c9d 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -1448,6 +1448,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Benutzer" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Einstellungen für Privatsphäre, Konto und Benutzername ändern." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Verzeichnisse" @@ -3871,6 +3875,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Schaltet den aktuell ausgewählten Shader ein/aus." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Shaders (Halten)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "Hält den aktuell ausgewählten Shader an/aus, solange die Taste gedrückt wird." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Nächster Shader" diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index 07c68da1a3..cfee409456 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -1508,6 +1508,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Usuario" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Cambia los ajustes de privacidad, cuenta y nombre de usuario." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Directorios" @@ -3971,6 +3975,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Activa o desactiva el shader seleccionado." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Shaders (mantener)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "Mantiene activado o desactivado el shader seleccionado al pulsar el botón." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Siguiente shader" diff --git a/intl/msg_hash_fi.h b/intl/msg_hash_fi.h index feaeb510b6..51a8fa8001 100644 --- a/intl/msg_hash_fi.h +++ b/intl/msg_hash_fi.h @@ -1484,6 +1484,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Käyttäjä" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Vaihda yksityisyyden, tilin ja käyttäjätunnuksen asetuksia." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Kansio" diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index bfb26905cc..b703255a1e 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -1484,6 +1484,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Utilisateur" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Modifier les réglages de confidentialité, de compte et de nom d'utilisateur." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Dossiers" @@ -3931,6 +3935,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Active/désactive le shader actuellement sélectionné." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Maintenir pour activer/désactiver les shaders" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "Maintient le shader sélectionné activé/désactivé lorsque la touche est enfoncée." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Shader suivant" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 73fc7399e6..9cf80f7172 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -3903,6 +3903,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Attiva o disattiva lo shader attualmente selezionato." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Shader (Premuto)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "Tieni premuto lo shader attualmente selezionato/disattivato mentre il tasto viene premuto." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Shader successiva" diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index ea1d1b5ea2..40622eab6c 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -1496,6 +1496,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Usuário" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Altere as configurações de privacidade, conta e nome de usuário." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Diretório" @@ -3631,6 +3635,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Liga/desliga o sombreador atualmente selecionado." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Shaders (Manter pressionado)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "Mantém o shader selecionado ativado/desativado enquanto a tecla estiver pressionada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Próximo sombreador" diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 0f59cd1131..dd68b5e907 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -1516,6 +1516,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Пользователь" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Настройки приватности, аккаунтов и имени пользователя." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Каталоги" @@ -3991,6 +3995,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Включает/выключает текущий выбранный шейдер." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Шейдеры (с удержанием)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "Включает/отключает текущий выбранный шейдер пока нажата кнопка." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Следующий шейдер" @@ -7130,6 +7142,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Автоматически масштабировать эскизы с шириной/высотой меньше заданного значения. Повышает качество изображения, умеренно влияя на производительность." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Фон миниатюр" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, "Включает заполнение свободного пространства вокруг миниатюр сплошным фоном. Обеспечивает единую размерность для всех изображений, улучшая отображение меню при просмотре эскизов разного размера." @@ -11904,6 +11920,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Включает дополнительный эскиз при просмотре плейлиста в режиме 'Список'. Настройка применяется только если ширины экрана достаточно для отображения двух эскизов." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, + "Фон миниатюр" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Включает заполнение свободного пространства вокруг миниатюр сплошным фоном. Обеспечивает единую размерность для всех изображений, улучшая отображение меню при просмотре эскизов разного размера." @@ -14898,6 +14918,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Для загрузки сохранений требуется отключить или приостановить Режим хардкора для достижений." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "Для загрузки сохранений в srm требуется приостановить или отключить достижения в режиме хардкора." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "Загружено сохранение состояния. Режим хардкора для текущего сеанса достижений отключен." diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 33fcf75c40..887fc56f7e 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -1504,6 +1504,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Kullanıcı" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Gizlilik, hesap ve kullanıcı adı ayarlarınızı değiştirin." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Dizin" @@ -3971,6 +3975,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Seçili olan gölgelendiriciyi açar/kapatır." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Gölgelendiriciler (Basılı Tut)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "Tuşa basılı tutulduğu sürece seçili olan gölgelendiriciyi açık/kapalı tutar." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Sonraki Gölgelendirici" diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index d2d129835c..292c005d3b 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -1516,6 +1516,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Користувач" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Зміна налаштувань конфіденційності, облікового запису та імені користувача." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Каталоги" @@ -3983,6 +3987,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Вмикає/вимикає поточний вибраний шейдер." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Шейдери (Утримувати)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "Тримає поточний вибраний шейдер увімкненим/вимкненим, поки натиснута клавіша." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Наступний шейдер" diff --git a/intl/progress.h b/intl/progress.h index f40de65070..09bda42b16 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 91 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 94 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -31,7 +31,7 @@ #define LANGUAGE_PROGRESS_DANISH_APPROVED 0 /* German */ -#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_GERMAN_APPROVED 13 /* Greek */ @@ -47,7 +47,7 @@ #define LANGUAGE_PROGRESS_ESPERANTO_APPROVED 0 /* Spanish */ -#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 100 #define LANGUAGE_PROGRESS_SPANISH_APPROVED 91 /* Persian */ @@ -59,8 +59,8 @@ #define LANGUAGE_PROGRESS_FINNISH_APPROVED 45 /* French */ -#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 99 -#define LANGUAGE_PROGRESS_FRENCH_APPROVED 99 +#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_FRENCH_APPROVED 100 /* Galician */ #define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 99 @@ -135,15 +135,15 @@ #define LANGUAGE_PROGRESS_SWEDISH_APPROVED 50 /* Turkish */ -#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 99 -#define LANGUAGE_PROGRESS_TURKISH_APPROVED 99 +#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_TURKISH_APPROVED 100 /* Tatar */ #define LANGUAGE_PROGRESS_TATAR_TRANSLATED 0 #define LANGUAGE_PROGRESS_TATAR_APPROVED 0 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ From 759104acd4e0eb4f3d1fc5df921ec71c58db58e3 Mon Sep 17 00:00:00 2001 From: Aleksey Samoilov Date: Fri, 9 May 2025 19:01:31 +0400 Subject: [PATCH 063/175] Fix build with libdecor enabled --- gfx/common/wayland_common.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gfx/common/wayland_common.c b/gfx/common/wayland_common.c index 984ffa9b85..517d99b03d 100644 --- a/gfx/common/wayland_common.c +++ b/gfx/common/wayland_common.c @@ -860,8 +860,10 @@ bool gfx_ctx_wl_init_common( } if (wl->xdg_toplevel_icon_manager) + { struct xdg_toplevel *xdg_toplevel = wl->libdecor_frame_get_xdg_toplevel(wl->libdecor_frame); wl_create_toplevel_icon(wl, xdg_toplevel); + } wl->libdecor_frame_set_app_id(wl->libdecor_frame, WAYLAND_APP_ID); wl->libdecor_frame_set_title(wl->libdecor_frame, WINDOW_TITLE); From 0818feb131ac41790fde5ae9c387c2b0cd7c8d43 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Fri, 9 May 2025 19:09:40 +0300 Subject: [PATCH 064/175] Wasapi: Buffer correction --- audio/drivers/wasapi.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/audio/drivers/wasapi.c b/audio/drivers/wasapi.c index 434640763f..5f52ae900c 100644 --- a/audio/drivers/wasapi.c +++ b/audio/drivers/wasapi.c @@ -443,10 +443,13 @@ static size_t wasapi_write_avail(void *wh) { wasapi_t *w = (wasapi_t*)wh; UINT32 padding = 0; + + if (w->flags & WASAPI_FLG_EXCLUSIVE && w->buffer) + return FIFO_WRITE_AVAIL(w->buffer); if (FAILED(_IAudioClient_GetCurrentPadding(w->client, &padding))) return 0; if (w->buffer) /* Exaggerate available size for best results.. */ - return FIFO_WRITE_AVAIL(w->buffer) + padding * 2; + return FIFO_WRITE_AVAIL(w->buffer) + padding; return w->engine_buffer_size - padding * w->frame_size; } From b590d843bcf8621ed99bb7209225a37c57bedf78 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 10 May 2025 00:15:02 +0000 Subject: [PATCH 065/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 68 ++++++++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 494b2a837a..4d3cfd1f43 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -3157,6 +3157,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_MAX_TIMING_SKEW, "El canvi màxim en la freqüència d'entrada d'àudio. Augmentar això activa canvis molt grans en la sincronització a cost d'un to d'àudio imprecís (ex. executar nuclis PAL a pantalles NTSC)." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_AUDIO_MAX_TIMING_SKEW, + "La variació màxima de la sincronia d'àudio.\nDefineix la variació màxima de la freqüència d'entrada. Es pot augmentar el valor per canviar la sincronia (per exemple, si executes nuclis PAL en pantalles NTSC) a canvi de canviar el to de l'àudio.\nLa freqüència d'entrada es calcula com:\nfreqüència d'entrada * (1.0 +/- (variació màxima de sincronia))" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_RATE_CONTROL_DELTA, "Control dinàmic de freqüència d'àudio" @@ -3368,6 +3372,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_SELECT_PHYSICAL_KEYBOARD, "Fes servir aquest dispositiu per un teclat físic i no per un controlador." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_INPUT_SELECT_PHYSICAL_KEYBOARD, + "Si RetroArch identifica un teclat físic com algun tipus de controlador, aquí pots obligar a configurar el dispositiu com un teclat.\nÉs útil si vols intentar emular un ordinador en un dispositiu tipus Android TV i també tens un teclat físic que es pot connectar al dispostiu." + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSORS_ENABLE, @@ -3534,6 +3542,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_TURBO_MODE_SINGLEBUTTON, "Mode d'alternança. Clica al botó Turbo una vegada per activar la seqüència de clicar i alliberar el botó seleccionat i torna a clicar el botó Turbo per desactivar-lo.\nEl turbo pot assignar-se a la configuració." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_TURBO_MODE_SINGLEBUTTON_HOLD, + "Mode de bloqueig de botó. LA seqüència de clicar i soltar el botó predeterminat seleccionat es mantindrà activa sempre que es mantingui clicat el botó de turbo.\nEl turbo pot assignar-se a configuració.\nSi vols emular el mètode de tir automàtic d'èpoques anteriors, assigna els botons de turbo i predeterminat per a què siguin el mateix botó del controlador." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_BIND, "Assignació del turbo" @@ -3594,6 +3606,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_RETROPAD_BINDS, "Assignacions dels RetroPad" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_RETROPAD_BINDS, + "Canvia les assignacions del RetroPad virtual respecte a un dispositiu d'entrada físic. Si es reconeix i configura automàticament un dispositiu d'entrada correctament, els usuaris no necessitaran aquest menú.\nNota: per fer canvis específics segons cada nucli, fes servir el menú 'Controls' del menú ràpid." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_INPUT_RETROPAD_BINDS, "Libretro fa servir un controlador virtual conegut com 'RetroPad' per comunicar els senyals entre els nuclis i els frontends i viceversa. Aquest menú determina com s'assignen els senyals dels controladors físics al RetroPad virtual i quins ports fa servir cada dispositiu.\nSi un controlador físic és reconegut i configurat automàticament, els usuaris no hauran d'utilitzar aquest menú en cap moment, i per canvis propis de cada nucli, caldria fer servir el menú ràpid." @@ -3719,6 +3735,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, "Activa Dreceres de Teclat" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_ENABLE_HOTKEY, + "Si aquesta tecla ràpida està assignada a un teclat, un botó o l'eix d'un controlador, la resta de tecles ràpides es desactivaran a no ser que aquesta tecla sigui clicada al mateix temps.\nAixò serveix per implementacions centrades en RETRO_KEYBOARD, que fan servir una gran part del teclat i en les que no vols que les tecles ràpides interfereixin amb el funcionament normal." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BLOCK_DELAY, "Retard de l'activació de les dreceres de teclat (fotogrames)" @@ -4463,6 +4483,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_RUN_AHEAD_FRAMES, "Determina el nombre de fotogrames a executar de bestreta. Poden haver fluctuacions de senyal si el nombre de fotogrames endarrerits supera al valor intern del joc." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUNAHEAD_MODE, + "Executa lògiques addicionals del nucli per reduir la latència. Una instància executa la lògica fins al següent fotograma i torna a carregar l'estat actual. Una segona instància només per a vídeo per evitar errors amb l'estat de l'àudio. Fotogrames preventius executa els fotogrames anteriors amb accions d'entrada noves quan cal millorar l'eficàcia." + ) #if !(defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)) MSG_HASH( MENU_ENUM_SUBLABEL_RUNAHEAD_MODE_NO_SECOND_INSTANCE, @@ -4524,6 +4548,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, "Existeixen nuclis amb opció de tancat. Activant aquesta opció, RetroArch carregarà un nucli buit evitant que es tanqui soles." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_DUMMY_ON_CORE_SHUTDOWN, + "Diversos nuclis tenen la funció pròpia d'apagada. Si desactives aquesta opció, en apagar el nucli, també s'apaga RetroArch. \nAl contrari, en apagar el nucli es carregarà un nucli buit. Així, podràs seguir dins del menú sense tancar RetroArch." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE, "Iniciar nucli automàticament" @@ -4796,6 +4824,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REPLAY_MAX_KEEP, "Nombre màxim de repeticions automàtiques a conservar" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REPLAY_MAX_KEEP, + "Limita el nombre de repeticions que es crearan quan s’habiliti l’opció «Incrementa l’índex de repeticions automàticament». Si se sobrepassa el límit quan es crea una nova repetició s’esborrarà la repetició amb l'índex més baix. Un valor de «0» significa que es crearan repeticions sense límit." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE, "Desat ràpid automàtic" @@ -4919,6 +4951,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL, "Estableix el nivell de registre pels nuclis. Si un nivell de registre emès per un nucli es troba per sota d’aquest valor, s’ignorarà." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LIBRETRO_LOG_LEVEL, + "Estableix el nivell de registre dels nuclis libretro (GET_LOG_INTERFACE). Si el nivell de registre d'un nucli libretro es troba per sota del nivell indicat a libretro_log, s'ignorarà. Els registres DEBUG són sempre ignorats a no ser que estigui activat el mode de verbositat (--verbose).\nDEBUG = 0\nINFO = 1\nWARN = 2\nERROR = 3" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY_DEBUG, "0 (Depurador)" @@ -5025,6 +5061,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_FASTFORWARD_RATIO, "La velocitat màxima a la qual s'executa el contingut en un avançament ràpid (per exemple, 5.0x per un contingut a 60 fps serà 300 fps). Si el valor 0, l'avançament ràpid anirà a la màxima velocitat possible." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FASTFORWARD_RATIO, + "Indica la velocitat màxima a la qual s'executarà el contingut durant l'avançament ràpid (per exemple, 5.0 per un contingut a 60 fps => 300 fps).\nRetroArch passarà a segon pla per assegurar que no se supera la velocitat màxima. Aquest límit no és completament precís." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FASTFORWARD_FRAMESKIP, "Omet fotogrames en l'avançament ràpid" @@ -7590,6 +7630,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN, "El nombre de fotogrames de latència d’entrada per al joc en línia que s’usarà per amagar la latència de la xarxa. Redueix la fluctuació de senyal i l’ús de CPU del joc en línia a canvi d’introduir una latència d’entrada considerable." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_NETPLAY_INPUT_LATENCY_FRAMES_MIN, + "El nombre de fotogrames de retard en l'entrada que farà servir el joc en xarxa per amagar la latència de la xarxa.\nAquesta opció retarda l'entrada local en el joc en xarxa perquè el fotograma executat més proper als fotogrames que es rebin de la xarxa, reduint les distorsions visuals i el consum de la CPU, però genera un retard en la entrada visible." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, "Rang de fotogrames de latència d'entrada" @@ -7920,6 +7964,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SCAN_SERIAL_AND_CRC, "Comprova els duplicats mitjançant les sumes de verificació CRC" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCAN_SERIAL_AND_CRC, + "A vegades, els fitxers ISO tenen nombres de sèrie duplicats, sobretot en contingut de PSP/PSN. En dependre únicament del nombre de sèrie, el sistema pot cercar contingut en el sistema erroni. Aquesta opció afegeix una comprovació mitjançant sumes de verificació CRC, això disminueix la velocitat de la cerca però fa que sigui més precisa." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_LIST, "Gestiona les llistes de reproducció" @@ -8050,6 +8098,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USER_LANGUAGE, "Estableix la llengua de la interfície d’usuari." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_USER_LANGUAGE, + "Tradueix el menú i tots els missatges en pantalla a l'idioma que has seleccionat. Cal reiniciar per poder aplicar els canvis.\nNota:Al costat de cada idioma, es mostrarà el grau de finalització de cada traducció. Si algun element del menú no està traduït a l'idioma seleccionat, es mostrarà en anglès." + ) /* Settings > User > Privacy */ @@ -9755,6 +9807,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND, "Carrega un nou disc" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DISK_IMAGE_APPEND, + "Expulsa el disc actual, selecciona un nou disc des del sistema de fitxers, insereix-lo i tanca la safata virtual del disc.\nNOTA: Aquesta és una característica heretada. Es recomana carregar contingut de diversos discs a les llistes de reproducció M3U, les quals permeten seleccionar discs mitjançant les opcions 'Expulsar disc', 'Introduir disc' i 'Índex del disc actual'." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DISK_IMAGE_APPEND_TRAY_OPEN, + "Escull un nou disc des del sistema de fitxers i insereix-lo sense tancar la safata virtual de disc.\nNOTA: Aquesta és una característica heretada. Es recomana carregar títols de diversos discs fent servir les llistes de reproducció M3U, les quals permeten seleccionar discs mitjançant l'opció 'Índex del disc actual'." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DISK_INDEX, "Índex del disc actual" @@ -9862,6 +9922,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHADER_NUM_PASSES, "Augmenta o disminueix la quantitat de passes de canalització de shaders. Shaders separats es poden vincular a cada passa de canalització i configurar el seu escalat i filtrat." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_SHADER_NUM_PASSES, + "RetroArch permet combinar diversos shaders amb passades arbitràries, filtres personals de maquinari i factors d'escala.\nAquesta opció especifica la quantitat de passades de shaders que es faran servir. Si esculls 0 i després 'Aplicar canvis en els shaders', faràs servir un shader 'en blanc'." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_PASS, "Ruta cap a la carpeta de shaders. Tots els shaders han de ser del mateix tipus (per exemple, Cg, GLSL o Slang). Canvia el directori de shaders per indicar on el navegador començarà a cercar." @@ -12473,6 +12537,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_CONTENT_HISTORY, "Selecciona el contingut des d'una llista de reproducció recent." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LOAD_CONTENT_HISTORY, + "Quan es carrega un contingut, es desarà a l'historial juntament amb les combinacions de nuclis de libretro.\nL'historial es desa en un fitxer situat a la mateixa carpeta on estigui el fitxer de configuració de RetroArch. Si no s'ha carregat un fitxer de configuració en iniciar RetroArch, no es desarà ni carregarà l'historial i l'opció desapareixerà del menú principal." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MULTIMEDIA_SETTINGS, "Multimèdia" diff --git a/intl/progress.h b/intl/progress.h index 09bda42b16..02fe3c3808 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 94 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 97 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ From 84a52677b5572d1de2640e53bbbd243b5f2243bf Mon Sep 17 00:00:00 2001 From: BinBashBanana <51469593+BinBashBanana@users.noreply.github.com> Date: Sat, 10 May 2025 13:52:09 -0700 Subject: [PATCH 066/175] RWebCam hotfix --- emscripten/library_rwebcam.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/emscripten/library_rwebcam.js b/emscripten/library_rwebcam.js index a3517dce0b..14042505e3 100644 --- a/emscripten/library_rwebcam.js +++ b/emscripten/library_rwebcam.js @@ -30,16 +30,18 @@ var LibraryRWebCam = { RWebCamInit: function(caps, width, height, debug) { var glTex = Number(caps) & (1 << RWC.RETRO_CAMERA_BUFFER_OPENGL_TEXTURE); var rawFb = Number(caps) & (1 << RWC.RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER); - var c = RWebCamInitBrowser(width, height, glTex, rawFb, debug, ENVIRONMENT_IS_PTHREAD); + var proxied = typeof ENVIRONMENT_IS_PTHREAD != "undefined" && ENVIRONMENT_IS_PTHREAD; + var c = RWebCamInitBrowser(width, height, glTex, rawFb, debug, proxied); if (!c) return 0; if (debug) console.log("RWebCamInit", c); - if (ENVIRONMENT_IS_PTHREAD) { + if (proxied) { RWC.contexts[c] = {}; RWC.contexts[c].debug = debug; RWC.contexts[c].glTex = glTex; RWC.contexts[c].rawFb = rawFb; + RWC.contexts[c].proxied = true; } /* for getting/storing texture id in GL mode */ @@ -56,8 +58,8 @@ var LibraryRWebCam = { RWebCamFree: function(c) { if (RWC.contexts[c].debug) console.log("RWebCamFree", c); if (RWC.contexts[c].running) _RWebCamStop(c); /* need more checks in RA */ + if (RWC.contexts[c].proxied) RWC.contexts[c] = null; RWebCamFreeBrowser(c); - if (ENVIRONMENT_IS_PTHREAD) RWC.contexts[c] = null; }, $RWebCamStartBrowser__proxy: "sync", @@ -211,13 +213,13 @@ var LibraryRWebCam = { RWebCamPoll__deps: ["$RWebCamReady", "glBindTexture", "glGetIntegerv", "malloc", "free", "$RWebCamStoreDimensions", "$RWebCamCheckDimensions", "$RWebCamStoreImageData"], RWebCamPoll: function(c, frame_raw_cb, frame_gl_cb) { - if (RWC.contexts[c].debug) console.log("RWebCamPoll", c, ENVIRONMENT_IS_PTHREAD, RWC.contexts[c].rawBuffer, RWC.contexts[c].running); + if (RWC.contexts[c].debug) console.log("RWebCamPoll", c, RWC.contexts[c].proxied, RWC.contexts[c].rawBuffer, RWC.contexts[c].running); if (!RWC.contexts[c].running) return 0; /* need more checks in RA */ var ret = 0; - if ((RWC.contexts[c].rawFb && frame_raw_cb !== 0) || ENVIRONMENT_IS_PTHREAD) { + if ((RWC.contexts[c].rawFb && frame_raw_cb !== 0) || RWC.contexts[c].proxied) { if (!RWC.contexts[c].rawBuffer) { - if (ENVIRONMENT_IS_PTHREAD) { + if (RWC.contexts[c].proxied) { /* pull dimensions into this thread */ var dimensions = _malloc(8); var res = RWebCamStoreDimensions(c, dimensions); /* also checks ready(c) */ @@ -241,7 +243,7 @@ var LibraryRWebCam = { if (RWC.contexts[c].glTexId !== 0 && frame_gl_cb !== 0) { var imageSrcGL; - if (ENVIRONMENT_IS_PTHREAD) { + if (RWC.contexts[c].proxied) { imageSrcGL = HEAPU8.subarray(RWC.contexts[c].rawBuffer + 1, RWC.contexts[c].rawBuffer + RWC.contexts[c].length + 1); } else { if (!RWebCamReady(c)) return 0; @@ -252,13 +254,13 @@ var LibraryRWebCam = { var prev = {{{ makeGetValue('RWC.tmp', 0, 'i32') }}}; _glBindTexture(0x0DE1 /* GL_TEXTURE_2D */, RWC.contexts[c].glTexId); if (RWC.contexts[c].glFirstFrame) { - if (ENVIRONMENT_IS_PTHREAD) + if (RWC.contexts[c].proxied) Module.ctx.texImage2D(Module.ctx.TEXTURE_2D, 0, Module.ctx.RGBA, RWC.contexts[c].width, RWC.contexts[c].height, 0, Module.ctx.RGBA, Module.ctx.UNSIGNED_BYTE, imageSrcGL); else Module.ctx.texImage2D(Module.ctx.TEXTURE_2D, 0, Module.ctx.RGB, Module.ctx.RGB, Module.ctx.UNSIGNED_BYTE, imageSrcGL); RWC.contexts[c].glFirstFrame = false; } else { - if (ENVIRONMENT_IS_PTHREAD) + if (RWC.contexts[c].proxied) Module.ctx.texSubImage2D(Module.ctx.TEXTURE_2D, 0, 0, 0, RWC.contexts[c].width, RWC.contexts[c].height, Module.ctx.RGBA, Module.ctx.UNSIGNED_BYTE, imageSrcGL); else Module.ctx.texSubImage2D(Module.ctx.TEXTURE_2D, 0, 0, 0, Module.ctx.RGB, Module.ctx.UNSIGNED_BYTE, imageSrcGL); From 45e13e3f2d2d3f9570fed588edb6ba316bee97ca Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 11 May 2025 00:17:21 +0000 Subject: [PATCH 067/175] Fetch translations from Crowdin --- intl/msg_hash_be.h | 4 ++++ intl/msg_hash_ca.h | 40 ++++++++++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_be.h b/intl/msg_hash_be.h index 3eeed0ac94..35dc3d7930 100644 --- a/intl/msg_hash_be.h +++ b/intl/msg_hash_be.h @@ -15941,4 +15941,8 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_GAME_AI, "Паказваць 'Гульнявы ШІ'" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_GAME_AI, + "Паказваць опцыю 'Гульнявы ШІ'." + ) #endif diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 4d3cfd1f43..fcea76d047 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -2350,6 +2350,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_AUTO, "La freqüència d'actualització precisa estimada de la pantalla en Hz." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_REFRESH_RATE_AUTO, + "La freqüència exacta d'actualització del teu monitor (en Hz). Serveix per calcular la freqüència d'entrada d'àudio com:\nfreqüència d'entrada d'àudio = velocitat entrada del joc * freqüència d'actualització del monitor/freqüència d'actualització del joc.\nSi el nucli no indica un valor, s'assumeix el format NTSC per motius de compatibilitat.\nAquest valor serà similar a 60 Hz per evitar canvis en el to. Si el teu monitor no és compatible amb 60 Hz, desactiva la sincronia vertica[...]" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_POLLED, "Estableix la freqüència d'actualització notificada per la pantalla" @@ -3196,6 +3200,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MIDI_OUTPUT, "Seleccioneu el dispositiu de sortida." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_MIDI_OUTPUT, + "Escull el dispositiu de sortida (específic del controlador). La sortida de so MIDI es desactivarà si aquesta opció està desactivada. També es pot introduir el nom del dispositiu manualment.\nSi s'activa la sortida MIDI i el nucli/joc/aplicació son compatibles amb la sortida MIDI, alguns o tots els sons es generaran pel dispositiu MIDI. Si es selecciona un controlador MIDI 'null', aquests sons no es reproduiran." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MIDI_VOLUME, "Volum" @@ -3329,6 +3337,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_POLL_TYPE_BEHAVIOR, "Afecta com RetroArch realitza el sondeig d'entrada. Depenent de la vostra configuració, establir-ho a 'Prest' o 'Tard' pot significar menys latència." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_INPUT_POLL_TYPE_BEHAVIOR, + "Influeix en la forma de testejar el senyal d'entrada a RetroArch.\nPrimerenc: El test es fa abans de processar el fotograma.\nNormal: El test es fa quan es sol·liciti.\nTardà: el test es fa després de la primera petició de l'estat d'entrada de cada fotograma.\nSi es selecciona Primerenc o Tardà, es pot reduir la latència. Aquesta configuració no tindrà efecte durant una sessió de joc en xarxa." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, "Re-mapeja els controls d'aquest nucli" @@ -3735,6 +3747,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, "Activa Dreceres de Teclat" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_ENABLE_HOTKEY, + "Si la tecla per activar tecles ràpides està assignada, és necessari mantenir-la clicada abans de clicar qualsevol altra tecla ràpida. Això permet assignar botons dels controladors a funcions de tecles ràpides sense influenciar a les entrades normals. Si s'assigna la tecla a un sol comandament, aquest comandament no serà imprescindible per les tecles ràpides del teclat." + ) MSG_HASH( MENU_ENUM_LABEL_HELP_ENABLE_HOTKEY, "Si aquesta tecla ràpida està assignada a un teclat, un botó o l'eix d'un controlador, la resta de tecles ràpides es desactivaran a no ser que aquesta tecla sigui clicada al mateix temps.\nAixò serveix per implementacions centrades en RETRO_KEYBOARD, que fan servir una gran part del teclat i en les que no vols que les tecles ràpides interfereixin amb el funcionament normal." @@ -7622,6 +7638,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_CHECK_FRAMES, "La freqüència (en fotogrames) amb la qual es comprovarà que l’amfitrió i el client estan sincronitzats." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_NETPLAY_CHECK_FRAMES, + "Indica la freqüència (en fotogrames) amb el que el servidor del joc en xarxa verificarà la sincronia entre els clients. Aquest valor no tindrà efectes visibles en gran part dels nuclis i pot ser ignorat. En nuclis no deterministes determinarà l'interval de temps per sincronitzar entre clients. En nuclis amb errors, pot produir errors greus en el rendiment si el valor és diferent de 0. Selecciona 0 per no haver de fer comprovacions. Aquest valor només el fa servir el servidor del joc en xa[...]" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_MIN, "Fotogrames de latència d'entrada" @@ -7642,6 +7662,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, "El rang de fotogrames de latència d’entrada que es poden fer servir per amagar la latència de la xarxa. Redueix la fluctuació de senyal i l’ús de CPU del joc en línia a canvi d’una latència d’entrada imprevisible." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, + "El rang de fotogrames de retard d'entrada que pot utilitzar el joc en xarxa per amagar la latència de la xarxa.\nSi aquesta opció està activada, el joc en xarxa ajustarà dinàmicament el nombre de fotogrames de retard d'entrada per equilibrar l'ús de la CPU; el retard d'entrada i latència de xarxa. Redueix les distorsions visuals i el consum de la CPU, però genera un retard entre les entrades/controladors." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_NAT_TRAVERSAL, "Camí del NAT del joc en xarxa" @@ -9906,6 +9930,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SHADER_APPLY_CHANGES, "Els canvis de la configuració de shaders tindran efecte immediat. Fes servir aquesta opció en canviar la quantitat de passades, filtrat,..." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SHADER_APPLY_CHANGES, + "Després de canviar la configuració de shaders (com el nombre de passades, el filtratge, l'escala...) pots fer servir aquesta opció per aplicar els canvis.\nCanviar aquesta configuració és una opció que consumeix molts recursos, així que cal fer-la de forma explícita.\nEn aplicar els shaders, es desarà la configuració del menú en un fitxer temporal(retroarch.slangp/.cgp/.glslp) i es carregaran. El fitxer no s'eliminarà en tancar RetroArch i es desarà a la carpeta de shaders." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Paràmetres del shader" @@ -9942,6 +9970,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SCALE, "Escala" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SCALE_PASS, + "Ajusta l'escala per aquesta passada. El factor d'escala és acumulatiu, per exemple: 2x per a la primera passada i 2x per a la segona serà una escala global de 4x.\nSi l'última passada té un factor d'escala, el resultat final estirarà per tota la pantalla amb el filtre predeterminat segons la configuració del filtre bilineal (en la configuració de vídeo).\nSi has escollit 'Irellevant', es farà servir l'escala 1x o bé s'estirarà a pantalla completa, en funció de si és l'última passad[...]" + ) /* Quick Menu > Shaders > Save */ @@ -11643,6 +11675,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_OZONE_SCROLL_CONTENT_METADATA, "Mostra metadades de continguts en moviment" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OZONE_SCROLL_CONTENT_METADATA, + "Si actives aquesta opció, cadascun dels elements de les metadades d'un contingut que es mostren a la part dreta de les llistes de reproducció (nucli associat, temps de joc,...) ocuparà una única fila, i el text que superi l'amplada disponible, es desplaçarà lateralment automàticament. Si desactives aquesta opció, cada element de les metadades es mostrarà de forma estàtica, ocupant les línies que facin falta." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OZONE_THUMBNAIL_SCALE_FACTOR, "Factor d’escala de les miniatures" @@ -15320,6 +15356,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_GAMEMODE_ENABLE_LINUX, "Pot millorar el rendiment, reduir la latència i arreglar problemes d’àudio crepitant. Necessitareu https://github.com/FeralInteractive/gamemode perquè funcioni." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_GAMEMODE_ENABLE, + "Activar del mode de joc de Linux pot millorar la latència, corregir errors en l'àudio i maximitzar el rendiment general configurat automàticament la teva CPU i la teva GPU per optimitzar el seu rendiment.\nCal tenir instal·lat el programari GameMode perquè aquesta opció funcioni. Si necessites més informació sobre GameMode, visita la pàgina https://github.com/FeralInteractive/gamemode." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PAL60_ENABLE, "Usa el mode PAL60" diff --git a/intl/progress.h b/intl/progress.h index 02fe3c3808..7bbba67632 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 97 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ From 874cc00c2e3c1575eb7aacf71281bf68ba419b87 Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Sun, 11 May 2025 11:49:00 -0400 Subject: [PATCH 068/175] macos: fix app store packaging --- pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj index 9c8792c1a4..1d296472c4 100644 --- a/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj @@ -1618,7 +1618,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd \"$SRCBASE\"\nif [ -f \".git_version.h\" ] ; then\n cp .git_version.h ${DERIVED_FILE_DIR}/git_version.h\nelse\n echo '#define GIT_VERSION ' $(git rev-parse --short HEAD) > ${DERIVED_FILE_DIR}/git_version.h\nfi\n"; + shellScript = "cd \"$SRCBASE\"\nif [ -f \".git_version.h\" ] ; then\n cp .git_version.h \"${DERIVED_FILE_DIR}\"/git_version.h\nelse\n echo '#define GIT_VERSION ' $(git rev-parse --short HEAD) > \"${DERIVED_FILE_DIR}\"/git_version.h\nfi\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ From 5e03ef57eca1bb2d3053c7b2b0ac98d62dd0b342 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Sun, 11 May 2025 21:22:32 +0300 Subject: [PATCH 069/175] Ozone+XMB: Fix content icons when playlist tabs hidden (#17888) --- menu/drivers/ozone.c | 28 ++++++++++++++++++++-------- menu/drivers/xmb.c | 17 +++++++++++++---- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index e263fbd5d2..bb4c099a43 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -640,6 +640,7 @@ struct ozone_handle char thumbnails_right_status_prev; bool show_thumbnail_bar; + bool show_playlist_tabs; bool sidebar_collapsed; struct @@ -2906,11 +2907,14 @@ static void ozone_sidebar_collapse_end(void *userdata) static unsigned ozone_get_sidebar_height(ozone_handle_t *ozone) { - int entries = (int)(ozone->system_tab_end + 1 + (ozone->horizontal_list.size)); + unsigned horizontal_list_size = (ozone->show_playlist_tabs) + ? (unsigned)ozone->horizontal_list.size + : 0; + int entries = (int)(ozone->system_tab_end + 1 + horizontal_list_size); return entries * ozone->dimensions.sidebar_entry_height + (entries - 1) * ozone->dimensions.sidebar_entry_padding_vertical + ozone->dimensions.sidebar_padding_vertical - + (ozone->horizontal_list.size > 0 + + (horizontal_list_size > 0 ? ozone->dimensions.sidebar_entry_padding_vertical + ozone->dimensions.spacer_1px : 0); } @@ -3358,7 +3362,9 @@ static void ozone_draw_sidebar( ticker.spacer = ticker_spacer; } - horizontal_list_size = (unsigned)ozone->horizontal_list.size; + horizontal_list_size = (ozone->show_playlist_tabs) + ? (unsigned)ozone->horizontal_list.size + : 0; if (p_disp->dispctx && p_disp->dispctx->scissor_begin) gfx_display_scissor_begin( @@ -4844,7 +4850,6 @@ static void ozone_init_horizontal_list(ozone_handle_t *ozone, settings_t *settin size_t i, list_size; menu_displaylist_info_t info; const char *dir_playlist = settings->paths.directory_playlist; - bool menu_content_show_playlists = settings->bools.menu_content_show_playlist_tabs; bool ozone_truncate_playlist_name = settings->bools.ozone_truncate_playlist_name; bool ozone_sort_after_truncate = settings->bools.ozone_sort_after_truncate_playlist_name; @@ -4857,7 +4862,7 @@ static void ozone_init_horizontal_list(ozone_handle_t *ozone, settings_t *settin info.type_default = FILE_TYPE_PLAIN; info.enum_idx = MENU_ENUM_LABEL_PLAYLISTS_TAB; - if (menu_content_show_playlists && !string_is_empty(info.path)) + if (!string_is_empty(info.path)) { if (menu_displaylist_ctl(DISPLAYLIST_DATABASE_PLAYLISTS_HORIZONTAL, &info, settings)) menu_displaylist_process(&info); @@ -8086,7 +8091,9 @@ static enum menu_action ozone_parse_menu_entry_action( gfx_thumbnail_set_stream_delay(ozone->thumbnails.stream_delay); } - horizontal_list_size = (unsigned)ozone->horizontal_list.size; + horizontal_list_size = (ozone->show_playlist_tabs) + ? (unsigned)ozone->horizontal_list.size + : 0; if (menu_input_dialog_get_display_kb()) ozone->flags |= OZONE_FLAG_MSGBOX_STATE; @@ -10141,7 +10148,9 @@ static void ozone_render(void *data, bool first_entry_found = false; bool last_entry_found = false; - unsigned horizontal_list_size = (unsigned)ozone->horizontal_list.size; + unsigned horizontal_list_size = (ozone->show_playlist_tabs) + ? (unsigned)ozone->horizontal_list.size + : 0; float category_height = ozone->dimensions.sidebar_entry_height + ozone->dimensions.sidebar_entry_padding_vertical; bool first_category_found = false; @@ -12175,6 +12184,7 @@ static void ozone_populate_entries( const char *label, unsigned k) { + settings_t *settings = config_get_ptr(); int new_depth = 0; bool was_db_manager_list = false; bool want_thumbnail_bar = false; @@ -12182,12 +12192,14 @@ static void ozone_populate_entries( bool animate = false; struct menu_state *menu_st = menu_state_get_ptr(); menu_list_t *menu_list = menu_st->entries.list; - bool ozone_collapse_sidebar = config_get_ptr()->bools.ozone_collapse_sidebar; + bool ozone_collapse_sidebar = settings->bools.ozone_collapse_sidebar; ozone_handle_t *ozone = (ozone_handle_t*) data; if (!ozone) return; + ozone->show_playlist_tabs = settings->bools.menu_content_show_playlist_tabs; + if ((menu_st->flags & MENU_ST_FLAG_PREVENT_POPULATE) > 0) { menu_st->flags &= ~MENU_ST_FLAG_PREVENT_POPULATE; diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 8caf4db591..7315c901a6 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -451,6 +451,7 @@ typedef struct xmb_handle bool show_thumbnails; bool show_mouse; bool show_screensaver; + bool show_playlist_tabs; bool use_ps3_layout; bool last_use_ps3_layout; bool assets_missing; @@ -2634,7 +2635,6 @@ static void xmb_init_horizontal_list(xmb_handle_t *xmb) menu_displaylist_info_t info; settings_t *settings = config_get_ptr(); const char *dir_playlist = settings->paths.directory_playlist; - bool menu_content_show_playlists = settings->bools.menu_content_show_playlist_tabs; bool truncate_playlist_name = settings->bools.ozone_truncate_playlist_name; bool sort_after_truncate = settings->bools.ozone_sort_after_truncate_playlist_name; @@ -2647,7 +2647,7 @@ static void xmb_init_horizontal_list(xmb_handle_t *xmb) info.type_default = FILE_TYPE_PLAIN; info.enum_idx = MENU_ENUM_LABEL_PLAYLISTS_TAB; - if (menu_content_show_playlists && !string_is_empty(info.path)) + if (!string_is_empty(info.path)) { size_t i; @@ -3008,6 +3008,8 @@ static void xmb_populate_entries(void *data, if (!xmb) return; + xmb->show_playlist_tabs = settings->bools.menu_content_show_playlist_tabs; + xmb->skip_thumbnail_reset = false; if (xmb->is_quick_menu && depth < xmb->old_depth) xmb->skip_thumbnail_reset = true; @@ -7779,7 +7781,11 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) /* Horizontal tab icons */ if (!xmb->assets_missing) { - for (i = 0; i <= xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) + xmb->system_tab_end; i++) + unsigned horizontal_list_size = (xmb->show_playlist_tabs) + ? (unsigned)xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) + : 0; + + for (i = 0; i <= xmb->system_tab_end + horizontal_list_size; i++) { xmb_node_t *node = xmb_get_node(xmb, i); @@ -8965,6 +8971,9 @@ static void xmb_list_cache(void *data, enum menu_list_type type, file_list_t *menu_stack = MENU_LIST_GET(menu_list, 0); file_list_t *selection_buf = MENU_LIST_GET_SELECTION(menu_list, 0); size_t selection = menu_st->selection_ptr; + unsigned horizontal_list_size = (xmb->show_playlist_tabs) + ? (unsigned)xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) + : 0; if (!xmb) return; @@ -8996,7 +9005,7 @@ static void xmb_list_cache(void *data, enum menu_list_type type, else xmb->selection_ptr_old = selection; - list_size = xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) + xmb->system_tab_end; + list_size = xmb->system_tab_end + horizontal_list_size; switch (type) { From 1b61b88274e5cab63bd6fd27a0bcf9dbe41b8b38 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Sun, 11 May 2025 22:18:44 +0300 Subject: [PATCH 070/175] Refine menu info+search disable buttons (#17889) --- intl/msg_hash_us.h | 4 ++-- menu/cbs/menu_cbs_info.c | 3 +++ menu/menu_driver.c | 14 ++++---------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 7d766fc49d..23af5c5e6b 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3762,7 +3762,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "If enabled Info button presses will be ignored." + "If enabled Info function will be disabled." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, @@ -3770,7 +3770,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "If enabled Search button presses will be ignored." + "If enabled Search function will be disabled." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, diff --git a/menu/cbs/menu_cbs_info.c b/menu/cbs/menu_cbs_info.c index 8a84539f96..32575559f1 100644 --- a/menu/cbs/menu_cbs_info.c +++ b/menu/cbs/menu_cbs_info.c @@ -42,6 +42,9 @@ static int action_info_default(unsigned type, const char *label) bool audio_enable_menu_notice = settings->bools.audio_enable_menu_notice; #endif + if (settings->bools.menu_disable_info_button) + goto error; + menu_displaylist_info_init(&info); info.list = menu_stack; diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 7a2c823277..59c4820ee6 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -5629,19 +5629,13 @@ unsigned menu_event( else if (BIT256_GET_PTR(p_trigger_input, menu_cancel_btn)) ret = MENU_ACTION_CANCEL; else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_X)) - { - if (!settings->bools.menu_disable_search_button) - ret = MENU_ACTION_SEARCH; - } + ret = MENU_ACTION_SEARCH; else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_Y)) ret = MENU_ACTION_SCAN; else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) ret = MENU_ACTION_START; else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) - { - if (!settings->bools.menu_disable_info_button) - ret = MENU_ACTION_INFO; - } + ret = MENU_ACTION_INFO; else if (BIT256_GET_PTR(p_trigger_input, RARCH_MENU_TOGGLE)) ret = MENU_ACTION_TOGGLE; @@ -7911,8 +7905,8 @@ bool menu_driver_iterate( bool menu_input_dialog_start_search(void) { input_driver_state_t *input_st = input_state_get_ptr(); -#ifdef HAVE_ACCESSIBILITY settings_t *settings = config_get_ptr(); +#ifdef HAVE_ACCESSIBILITY bool accessibility_enable = settings->bools.accessibility_enable; unsigned accessibility_narrator_speech_speed = settings->uints.accessibility_narrator_speech_speed; access_state_t *access_st = access_state_get_ptr(); @@ -7920,7 +7914,7 @@ bool menu_input_dialog_start_search(void) struct menu_state *menu_st = &menu_driver_state; menu_handle_t *menu = menu_st->driver_data; - if (!menu) + if (!menu || settings->bools.menu_disable_search_button) return false; #ifdef HAVE_MIST From 6ade3191376bfd9a6c3e3f62c5cdbf598f02bbe5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 12 May 2025 00:17:23 +0000 Subject: [PATCH 071/175] Fetch translations from Crowdin --- intl/msg_hash_be.h | 8 ----- intl/msg_hash_ca.h | 8 ----- intl/msg_hash_chs.h | 8 ----- intl/msg_hash_cht.h | 8 ----- intl/msg_hash_cs.h | 8 ----- intl/msg_hash_de.h | 8 ----- intl/msg_hash_en.h | 8 ----- intl/msg_hash_es.h | 8 ----- intl/msg_hash_fa.h | 8 ----- intl/msg_hash_fi.h | 8 ----- intl/msg_hash_fr.h | 4 +-- intl/msg_hash_gl.h | 8 ----- intl/msg_hash_hu.h | 8 ----- intl/msg_hash_it.h | 8 ----- intl/msg_hash_ja.h | 8 ----- intl/msg_hash_ko.h | 8 ----- intl/msg_hash_nl.h | 8 ----- intl/msg_hash_pl.h | 8 ----- intl/msg_hash_pt_br.h | 8 ----- intl/msg_hash_ru.h | 8 ----- intl/msg_hash_sv.h | 68 ++++++++++++++++++++++++++++++++++++++----- intl/msg_hash_tr.h | 4 +-- intl/msg_hash_uk.h | 8 ----- intl/progress.h | 8 ++--- 24 files changed, 68 insertions(+), 176 deletions(-) diff --git a/intl/msg_hash_be.h b/intl/msg_hash_be.h index 35dc3d7930..a4b10b038b 100644 --- a/intl/msg_hash_be.h +++ b/intl/msg_hash_be.h @@ -3648,18 +3648,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Адключэнне кнопкі даведкі" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Калі ўключана, націсканні кнопкі даведкі будуць ігнаравацца." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Адключэнне кнопкі пошуку" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Калі ўключана, націсканні кнопкі пошуку будуць ігнаравацца." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Адключыць левы аналагавы стык у меню" diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index fcea76d047..d14716ccd1 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -3688,18 +3688,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Inhabilita el botó d’informació" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Si s’activa s’ignoraran les pulsacions del botó d’informació." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Inhabilita el botó de cerca" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Si s’activa s’ignoraran les pulsacions del botó de cerca." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Deshabilita analògic esquerre en el menú" diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index adf282d0d8..5286f1f058 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -3520,18 +3520,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "禁用信息按钮" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "如果启用信息按钮按下将被忽略。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "禁用搜索按钮" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "如果启用搜索按钮按键将被忽略。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "对调菜单中的「确定」键和「取消」键" diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index e6a4a90cd6..ddc4e9e68f 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -3488,18 +3488,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "禁用資訊按鍵" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "開啟時選單的資訊按鍵失效。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "禁用搜尋按鍵" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "開啟時選單的搜尋按鍵失效。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "選單禁用左類比搖桿" diff --git a/intl/msg_hash_cs.h b/intl/msg_hash_cs.h index 35a8c47179..f7be5e469d 100644 --- a/intl/msg_hash_cs.h +++ b/intl/msg_hash_cs.h @@ -3628,18 +3628,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Zakázat info tlačítko" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Pokud je povoleno, stisknutí tlačítka Info bude ignorováno." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Zakázat tlačítko hledat" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Pokud je povoleno, budou stisknutí tlačítka Hledat ignorována." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Zakázat levý analog v menu" diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 9739f24c9d..eaac384afc 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -3600,18 +3600,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Info-Taste deaktivieren" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Wenn aktiviert, wird die Info-Taste ignoriert." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Suchen-Taste deaktivieren" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Wenn aktiviert, wird die Suchen-Taste ignoriert." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Linken Analogstick für Menü deaktivieren" diff --git a/intl/msg_hash_en.h b/intl/msg_hash_en.h index 4a51481d9c..56761872ad 100644 --- a/intl/msg_hash_en.h +++ b/intl/msg_hash_en.h @@ -540,14 +540,6 @@ MSG_HASH( /* Settings > Input > Menu Controls */ -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "If enabled, Info button presses will be ignored." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "If enabled, Search button presses will be ignored." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Disable Left Analogue in Menu" diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index cfee409456..bb66627645 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -3696,18 +3696,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Desactivar botón Información" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Al activar esta opción, se ignorarán las pulsaciones del botón Información." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Desactivar botón Buscar" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Al activar esta opción, se ignorarán las pulsaciones del botón Buscar." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Desactivar analógico izquierdo en menús" diff --git a/intl/msg_hash_fa.h b/intl/msg_hash_fa.h index 05a0b68b5d..407180ce8e 100644 --- a/intl/msg_hash_fa.h +++ b/intl/msg_hash_fa.h @@ -2356,18 +2356,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "غیرفعال کردن دکمهٔ اطلاعات" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "اگر فعال باشد، فشرده شدن دکمهٔ اطلاعات نادیده گرفته می‌شود." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "غیرفعال‌سازی دکمهٔ جستجو" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "اگر فعال باشد، فشرده شدن دکمهٔ جستجو نادیده گرفته می‌شود." - ) /* Settings > Input > Hotkeys */ diff --git a/intl/msg_hash_fi.h b/intl/msg_hash_fi.h index 51a8fa8001..84025a750b 100644 --- a/intl/msg_hash_fi.h +++ b/intl/msg_hash_fi.h @@ -3248,18 +3248,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Poista tietopainike käytöstä" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Jos käytössä, tiedot-painikkeen painallukset jätetään huomiotta." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Poista hakupainike käytöstä" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Jos käytössä, hakupainikkeen painallukset jätetään huomiotta." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Vaihda valikon OK- ja Peruuta-painikkeiden sijaintia" diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index b703255a1e..711ea2daab 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -3658,7 +3658,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Si activé, les appuis sur la touche d'informations seront ignorés." + "Si activé, la fonction d'informations sera désactivée." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, @@ -3666,7 +3666,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Si activé, les appuis sur la touche de recherche seront ignorés." + "Si activé, la fonction de recherche sera désactivée." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, diff --git a/intl/msg_hash_gl.h b/intl/msg_hash_gl.h index 817a381447..c1d6d7f858 100644 --- a/intl/msg_hash_gl.h +++ b/intl/msg_hash_gl.h @@ -3652,18 +3652,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Desactivar o botón de información" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Se está activado, ignoraranse as pulsacións do botón Información." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Desactivar o botón de busca" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Se está activado, ignoraranse as pulsacións do botón Buscar." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Desactivar o analóxico esquerdo no menú" diff --git a/intl/msg_hash_hu.h b/intl/msg_hash_hu.h index 947dde3d12..817dcf55a1 100644 --- a/intl/msg_hash_hu.h +++ b/intl/msg_hash_hu.h @@ -3684,18 +3684,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Info gomb kikapcsolása" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Bekapcsolás után az Info gomb megnyomása hatástalan." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Keresés gomb kikapcsolása" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Bekapcsolás után a Keresés gomb megnyomása hatástalan." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "A bal analóg kar letiltása a menüben" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 9cf80f7172..b8f9631e49 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -3624,18 +3624,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Disabilita Pulsante Info" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Se abilitata, i pulsanti Info verranno ignorati." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Disabilita Pulsante Ricerca" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Se abilitata, i pulsanti di ricerca verranno ignorati." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Disabilita l'analogico sinistro nel menu" diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 03e7725d1f..613b2d8e11 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -3520,18 +3520,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "情報ボタンを無効にする" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "有効にすると、情報ボタンの押下が無視されます。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "検索ボタンを無効にする" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "有効にすると、検索ボタンの押下が無視されます。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "決定/キャンセルボタンの入れ替え" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index aee1689648..62866f1ccc 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -3724,18 +3724,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "정보 버튼 사용 안 함" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "정보 버튼 입력을 무시합니다." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "검색 버튼 사용 안 함" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "검색 버튼 입력을 무시합니다." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "메뉴에서 왼쪽 아날로그 비활성화" diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 44a488e05f..18afad2d66 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -2800,18 +2800,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Infoknop uitschakelen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Indien ingeschakeld worden Info-toetsen genegeerd." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Zoekknop uitschakelen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Indien ingeschakeld wordt het indrukken van zoekknoppen genegeerd." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu Wissel OK en Annuleer Knoppen" diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index 2d87ed3deb..1af40d919b 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -3352,18 +3352,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Wyłącz przycisk informacyjny" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Jeśli włączone, naciśnięcia przycisku Informacji będą ignorowane." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Wyłącz przycisk wyszukiwania" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Jeśli włączone, naciśnięcia przycisku wyszukiwania będzie ignorowane." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu zamiany przycisków OK i Anuluj" diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 40622eab6c..5bff6d35ac 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -3396,18 +3396,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Desativar botão de informações" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Caso habilitado, o botão de informações será ignorado ao ser pressionado." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Desativar botão de pesquisa" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Caso habilitado, o botão de pesquisa será ignorado ao ser pressionado." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Inverter botões OK e Cancelar do menu" diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index dd68b5e907..94f7e91064 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -3716,18 +3716,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Отключить кнопку подсказки" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "При включении будут игнорироваться нажатия кнопки вызова подсказки." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Отключить кнопку поиска" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "При включении будут игнорироваться нажатия кнопки поиска." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Отключить левый стик в меню" diff --git a/intl/msg_hash_sv.h b/intl/msg_hash_sv.h index 4d1f15e098..0b80fb85da 100644 --- a/intl/msg_hash_sv.h +++ b/intl/msg_hash_sv.h @@ -1468,6 +1468,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Användare" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Ändra inställningar för integritet, konto och användarnamn." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Katalog" @@ -3476,18 +3480,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Inaktivera info-knapp" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Aktiverad kommer Info-knapp tryckningar att ignoreras." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Inaktivera Sökknapp" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Aktiverad kommer Sök-knapp tryckningar att ignoreras." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Inaktivera vänster analog i meny" @@ -3731,6 +3727,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Slår på/av den för närvarande valda shadern." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Shaders (Håll)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Nästa Shader" @@ -4814,6 +4814,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_RECORD_THREADS, "Inspelnings-trådar" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD, + "Använd inspelning med efterfilter" + ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, "Fånga bilden efter att filter (men inte shaders) har tillämpats. Videon kommer att se lika snygg ut som det du ser på din skärm." @@ -5338,6 +5342,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MEMORY_UPDATE_INTERVAL, "Uppdateringsintervall för minnesanvändning (i bildrutor)" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MEMORY_UPDATE_INTERVAL, + "Minnesanvändningen uppdateras med inställt intervall i bildrutor." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_PING_SHOW, "Visa Netplay Ping" @@ -5370,6 +5378,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_AUTOCONFIG, "Visa ett meddelande på skärmen när spelkontroller ansluts/kopplas från." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_AUTOCONFIG_FAILS, + "Visa ett meddelande på skärmen när inmatningsenheter inte kunde konfigureras." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_REMAP_LOAD, "Notifieringar vid inlästa inmatningsommappningar" @@ -5378,6 +5390,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_REMAP_LOAD, "Visa ett meddelande på skärmen vid inläsning av ommappningsfiler för inmatning." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_CONFIG_OVERRIDE_LOAD, + "Meddelanden vid inläsning av konfigurationsåsidosättning" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_CONFIG_OVERRIDE_LOAD, + "Visa ett meddelande på skärmen vid inläsning av filer för åsidosättning av konfiguration." + ) MSG_HASH( MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_SET_INITIAL_DISK, "Visa ett meddelande på skärmen när du automatiskt återställer den senast använda skivan vid start av flerskivsinnehåll som lästs in via M3U-spellistor." @@ -5980,6 +6000,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Visa 'Utforska'" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, + "Visa alternativ för innehållsutforskare. (Omstart krävs på Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Visa 'Innehållslösa kärnor'" @@ -6498,6 +6522,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "Uppskala automatiskt miniatyrbilder med en bredd/höjd som är mindre än det angivna värdet. Förbättrar bildkvalitén. Har en måttlig inverkan på prestanda." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Miniatyrbildsbakgrunder" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, "Möjliggör utfyllnad av oanvänt utrymme i miniatyrbilder med en solid bakgrund. Detta säkerställer en enhetlig visningsstorlek för alla bilder, vilket förbättrar menyutseendet när du tittar på miniatyrbilder av blandat innehåll med olika basmått." @@ -6807,14 +6835,30 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_PROGRESS_TRACKER, "Visa en indikationer på skärmen när framsteg görs mot vissa prestationer." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_LBOARD_START, + "Meddelanden om starter för topplista" + ) MSG_HASH( MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_LBOARD_START, "Visar en beskrivning av en topplista när den blir aktiv." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_LBOARD_SUBMIT, + "Meddelanden om insändningar för topplista" + ) MSG_HASH( MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_LBOARD_SUBMIT, "Visar ett meddelande med det värde som skickas in när ett topplisteförsök har slutförts." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_LBOARD_CANCEL, + "Meddelanden om misslyckanden för topplista" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VISIBILITY_LBOARD_CANCEL, + "Visar ett meddelande när ett topplisteförsök misslyckas." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VISIBILITY_ACCOUNT, "Inloggningsmeddelande" @@ -6918,6 +6962,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_PASSWORD, "Lösenordet som används av klienter för att ansluta till värden." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATE_PASSWORD, + "Serverlösenord för endast åskådare" + ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_SPECTATE_PASSWORD, "Lösenordet som används av klienter för att ansluta till värden som en åskådare." @@ -10564,6 +10612,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Visar en sekundär miniatyrbild när du använder miniatyrvisningslägen av typen 'Lista'. Den här inställningen gäller endast när skärmen har tillräcklig fysisk bredd för att visa två miniatyrer." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, + "Miniatyrbildsbakgrunder" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "Möjliggör utfyllnad av oanvänt utrymme i miniatyrbilder med en solid bakgrund. Detta säkerställer en enhetlig visningsstorlek för alla bilder, vilket förbättrar menyutseendet när du tittar på miniatyrbilder av blandat innehåll med olika basmått." diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 887fc56f7e..1d4f95656c 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -3698,7 +3698,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Etkinleştirilirse, bilgi düğmesine tıklamak dikkate alınmaz." + "Etkinleştirilirse Bilgi fonksiyonu devre dışı bırakılır." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, @@ -3706,7 +3706,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Etkinleştirilirse, arama düğmesine tıklamak dikkate alınmaz." + "Etkinleştirilirse Arama fonksiyonu devre dışı bırakılır." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index 292c005d3b..599ccbfa66 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -3708,18 +3708,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Вимкнути кнопку «Інформація»" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Якщо буде увімкнено, натискання кнопки \"Інформація\" буде проігноровано." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Вимкнути кнопку «Пошук»" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Якщо буде увімкнено, натискання кнопки \"Пошук\" буде проігноровано." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Вимкніть лівий аналоговий сигнал у меню" diff --git a/intl/progress.h b/intl/progress.h index 7bbba67632..ede87d4a06 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -31,7 +31,7 @@ #define LANGUAGE_PROGRESS_DANISH_APPROVED 0 /* German */ -#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_GERMAN_APPROVED 13 /* Greek */ @@ -47,7 +47,7 @@ #define LANGUAGE_PROGRESS_ESPERANTO_APPROVED 0 /* Spanish */ -#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 99 #define LANGUAGE_PROGRESS_SPANISH_APPROVED 91 /* Persian */ @@ -143,7 +143,7 @@ #define LANGUAGE_PROGRESS_TATAR_APPROVED 0 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ From 2f1ae73dd485dbb0dcb283ff907ee17c2d06a667 Mon Sep 17 00:00:00 2001 From: Davide Andreoli Date: Wed, 16 Apr 2025 17:59:51 +0200 Subject: [PATCH 072/175] feat: added iCloud Drive Cloud Sync --- griffin/griffin_objc.m | 4 + network/cloud_sync/icloud_drive.m | 153 ++++++++++++++++++++++++++++++ network/cloud_sync_driver.c | 3 + network/cloud_sync_driver.h | 3 + 4 files changed, 163 insertions(+) create mode 100644 network/cloud_sync/icloud_drive.m diff --git a/griffin/griffin_objc.m b/griffin/griffin_objc.m index c670919e65..7f73f6aa0d 100644 --- a/griffin/griffin_objc.m +++ b/griffin/griffin_objc.m @@ -85,3 +85,7 @@ #if defined(HAVE_CLOUDSYNC) && defined(HAVE_ICLOUD) #include "../network/cloud_sync/icloud.m" #endif + +#if defined(HAVE_CLOUDSYNC) && defined(HAVE_ICLOUD_DRIVE) +#include "../network/cloud_sync/icloud_drive.m" +#endif diff --git a/network/cloud_sync/icloud_drive.m b/network/cloud_sync/icloud_drive.m new file mode 100644 index 0000000000..2220316ec5 --- /dev/null +++ b/network/cloud_sync/icloud_drive.m @@ -0,0 +1,153 @@ +#include "../cloud_sync_driver.h" +#include "../../verbosity.h" + +#define ICLOUD_CONTAINER_NAME @"iCloud.com.libretro.dist.RetroArch" +#define DOCUMENTS_BASE_FOLDER @"Documents" + +static NSURL *icloud_base_url(void) +{ + NSURL *base_url = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:ICLOUD_CONTAINER_NAME]; + return [base_url URLByAppendingPathComponent: DOCUMENTS_BASE_FOLDER]; +} + +static NSURL *icloud_file_url(const char *path) +{ + NSURL *base = icloud_base_url(); + if (!base) + return nil; + + NSString *relative_path = [NSString stringWithUTF8String:path]; + return [base URLByAppendingPathComponent:relative_path]; +} + +static bool icloud_drive_sync_begin(cloud_sync_complete_handler_t cb, void *user_data) +{ + BOOL available = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:ICLOUD_CONTAINER_NAME] != nil; + cb(user_data, NULL, available, NULL); + return true; +} + +static bool icloud_drive_sync_end(cloud_sync_complete_handler_t cb, void *user_data) +{ + cb(user_data, NULL, true, NULL); + return true; +} + +static bool icloud_drive_read(const char *p, const char *f, cloud_sync_complete_handler_t cb, void *user_data) +{ + char *path = strdup(p); + char *file = strdup(f); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{ + NSURL *url = icloud_file_url(path); + + BOOL is_cloud_file_present = [[NSFileManager defaultManager] fileExistsAtPath: url.path]; + if (is_cloud_file_present) + { + NSData *data = [NSData dataWithContentsOfURL:url]; + if (!data) { + RARCH_DBG("[iCloudDrive] Could not retrieve data for %s \n", path); + cb(user_data, path, false, NULL); + } + + RFILE *rfile = filestream_open(file, RETRO_VFS_FILE_ACCESS_READ_WRITE, RETRO_VFS_FILE_ACCESS_HINT_NONE); + + if (rfile) + { + filestream_truncate(rfile, 0); + filestream_write(rfile, [data bytes], [data length]); + filestream_seek(rfile, 0, SEEK_SET); + + cb(user_data, path, true, rfile); + } + else + { + RARCH_DBG("[iCloudDrive] Could not create RFILE for %s \n", path); + } + } + else + { + RARCH_DBG("[iCloudDrive] File %s is not present\n", path); + cb(user_data, path, true, NULL); + } + + free(path); + free(file); + }); + return true; +} + + +static bool icloud_drive_update(const char *p, RFILE *rfile, cloud_sync_complete_handler_t cb, void *user_data) +{ + char *path = strdup(p); + NSURL *url = icloud_file_url(path); + NSURL *directory_url = [url URLByDeletingLastPathComponent]; + + NSString *file_string = [NSString stringWithUTF8String:filestream_get_path(rfile)]; + NSData *local_data = [NSData dataWithContentsOfFile:file_string]; + + if (!local_data) + { + RARCH_DBG("[iCloudDrive] Failed to read local file: %s\n", [file_string UTF8String]); + cb(user_data, path, false, rfile); + } + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{ + NSError *error = nil; + NSError *directory_error = nil; + BOOL directory_is_present = [[NSFileManager defaultManager] fileExistsAtPath: directory_url.path]; + + if (!directory_is_present) + { + [[NSFileManager defaultManager] createDirectoryAtPath:directory_url.path withIntermediateDirectories:YES attributes:nil error:&directory_error]; + if (directory_error) + { + RARCH_DBG("[iCloudDrive] Failed to create directory: %s\n", [[directory_error debugDescription] UTF8String]); + } + } + + [local_data writeToURL:url options:NSDataWritingAtomic error:&error]; + RARCH_DBG("[iCloudDrive] %s writing to %s\n", error == nil ? "succeeded" : "failed", [url.absoluteString UTF8String]); + + if (error) + { + RARCH_DBG("[iCloudDrive] error: %s\n", [[error debugDescription] UTF8String]); + } + + cb(user_data, path, error == nil, rfile); + free(path); + }); + + return true; +} + +static bool icloud_drive_delete(const char *p, cloud_sync_complete_handler_t cb, void *user_data) +{ + NSString *path_string = [NSString stringWithUTF8String:p]; + NSURL *url = icloud_file_url(p); + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{ + NSError *error = nil; + if ([[NSFileManager defaultManager] fileExistsAtPath:url.path]) + { + [[NSFileManager defaultManager] removeItemAtURL:url error:&error]; + RARCH_DBG("[iCloudDrive] delete %s %s\n", p, error == nil ? "succeeded" : "failed"); + if (error) + { + RARCH_DBG("[iCloudDrive] error: %s\n", [[error debugDescription] UTF8String]); + } + } + cb(user_data, [path_string UTF8String], error == nil, NULL); + }); + return true; +} + +cloud_sync_driver_t cloud_sync_icloud_drive = { + icloud_drive_sync_begin, + icloud_drive_sync_end, + icloud_drive_read, + icloud_drive_update, + icloud_drive_delete, + "icloud_drive" /* ident */ +}; \ No newline at end of file diff --git a/network/cloud_sync_driver.c b/network/cloud_sync_driver.c index 26657ca7a1..4395442d69 100644 --- a/network/cloud_sync_driver.c +++ b/network/cloud_sync_driver.c @@ -30,6 +30,9 @@ const cloud_sync_driver_t *cloud_sync_drivers[] = { &cloud_sync_webdav, #ifdef HAVE_ICLOUD &cloud_sync_icloud, +#endif +#ifdef HAVE_ICLOUD_DRIVE + &cloud_sync_icloud_drive, #endif &cloud_sync_null, NULL diff --git a/network/cloud_sync_driver.h b/network/cloud_sync_driver.h index e55ae51baa..3bec54ca71 100644 --- a/network/cloud_sync_driver.h +++ b/network/cloud_sync_driver.h @@ -52,6 +52,9 @@ extern cloud_sync_driver_t cloud_sync_webdav; #ifdef HAVE_ICLOUD extern cloud_sync_driver_t cloud_sync_icloud; #endif +#ifdef HAVE_ICLOUD_DRIVE +extern cloud_sync_driver_t cloud_sync_icloud_drive; +#endif extern const cloud_sync_driver_t *cloud_sync_drivers[]; From 906c0be94631e0c05e0f4e29e5184badd1ded086 Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Mon, 12 May 2025 08:54:24 -0400 Subject: [PATCH 073/175] macos/ios: Enable icloud_drive cloud sync backend --- pkg/apple/AppStore.xcconfig | 1 + pkg/apple/GitLabCI.xcconfig | 2 +- pkg/apple/RetroArchAppStore.entitlements | 5 +++++ pkg/apple/RetroArchCI.entitlements | 5 +++++ pkg/apple/iOS/AppStore.xcconfig | 1 + 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/pkg/apple/AppStore.xcconfig b/pkg/apple/AppStore.xcconfig index e48d0c547c..b1befb8510 100644 --- a/pkg/apple/AppStore.xcconfig +++ b/pkg/apple/AppStore.xcconfig @@ -6,6 +6,7 @@ OTHER_CFLAGS = $(inherited) -DHAVE_APPLE_STORE OTHER_CFLAGS = $(inherited) -DHAVE_ICLOUD +OTHER_CFLAGS = $(inherited) -DHAVE_ICLOUD_DRIVE OTHER_CFLAGS = $(inherited) -DHAVE_MAIN OTHER_CFLAGS = $(inherited) -DHAVE_ONLINE_UPDATER diff --git a/pkg/apple/GitLabCI.xcconfig b/pkg/apple/GitLabCI.xcconfig index 5d7c39ea4a..3ccee9359e 100644 --- a/pkg/apple/GitLabCI.xcconfig +++ b/pkg/apple/GitLabCI.xcconfig @@ -9,5 +9,5 @@ #include "Metal.xcconfig" DEVELOPMENT_TEAM=UK699V5ZS8 -OTHER_CFLAGS = $(inherited) -DHAVE_ICLOUD +OTHER_CFLAGS = $(inherited) -DHAVE_ICLOUD -DHAVE_ICLOUD_DRIVE CODE_SIGN_ENTITLEMENTS = RetroArchCI.entitlements diff --git a/pkg/apple/RetroArchAppStore.entitlements b/pkg/apple/RetroArchAppStore.entitlements index 22b486d16b..aa7f2b804a 100644 --- a/pkg/apple/RetroArchAppStore.entitlements +++ b/pkg/apple/RetroArchAppStore.entitlements @@ -11,6 +11,11 @@ com.apple.developer.icloud-services CloudKit + CloudDocuments + + com.apple.developer.ubiquity-container-identifiers + + iCloud.com.libretro.dist.RetroArch com.apple.security.app-sandbox diff --git a/pkg/apple/RetroArchCI.entitlements b/pkg/apple/RetroArchCI.entitlements index 61355857fc..4ec8980d9e 100644 --- a/pkg/apple/RetroArchCI.entitlements +++ b/pkg/apple/RetroArchCI.entitlements @@ -11,6 +11,11 @@ com.apple.developer.icloud-services CloudKit + CloudDocuments + + com.apple.developer.ubiquity-container-identifiers + + iCloud.com.libretro.dist.RetroArch com.apple.security.cs.allow-dyld-environment-variables diff --git a/pkg/apple/iOS/AppStore.xcconfig b/pkg/apple/iOS/AppStore.xcconfig index aabf3f4c86..bad318298e 100644 --- a/pkg/apple/iOS/AppStore.xcconfig +++ b/pkg/apple/iOS/AppStore.xcconfig @@ -8,6 +8,7 @@ APPSTORE_BUILD = 1 OTHER_CFLAGS = $(inherited) -DHAVE_APPLE_STORE OTHER_CFLAGS = $(inherited) -DHAVE_ICLOUD +OTHER_CFLAGS[sdk=iphoneos*] = $(inherited) -DHAVE_ICLOUD_DRIVE OTHER_CFLAGS = $(inherited) -DkRetroArchAppGroup=@\"group.com.libretro.dist.RetroArchGroup\" IOS_BUNDLE_IDENTIFIER = com.libretro.dist.RetroArch From c794376223a809f5a3aca8f406c737ba74e0cd7b Mon Sep 17 00:00:00 2001 From: zoltanvb Date: Mon, 12 May 2025 22:14:38 +0200 Subject: [PATCH 074/175] Move core options reset from Settings/Configuration to Main Menu / Configuration Files --- menu/menu_displaylist.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 9876fe0f68..ad2d1c5ac7 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -10755,6 +10755,12 @@ unsigned menu_displaylist_build_list( MENU_ENUM_LABEL_RESET_TO_DEFAULT_CONFIG, MENU_SETTING_ACTION, 0, 0, NULL)) count++; + if (!settings->bools.global_core_options && menu_entries_append(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS_RESET), + "", + MENU_ENUM_LABEL_CORE_OPTIONS_RESET, + MENU_SETTING_ACTION_CORE_OPTIONS_RESET, 0, 0, NULL)) + count++; break; case DISPLAYLIST_PRIVACY_SETTINGS_LIST: { @@ -11329,13 +11335,6 @@ unsigned menu_displaylist_build_list( false) == 0) count++; } - /* Reset core options */ - if (!settings->bools.global_core_options && menu_entries_append(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS_RESET), - "", - MENU_ENUM_LABEL_CORE_OPTIONS_RESET, - MENU_SETTING_ACTION_CORE_OPTIONS_RESET, 0, 0, NULL)) - count++; } break; case DISPLAYLIST_DIRECTORY_SETTINGS_LIST: From 0900cd7540469d924727b6e45b5ba095ce2902d2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 13 May 2025 00:16:26 +0000 Subject: [PATCH 075/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 8 ++++++++ intl/msg_hash_de.h | 8 ++++++++ intl/msg_hash_it.h | 8 ++++++++ intl/progress.h | 4 ++-- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index d14716ccd1..8ffda7f782 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -3688,10 +3688,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Inhabilita el botó d’informació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, + "Si aquesta opció està activada, la funció d'informació estarà desactivada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Inhabilita el botó de cerca" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, + "Si aquesta opció està activada, la funció de cerca estarà desactivada." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Deshabilita analògic esquerre en el menú" diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index eaac384afc..0439b4f854 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -3600,10 +3600,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Info-Taste deaktivieren" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, + "Wenn aktiviert, wird die Info-Funktion ausgeschaltet." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Suchen-Taste deaktivieren" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, + "Wenn aktiviert, wird die Suchfunktion ausgeschaltet." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Linken Analogstick für Menü deaktivieren" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index b8f9631e49..2d0a203156 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -3624,10 +3624,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Disabilita Pulsante Info" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, + "Se abilitata, la funzione Info sarà disabilitata." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Disabilita Pulsante Ricerca" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, + "Se abilitata, la funzione di ricerca sarà disabilitata." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Disabilita l'analogico sinistro nel menu" diff --git a/intl/progress.h b/intl/progress.h index ede87d4a06..53e733c3b6 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -31,7 +31,7 @@ #define LANGUAGE_PROGRESS_DANISH_APPROVED 0 /* German */ -#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_GERMAN_APPROVED 13 /* Greek */ From 30ffb042c6cb16d8bee3b7350c75a48279ef1f4f Mon Sep 17 00:00:00 2001 From: zoltanvb Date: Tue, 13 May 2025 19:48:45 +0200 Subject: [PATCH 076/175] Hide core reset from Configuration File when no core is loaded. --- menu/menu_displaylist.c | 66 ++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index ad2d1c5ac7..c8d5cdeed7 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -10731,37 +10731,41 @@ unsigned menu_displaylist_build_list( } break; case DISPLAYLIST_CONFIGURATIONS_LIST: - if (menu_entries_append(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONFIGURATIONS), - msg_hash_to_str(MENU_ENUM_LABEL_CONFIGURATIONS), - MENU_ENUM_LABEL_CONFIGURATIONS, - MENU_SETTING_ACTION, 0, 0, NULL)) - count++; - if (menu_entries_append(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG), - msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG), - MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG, - MENU_SETTING_ACTION, 0, 0, NULL)) - count++; - if (menu_entries_append(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG), - msg_hash_to_str(MENU_ENUM_LABEL_SAVE_NEW_CONFIG), - MENU_ENUM_LABEL_SAVE_NEW_CONFIG, - MENU_SETTING_ACTION, 0, 0, NULL)) - count++; - if (menu_entries_append(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RESET_TO_DEFAULT_CONFIG), - msg_hash_to_str(MENU_ENUM_LABEL_RESET_TO_DEFAULT_CONFIG), - MENU_ENUM_LABEL_RESET_TO_DEFAULT_CONFIG, - MENU_SETTING_ACTION, 0, 0, NULL)) - count++; - if (!settings->bools.global_core_options && menu_entries_append(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS_RESET), - "", - MENU_ENUM_LABEL_CORE_OPTIONS_RESET, - MENU_SETTING_ACTION_CORE_OPTIONS_RESET, 0, 0, NULL)) - count++; - break; + { + rarch_system_info_t *sys_info = &runloop_state_get_ptr()->system; + if (menu_entries_append(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONFIGURATIONS), + msg_hash_to_str(MENU_ENUM_LABEL_CONFIGURATIONS), + MENU_ENUM_LABEL_CONFIGURATIONS, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + if (menu_entries_append(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG), + msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG), + MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + if (menu_entries_append(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG), + msg_hash_to_str(MENU_ENUM_LABEL_SAVE_NEW_CONFIG), + MENU_ENUM_LABEL_SAVE_NEW_CONFIG, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + if (menu_entries_append(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RESET_TO_DEFAULT_CONFIG), + msg_hash_to_str(MENU_ENUM_LABEL_RESET_TO_DEFAULT_CONFIG), + MENU_ENUM_LABEL_RESET_TO_DEFAULT_CONFIG, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + if (!settings->bools.global_core_options && !string_is_empty(sys_info->info.library_name) + && menu_entries_append(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS_RESET), + "", + MENU_ENUM_LABEL_CORE_OPTIONS_RESET, + MENU_SETTING_ACTION_CORE_OPTIONS_RESET, 0, 0, NULL)) + count++; + break; + } case DISPLAYLIST_PRIVACY_SETTINGS_LIST: { menu_displaylist_build_info_t build_list[] = { From ee11b7973812fe590d2a593be39170a47823e283 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Tue, 13 May 2025 22:14:49 +0300 Subject: [PATCH 077/175] Improve playlist thumbnail cycling (#17897) * Improve playlist thumbnail cycling * GLUI: Thumbnail cycling fixes --- input/input_driver.c | 53 +++++++++++++++++++++++--- intl/msg_hash_us.h | 8 ++-- menu/cbs/menu_cbs_scan.c | 43 ++------------------- menu/drivers/materialui.c | 45 +++++++++++++++------- menu/drivers/rgui.c | 80 ++++++++++++++++++++++----------------- menu/menu_defines.h | 2 + menu/menu_driver.c | 76 +++++++++++++++++++++++++++++++++++++ 7 files changed, 211 insertions(+), 96 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 03767c49d2..4c1c7a86e0 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -7195,15 +7195,56 @@ void input_driver_collect_system_input(input_driver_state_t *input_st, if (ret) { - if (a == RETRO_DEVICE_ID_ANALOG_Y && (float)ret / 0x7fff < -joypad_info.axis_threshold) - BIT256_SET_PTR(current_bits, RETRO_DEVICE_ID_JOYPAD_UP); - else if (a == RETRO_DEVICE_ID_ANALOG_Y && (float)ret / 0x7fff > joypad_info.axis_threshold) - BIT256_SET_PTR(current_bits, RETRO_DEVICE_ID_JOYPAD_DOWN); + bool playlist = false; + /* Replace right analog stick navigation in playlists to thumbnail cycling. */ + if (s == RETRO_DEVICE_INDEX_ANALOG_RIGHT) + { + menu_entry_t entry; + MENU_ENTRY_INITIALIZE(entry); + menu_entry_get(&entry, 0, 0, NULL, true); + + switch (entry.type) + { + case FILE_TYPE_RPL_ENTRY: + case FILE_TYPE_PLAYLIST_ENTRY: + case FILE_TYPE_PLAIN: + case FILE_TYPE_RDB: + playlist = true; + break; + default: + break; + } + } + + if (a == RETRO_DEVICE_ID_ANALOG_Y && (float)ret / 0x7fff < -joypad_info.axis_threshold) + { + if (playlist) + BIT256_SET_PTR(current_bits, RARCH_ANALOG_RIGHT_Y_MINUS); + else + BIT256_SET_PTR(current_bits, RETRO_DEVICE_ID_JOYPAD_UP); + } + else if (a == RETRO_DEVICE_ID_ANALOG_Y && (float)ret / 0x7fff > joypad_info.axis_threshold) + { + if (playlist) + BIT256_SET_PTR(current_bits, RARCH_ANALOG_RIGHT_Y_PLUS); + else + BIT256_SET_PTR(current_bits, RETRO_DEVICE_ID_JOYPAD_DOWN); + } if (a == RETRO_DEVICE_ID_ANALOG_X && (float)ret / 0x7fff < -joypad_info.axis_threshold) - BIT256_SET_PTR(current_bits, RETRO_DEVICE_ID_JOYPAD_LEFT); + { + if (playlist) + BIT256_SET_PTR(current_bits, RARCH_ANALOG_RIGHT_X_MINUS); + else + BIT256_SET_PTR(current_bits, RETRO_DEVICE_ID_JOYPAD_LEFT); + } else if (a == RETRO_DEVICE_ID_ANALOG_X && (float)ret / 0x7fff > joypad_info.axis_threshold) - BIT256_SET_PTR(current_bits, RETRO_DEVICE_ID_JOYPAD_RIGHT); + { + if (playlist) + BIT256_SET_PTR(current_bits, RARCH_ANALOG_RIGHT_X_PLUS); + else + BIT256_SET_PTR(current_bits, RETRO_DEVICE_ID_JOYPAD_RIGHT); + } } } } diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 23af5c5e6b..aa1a6d0edd 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3762,7 +3762,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "If enabled Info function will be disabled." + "Prevent menu info function." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, @@ -3770,7 +3770,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "If enabled Search function will be disabled." + "Prevent menu search function." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, @@ -3778,7 +3778,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Prevent Left Analog stick from navigating in menu." + "Prevent menu left analog stick input." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, @@ -3786,7 +3786,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Prevent Right Analog stick from navigating in menu." + "Prevent menu right analog stick input. Right analog stick cycles thumbnails in playlists." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, diff --git a/menu/cbs/menu_cbs_scan.c b/menu/cbs/menu_cbs_scan.c index 8bad5359f0..652bf55e5c 100644 --- a/menu/cbs/menu_cbs_scan.c +++ b/menu/cbs/menu_cbs_scan.c @@ -113,6 +113,7 @@ int action_scan_directory(const char *path, } #endif +extern int action_cycle_thumbnail(unsigned mode); int action_switch_thumbnail(const char *path, const char *label, unsigned type, size_t idx) { @@ -134,46 +135,10 @@ int action_switch_thumbnail(const char *path, * types and skip if already visible. */ if (switch_enabled) { - if (settings->uints.gfx_thumbnails == 0) - { - configuration_set_uint(settings, - settings->uints.menu_left_thumbnails, - settings->uints.menu_left_thumbnails + 1); - - if (settings->uints.gfx_thumbnails == settings->uints.menu_left_thumbnails) - configuration_set_uint(settings, - settings->uints.menu_left_thumbnails, - settings->uints.menu_left_thumbnails + 1); - - if (settings->uints.menu_left_thumbnails > 3) - configuration_set_uint(settings, - settings->uints.menu_left_thumbnails, 1); - - if (settings->uints.gfx_thumbnails == settings->uints.menu_left_thumbnails) - configuration_set_uint(settings, - settings->uints.menu_left_thumbnails, - settings->uints.menu_left_thumbnails + 1); - } + if (settings->uints.gfx_thumbnails) + action_cycle_thumbnail(MENU_ACTION_CYCLE_THUMBNAIL_PRIMARY); else - { - configuration_set_uint(settings, - settings->uints.gfx_thumbnails, - settings->uints.gfx_thumbnails + 1); - - if (settings->uints.gfx_thumbnails == settings->uints.menu_left_thumbnails) - configuration_set_uint(settings, - settings->uints.gfx_thumbnails, - settings->uints.gfx_thumbnails + 1); - - if (settings->uints.gfx_thumbnails > 3) - configuration_set_uint(settings, - settings->uints.gfx_thumbnails, 1); - - if (settings->uints.gfx_thumbnails == settings->uints.menu_left_thumbnails) - configuration_set_uint(settings, - settings->uints.gfx_thumbnails, - settings->uints.gfx_thumbnails + 1); - } + action_cycle_thumbnail(MENU_ACTION_CYCLE_THUMBNAIL_PRIMARY); if (menu_st->driver_ctx) { diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 736f88653d..e2727aa1fd 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -151,6 +151,9 @@ #define MUI_BATTERY_PERCENT_MAX_LENGTH 12 #define MUI_TIMEDATE_MAX_LENGTH 255 +/* Allow force enabling secondary thumbnail */ +#define MUI_FORCE_ENABLE_SECONDARY 0 + /* Forward declarations */ extern int action_switch_thumbnail(const char *path, const char *label, unsigned type, size_t idx); @@ -3045,10 +3048,7 @@ static void materialui_compute_entries_box_playlist_list( /* Account for additional padding in portrait mode */ if (mui->flags & MUI_FLAG_IS_PORTRAIT) - { - if (mui->flags & MUI_FLAG_SECONDARY_THUMBNAIL_ENABLED) - thumbnail_margin = (int)mui->scrollbar.width; - } + thumbnail_margin = (int)mui->scrollbar.width; /* Account for additional padding in landscape mode */ else thumbnail_margin = (int)mui->margin; @@ -4735,10 +4735,7 @@ static void materialui_render_menu_entry_playlist_list( * width (to prevent the scroll bar from being * drawn on top of the secondary thumbnail) */ if (mui->flags & MUI_FLAG_IS_PORTRAIT) - { - if (mui->flags & MUI_FLAG_SECONDARY_THUMBNAIL_ENABLED) - thumbnail_margin = (int)mui->scrollbar.width; - } + thumbnail_margin = (int)mui->scrollbar.width; /* When using landscape display orientations, we * have enough screen space to improve thumbnail * appearance by adding left/right margins */ @@ -8496,6 +8493,7 @@ static void materialui_set_thumbnail_dimensions(materialui_handle_t *mui) } } +#if MUI_FORCE_ENABLE_SECONDARY /* Checks global 'Secondary Thumbnail' option - if * currently set to 'OFF', changes value to * MUI_DEFAULT_SECONDARY_THUMBNAIL_TYPE @@ -8549,6 +8547,7 @@ static bool materialui_force_enable_secondary_thumbnail( return gfx_thumbnail_is_enabled( menu_st->thumbnail_path_data, GFX_THUMBNAIL_LEFT); } +#endif /* Determines whether dual thumbnails should be enabled * based on current list view mode, thumbnail dimensions @@ -8582,10 +8581,12 @@ static void materialui_set_secondary_thumbnail_enable(materialui_handle_t *mui, if (!menu_materialui_dual_thumbnail_list_view_enable) return; +#if MUI_FORCE_ENABLE_SECONDARY /* Attempt to force enable secondary thumbnails if * global 'Secondary Thumbnail' type is set to OFF */ if (!materialui_force_enable_secondary_thumbnail(mui, menu_st, settings)) return; +#endif /* Secondary thumbnails are supported/enabled * Check whether screen has sufficient @@ -8609,6 +8610,9 @@ static void materialui_set_secondary_thumbnail_enable(materialui_handle_t *mui, * primary + secondary thumbnails */ usable_width -= 2 * ((int)mui->thumbnail_width_max + thumbnail_margin); + if (!gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_LEFT)) + break; + /* > A secondary thumbnail may only be drawn * if the remaining (text) width is greater * than twice the thumbnail width */ @@ -8620,6 +8624,7 @@ static void materialui_set_secondary_thumbnail_enable(materialui_handle_t *mui, break; case MUI_LIST_VIEW_PLAYLIST_THUMB_DUAL_ICON: case MUI_LIST_VIEW_PLAYLIST_THUMB_DESKTOP: +#if MUI_FORCE_ENABLE_SECONDARY /* List view requires secondary thumbnails * > Attempt to force enable, but set * MUI_FLAG_SECONDARY_THUMBNAIL_ENABLED to 'true' @@ -8629,6 +8634,12 @@ static void materialui_set_secondary_thumbnail_enable(materialui_handle_t *mui, * a per-playlist override */ materialui_force_enable_secondary_thumbnail(mui, menu_st, settings); mui->flags |= MUI_FLAG_SECONDARY_THUMBNAIL_ENABLED; +#else + if (gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_LEFT)) + mui->flags |= MUI_FLAG_SECONDARY_THUMBNAIL_ENABLED; + else + mui->flags &= ~MUI_FLAG_SECONDARY_THUMBNAIL_ENABLED; +#endif break; case MUI_LIST_VIEW_PLAYLIST: case MUI_LIST_VIEW_DEFAULT: @@ -12119,6 +12130,9 @@ static void materialui_refresh_thumbnail_image(void *userdata, size_t i) if (refresh_enabled) { + /* Must reset also partially visible items */ + size_t j = (mui->first_onscreen_entry) ? mui->first_onscreen_entry - 1 : 0; + size_t j_max = mui->last_onscreen_entry + 1; materialui_node_t *node = NULL; file_list_t *list = MENU_LIST_GET_SELECTION(menu_list, 0); float stream_delay = gfx_thumb_get_ptr()->stream_delay; @@ -12126,12 +12140,17 @@ static void materialui_refresh_thumbnail_image(void *userdata, size_t i) if (!list) return; - if (!(node = (materialui_node_t*)list->list[(size_t)i].userdata)) - return; + materialui_update_list_view(mui, menu_st, config_get_ptr()); - /* Reset existing thumbnails */ - gfx_thumbnail_reset(&node->thumbnails.primary); - gfx_thumbnail_reset(&node->thumbnails.secondary); + for (; j < j_max; j++) + { + if (!(node = (materialui_node_t*)list->list[(size_t)j].userdata)) + continue; + + /* Reset existing thumbnails */ + gfx_thumbnail_reset(&node->thumbnails.primary); + gfx_thumbnail_reset(&node->thumbnails.secondary); + } /* No need to actually request thumbnails here * > Just set delay timer to the current maximum diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 97137d8759..6baed8e21f 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -7155,10 +7155,8 @@ static void rgui_refresh_thumbnail_image(void *userdata, size_t i) rgui_inline_thumbnails = settings->bools.menu_rgui_inline_thumbnails || (rgui->flags & RGUI_FLAG_IS_QUICK_MENU); - /* Only refresh thumbnails if thumbnails are enabled */ - if ( ((rgui->flags & RGUI_FLAG_SHOW_FULLSCREEN_THUMBNAIL) || rgui_inline_thumbnails) - && (gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_RIGHT) - || gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_LEFT))) + /* Only refresh thumbnails if thumbnails are visible */ + if ((rgui->flags & RGUI_FLAG_SHOW_FULLSCREEN_THUMBNAIL) || rgui_inline_thumbnails) { /* In all cases, reset current thumbnails */ rgui->fs_thumbnail.width = 0; @@ -7176,6 +7174,11 @@ static void rgui_refresh_thumbnail_image(void *userdata, size_t i) rgui->mini_left_thumbnail.is_valid = false; rgui->mini_left_thumbnail.path[0] = '\0'; + /* Skip thumbnail scan if neither are enabled */ + if ( !gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_RIGHT) + && !gfx_thumbnail_is_enabled(menu_st->thumbnail_path_data, GFX_THUMBNAIL_LEFT)) + return; + /* Only load thumbnails if currently viewing a * playlist (note that thumbnails are loaded * immediately, for an optimal user experience) */ @@ -7190,49 +7193,49 @@ static void rgui_action_switch_thumbnail(rgui_t *rgui) { settings_t *settings = config_get_ptr(); - if (settings->uints.gfx_thumbnails == 0) + if (!settings) + return; + + if (settings->uints.gfx_thumbnails) { - configuration_set_uint(settings, - settings->uints.menu_left_thumbnails, - settings->uints.menu_left_thumbnails + 1); + uint8_t cur_primary = settings->uints.gfx_thumbnails; + uint8_t cur_secondary = settings->uints.menu_left_thumbnails; + cur_primary++; + + /* Prevent dupe image */ if ( (!(rgui->flags & RGUI_FLAG_SHOW_FULLSCREEN_THUMBNAIL)) - && (settings->uints.gfx_thumbnails == settings->uints.menu_left_thumbnails)) - configuration_set_uint(settings, - settings->uints.menu_left_thumbnails, - settings->uints.menu_left_thumbnails + 1); + && (cur_primary == cur_secondary && cur_secondary)) + cur_primary++; - if (settings->uints.menu_left_thumbnails > 3) - configuration_set_uint(settings, - settings->uints.menu_left_thumbnails, 1); + /* Wrap primary to first image type, and skip logo */ + if (cur_primary > PLAYLIST_THUMBNAIL_MODE_LAST - PLAYLIST_THUMBNAIL_MODE_OFF - 2) + cur_primary = 1; + /* Final dupe check */ if ( (!(rgui->flags & RGUI_FLAG_SHOW_FULLSCREEN_THUMBNAIL)) - && (settings->uints.gfx_thumbnails == settings->uints.menu_left_thumbnails)) - configuration_set_uint(settings, - settings->uints.menu_left_thumbnails, - settings->uints.menu_left_thumbnails + 1); + && (cur_primary == cur_secondary && cur_secondary)) + cur_primary++; + + configuration_set_uint(settings, settings->uints.gfx_thumbnails, cur_primary); } else { - configuration_set_uint(settings, - settings->uints.gfx_thumbnails, - settings->uints.gfx_thumbnails + 1); + uint8_t cur_primary = settings->uints.gfx_thumbnails; + uint8_t cur_secondary = settings->uints.menu_left_thumbnails; + cur_secondary++; + + /* Prevent dupe image */ if ( (!(rgui->flags & RGUI_FLAG_SHOW_FULLSCREEN_THUMBNAIL)) - && (settings->uints.gfx_thumbnails == settings->uints.menu_left_thumbnails)) - configuration_set_uint(settings, - settings->uints.gfx_thumbnails, - settings->uints.gfx_thumbnails + 1); + && (cur_primary == cur_secondary)) + cur_secondary++; - if (settings->uints.gfx_thumbnails > 3) - configuration_set_uint(settings, - settings->uints.gfx_thumbnails, 1); + /* Wrap secondary to no image, and skip logo */ + if (cur_secondary > PLAYLIST_THUMBNAIL_MODE_LAST - PLAYLIST_THUMBNAIL_MODE_OFF - 2) + cur_secondary = 0; - if ( (!(rgui->flags & RGUI_FLAG_SHOW_FULLSCREEN_THUMBNAIL)) - && (settings->uints.gfx_thumbnails == settings->uints.menu_left_thumbnails)) - configuration_set_uint(settings, - settings->uints.gfx_thumbnails, - settings->uints.gfx_thumbnails + 1); + configuration_set_uint(settings, settings->uints.menu_left_thumbnails, cur_secondary); } rgui_refresh_thumbnail_image(rgui, 0); @@ -8206,6 +8209,15 @@ static enum menu_action rgui_parse_menu_entry_action( new_action = MENU_ACTION_NOOP; } break; + case MENU_ACTION_CYCLE_THUMBNAIL_PRIMARY: + case MENU_ACTION_CYCLE_THUMBNAIL_SECONDARY: + /* Use rgui internal cycle method always in fullscreen mode */ + if (rgui->flags & RGUI_FLAG_SHOW_FULLSCREEN_THUMBNAIL) + { + rgui_action_switch_thumbnail(rgui); + new_action = MENU_ACTION_NOOP; + } + break; case MENU_ACTION_INFO: if ( (rgui->flags & RGUI_FLAG_IS_PLAYLIST) || (rgui->flags & RGUI_FLAG_IS_EXPLORE_LIST)) diff --git a/menu/menu_defines.h b/menu/menu_defines.h index 5bff359c2e..5f0d0d3c61 100644 --- a/menu/menu_defines.h +++ b/menu/menu_defines.h @@ -459,6 +459,8 @@ enum menu_action MENU_ACTION_SCROLL_UP, MENU_ACTION_SCROLL_HOME, MENU_ACTION_SCROLL_END, + MENU_ACTION_CYCLE_THUMBNAIL_PRIMARY, + MENU_ACTION_CYCLE_THUMBNAIL_SECONDARY, MENU_ACTION_TOGGLE, MENU_ACTION_RESUME, MENU_ACTION_POINTER_MOVED, diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 59c4820ee6..2efb5771c0 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -5624,6 +5624,15 @@ unsigned menu_event( ret = MENU_ACTION_SCROLL_END; } + if (BIT256_GET_PTR(p_trigger_input, RARCH_ANALOG_RIGHT_Y_MINUS)) + ret = MENU_ACTION_CYCLE_THUMBNAIL_PRIMARY; + else if (BIT256_GET_PTR(p_trigger_input, RARCH_ANALOG_RIGHT_Y_PLUS)) + ret = MENU_ACTION_CYCLE_THUMBNAIL_SECONDARY; + else if (BIT256_GET_PTR(p_trigger_input, RARCH_ANALOG_RIGHT_X_MINUS)) + ret = MENU_ACTION_CYCLE_THUMBNAIL_PRIMARY; + else if (BIT256_GET_PTR(p_trigger_input, RARCH_ANALOG_RIGHT_X_PLUS)) + ret = MENU_ACTION_CYCLE_THUMBNAIL_SECONDARY; + if (ok_trigger) ret = MENU_ACTION_OK; else if (BIT256_GET_PTR(p_trigger_input, menu_cancel_btn)) @@ -6975,6 +6984,69 @@ clear: } #endif +/** + * action_cycle_thumbnail: + * @mode : menu action (primary/secondary) + * + * Common thumbnail cycler + * + * Returns: 0 on success, -1 on fail. +**/ +int action_cycle_thumbnail(unsigned mode) +{ + struct menu_state *menu_st = menu_state_get_ptr(); + settings_t *settings = config_get_ptr(); + + if (!settings) + return -1; + + if (mode == MENU_ACTION_CYCLE_THUMBNAIL_PRIMARY) + { + uint8_t cur_primary = settings->uints.gfx_thumbnails; + uint8_t cur_secondary = settings->uints.menu_left_thumbnails; + + cur_primary++; + + /* Prevent dupe image */ + if (cur_primary == cur_secondary && cur_secondary) + cur_primary++; + + /* Wrap primary to first image type, and skip logo */ + if (cur_primary > PLAYLIST_THUMBNAIL_MODE_LAST - PLAYLIST_THUMBNAIL_MODE_OFF - 2) + cur_primary = 1; + + /* Final dupe check */ + if (cur_primary == cur_secondary && cur_secondary) + cur_primary++; + + configuration_set_uint(settings, settings->uints.gfx_thumbnails, cur_primary); + } + else if (mode == MENU_ACTION_CYCLE_THUMBNAIL_SECONDARY) + { + uint8_t cur_primary = settings->uints.gfx_thumbnails; + uint8_t cur_secondary = settings->uints.menu_left_thumbnails; + + cur_secondary++; + + /* Prevent dupe image */ + if (cur_primary == cur_secondary) + cur_secondary++; + + /* Wrap secondary to no image, and skip logo */ + if (cur_secondary > PLAYLIST_THUMBNAIL_MODE_LAST - PLAYLIST_THUMBNAIL_MODE_OFF - 2) + cur_secondary = 0; + + configuration_set_uint(settings, settings->uints.menu_left_thumbnails, cur_secondary); + } + + if (menu_st->driver_ctx) + { + if (menu_st->driver_ctx->refresh_thumbnail_image) + menu_st->driver_ctx->refresh_thumbnail_image(menu_st->userdata, menu_st->selection_ptr); + } + + return 0; +} /** * menu_iterate: @@ -7639,6 +7711,10 @@ int generic_menu_entry_action( #endif break; } + case MENU_ACTION_CYCLE_THUMBNAIL_PRIMARY: + case MENU_ACTION_CYCLE_THUMBNAIL_SECONDARY: + action_cycle_thumbnail(action); + break; case MENU_ACTION_CANCEL: if (cbs && cbs->action_cancel) ret = cbs->action_cancel(entry->path, From 0f65f2f0f304f7f7966760007ca68382bd4f4fa9 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Wed, 14 May 2025 01:11:15 +0300 Subject: [PATCH 078/175] Display bfi + shader subframes strings without translations --- intl/msg_hash_be.h | 120 ------------------------------------------ intl/msg_hash_ca.h | 120 ------------------------------------------ intl/msg_hash_chs.h | 120 ------------------------------------------ intl/msg_hash_cht.h | 120 ------------------------------------------ intl/msg_hash_cs.h | 120 ------------------------------------------ intl/msg_hash_de.h | 120 ------------------------------------------ intl/msg_hash_es.h | 120 ------------------------------------------ intl/msg_hash_fi.h | 120 ------------------------------------------ intl/msg_hash_fr.h | 120 ------------------------------------------ intl/msg_hash_gl.h | 120 ------------------------------------------ intl/msg_hash_hu.h | 120 ------------------------------------------ intl/msg_hash_id.h | 60 --------------------- intl/msg_hash_it.h | 120 ------------------------------------------ intl/msg_hash_ja.h | 120 ------------------------------------------ intl/msg_hash_ko.h | 120 ------------------------------------------ intl/msg_hash_pl.h | 120 ------------------------------------------ intl/msg_hash_pt_br.h | 120 ------------------------------------------ intl/msg_hash_pt_pt.h | 120 ------------------------------------------ intl/msg_hash_ru.h | 120 ------------------------------------------ intl/msg_hash_sv.h | 120 ------------------------------------------ intl/msg_hash_tr.h | 120 ------------------------------------------ intl/msg_hash_uk.h | 120 ------------------------------------------ intl/msg_hash_us.h | 120 ------------------------------------------ menu/menu_setting.c | 84 +++++------------------------ msg_hash.h | 32 ----------- 25 files changed, 14 insertions(+), 2802 deletions(-) diff --git a/intl/msg_hash_be.h b/intl/msg_hash_be.h index a4b10b038b..620896b3fc 100644 --- a/intl/msg_hash_be.h +++ b/intl/msg_hash_be.h @@ -1982,66 +1982,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Устаўляе паміж кадрамі кадр(ы) чорнага колеру для падвышэння выразнасці руху. Выкарыстоўвайце значэнне толькі для бягучай частаты абнаўлення. Не дастасавальна з частатой абнаўлення не кратнай 60 Гц, напрыклад 144 Гц, 165 Гц і г. д. Не ўключайце адначасова з інтэрвалам абнаўлен[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 – для частаты абнаўлення экрану 120 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 – для частаты абнаўлення экрану 180 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 – для частаты абнаўлення экрану 240 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 – для частаты абнаўлення экрану 300 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 – для частаты абнаўлення экрану 360 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 – для частаты абнаўлення экрану 420 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 – для частаты абнаўлення экрану 480 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 – для частаты абнаўлення экрану 540 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 – для частаты абнаўлення экрану 600 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 – для частаты абнаўлення экрану 660 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 – для частаты абнаўлення экрану 720 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 – для частаты абнаўлення экрану 780 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 – для частаты абнаўлення экрану 840 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 – для частаты абнаўлення экрану 900 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15– для частаты абнаўлення экрану 960 Гц" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Устаўлянне чорнага кадра - зацямнёныя кадры" @@ -2062,66 +2002,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Устаўляе паміж кадрамі дадатковы кадр(ы) шэйдара для ўсіх шэйдарных эфектаў з частатой вышэй частаты кантэнту. Выкарыстоўвайце значэнне толькі для бягучай частаты абнаўлення. Не дастасавальна з частатой абнаўлення не кратнай 60 Гц, напрыклад 144 Гц, 165 Гц і г. д. Не ўключайце [...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 – для частаты абнаўлення экрану 120 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 – для частаты абнаўлення экрану 180 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 – для частаты абнаўлення экрану 240 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 – для частаты абнаўлення экрану 300 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 – для частаты абнаўлення экрану 360 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 – для частаты абнаўлення экрану 420 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 – для частаты абнаўлення экрану 480 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 – для частаты абнаўлення экрану 540 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 – для частаты абнаўлення экрану 600 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 – для частаты абнаўлення экрану 660 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 – для частаты абнаўлення экрану 720 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 – для частаты абнаўлення экрану 780 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 – для частаты абнаўлення экрану 840 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 – для частаты абнаўлення экрану 900 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16– для частаты абнаўлення экрану 960 Гц" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Здымак экрана графічным працэсарам" diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 8ffda7f782..4fc69f31fb 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -1970,66 +1970,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Insereix fotogrames en negre entre fotogrames per a millorar la claredat del moviment. Useu només l'opció designada per a la freqüència d'actualització actual de la pantalla. No ho feu servir per a freqüències d'actualització que no siguin múltiples de 60 Hz, com ara 144 Hz, 165 Hz, etc. No ho combineu amb intervals d'intercanvi > 1, subfotogrames, retard dels fotogrames ni amb la sincronització a la velocitat de fotogrames del contingut exacta. Es pot deixar activada l'opció de VRR ([...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Per a una freqüència d'actualització de 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Per a una freqüència d'actualització de 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Per a una freqüència d'actualització de 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Per a una freqüència d'actualització de 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Per a una freqüència d'actualització de 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Per a una freqüència d'actualització de 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Per a una freqüència d'actualització de 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Per a una freqüència d'actualització de 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Per a una freqüència d'actualització de 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Per a una freqüència d'actualització de 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Per a una freqüència d'actualització de 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Per a una freqüència d'actualització de 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Per a una freqüència d'actualització de 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Per a una freqüència d'actualització de 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Per a una freqüència d'actualització de 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Inserció de fotogrames en negre (BFI) - Fotogrames foscos" @@ -2054,66 +1994,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Insereix fotogrames d'ombreig extra entre fotogrames per a qualsevol efecte d'ombreig que estigui designat per a executar-se més ràpid que la freqüència del contingut. Useu només l'opció designada per a la freqüència d'actualització actual de la pantalla. No ho feu servir per a freqüències d'actualització que no siguin múltiples de 60 Hz, com ara 144 Hz, 165 Hz, etc. No ho combineu amb intervals d'intercanvi > 1, BFI, retard dels fotogrames ni amb la sincronització a la velocitat d[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - Per a una freqüència d'actualització de 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - Per a una freqüència d'actualització de 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - Per a una freqüència d'actualització de 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - Per a una freqüència d'actualització de 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - Per a una freqüència d'actualització de 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - Per a una freqüència d'actualització de 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - Per a una freqüència d'actualització de 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - Per a una freqüència d'actualització de 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - Per a una freqüència d'actualització de 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - Per a una freqüència d'actualització de 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - Per a una freqüència d'actualització de 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - Per a una freqüència d'actualització de 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - Per a una freqüència d'actualització de 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - Per a una freqüència d'actualització de 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - Per a una freqüència d'actualització de 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Captura de pantalla de la GPU" diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 5286f1f058..6c35cc71b8 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -1990,66 +1990,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "为增强运动清晰度在帧之间插入黑帧。仅使用为您当前显示刷新率指定的选项。 不以非倍数60赫兹的刷新速率使用,例如144赫兹,165赫兹等。 不要与Swap Interval > 1, sub-frames, Frame Delay, 或者 Sync to Exact Content Framerate功能同时使用. 可以打开系统的 VRR 选项,仅仅不是那个设置。 如果你注意到-任何-临时图像保留, 你应该在 120hz 处禁用, 对于更高的hz 则调整下面的暗色帧设置。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1-120Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2-180Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - 240赫兹显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - 300赫兹显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - 360赫兹显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - 420赫兹显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - 480Hz 显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - 540赫兹显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - 600赫兹显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - 660赫兹显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - 720赫兹显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - 780Hz 显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - 840赫兹显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - 900Hz 显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - 960赫兹显示刷新率" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "插入黑帧 - 暗色帧" @@ -2070,66 +2010,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "设计用来在任何可能的着色器特效上提升游戏本身的帧率,在帧之间插入额外的着色器帧。仅可以使用为您当前显示器刷新率指定的选项。 不要在非60赫兹倍数的屏幕刷新率使用,例如144赫兹,165赫兹等。 不要与“Swap 间隔 > 1”, “BFI”, “帧延迟”, 或者 “精确同步游戏帧率”功能同时使用. 可以保持系统的 VRR 功能打开,仅仅不是那个设置。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2-120Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3-180Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - 240Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - 300Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - 360Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - 420Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - 480Hz 显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - 540Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - 600Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - 660Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - 720Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - 780Hz 显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - 840Hz显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - 900Hz 显示刷新率" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - 960Hz显示刷新率" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "GPU 截屏" diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index ddc4e9e68f..73d8c9f262 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -1922,66 +1922,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "設定值必須與螢幕預設更新率相同, 在每幀之間插入黑幀以增強動態清晰度。\n請勿與「垂直同步切換間隔」設定大於<1> 「著色器補幀」 「幀數延遲」 「準確同步執行幀率」同時使用。\n不適用於非60Hz倍數的更新率, 例如144Hz、165Hz等。\n允許系統可變更新率開啟, 但不是那個設定。\n 如果發現任何影像殘留, 請在120hz測試後關閉此選項, 至於更高的更新率可調整下方暗幀設定。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - 螢幕更新率 120Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - 螢幕更新率 180Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - 螢幕更新率 240Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - 螢幕更新率 300Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - 螢幕更新率 360Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - 螢幕更新率 420Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - 螢幕更新率 480Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - 螢幕更新率 540Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - 螢幕更新率 600Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - 螢幕更新率 660Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - 螢幕更新率 720Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - 螢幕更新率 780Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - 螢幕更新率 840Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - 螢幕更新率 900Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - 螢幕更新率 960Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "插入黑幀 - 暗幀數" @@ -1994,66 +1934,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "設定值必須與螢幕預設更新率相同, 在每幀之間插入著色器補幀, 提高每秒顯示影格數符合螢幕更新率。\n請勿與「垂直同步切換間隔」設定大於<1> 「插入黑幀」 「幀數延遲」 「準確同步執行幀率」同時使用。\n不適用於非60Hz倍數的更新率, 例如144Hz、165Hz等。\n允許系統可變更新率開啟, 但不是那個設定。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - 螢幕更新率 120Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - 螢幕更新率 180Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - 螢幕更新率 240Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - 螢幕更新率 300Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - 螢幕更新率 360Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - 螢幕更新率 420Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - 螢幕更新率 480Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - 螢幕更新率 540Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - 螢幕更新率 600Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - 螢幕更新率 660Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - 螢幕更新率 720Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - 螢幕更新率 780Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - 螢幕更新率 840Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - 螢幕更新率 900Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - 螢幕更新率 960Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "圖形處理器截圖" diff --git a/intl/msg_hash_cs.h b/intl/msg_hash_cs.h index f7be5e469d..89230de06e 100644 --- a/intl/msg_hash_cs.h +++ b/intl/msg_hash_cs.h @@ -1938,66 +1938,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Vkládá mezi snímky černý rámeček (rámečky) pro lepší zřetelnost pohybu. Použijte pouze možnost určenou pro aktuální obnovovací frekvenci displeje. Nelze použít při obnovovací frekvenci, která není násobkem 60 Hz, jako je 144 Hz, 165 Hz atd. Nekombinujte s funkcemi Výměna intervalu > 1, dílčími snímky, zpoždění snímku nebo Sync do přesné snímkové frekvence obsahu. Ponechání zapnutého systémového VRR je v pořádku, jen ne toto nastavení. Pokud zaznamen[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - pro displeje s zobrazovací frekvenci 120Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - pro displeje s zobrazovací frekvenci 180Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - pro displeje s zobrazovací frekvenci 240Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - pro displeje s zobrazovací frekvenci 300Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - pro displeje s zobrazovací frekvenci 360Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - pro displeje s zobrazovací frekvenci 420Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - pro displeje s zobrazovací frekvenci 480Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - pro displeje s zobrazovací frekvenci 540Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - pro displeje s zobrazovací frekvenci 600Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - pro displeje s zobrazovací frekvenci 660Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - pro displeje s zobrazovací frekvenci 720Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - pro displeje s zobrazovací frekvenci 780Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - pro displeje s zobrazovací frekvenci 840Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - pro displeje s zobrazovací frekvenci 900Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - pro displeje s zobrazovací frekvenci 960Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Vložení černého rámečku - tmavé rámečky" @@ -2022,66 +1962,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Vkládá mezi snímky další snímky shaderu pro případné efekty shaderu, které jsou navrženy tak, aby běžely rychleji než rychlost obsahu. Použijte pouze možnost určenou pro aktuální obnovovací frekvenci displeje. Není určeno pro použití při obnovovacích frekvencích, které nejsou násobkem 60 Hz, například 144 Hz, 165 Hz atd. Nekombinujte s funkcemi Interval výměny > 1, BFI, zpoždění snímku nebo Sync do přesné snímkové frekvence obsahu. Ponechání zapnutého [...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - pro displeje s zobrazovací frekvenci 120Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - pro displeje s zobrazovací frekvenci 180Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - pro displeje s zobrazovací frekvenci 240Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - pro displeje s zobrazovací frekvenci 300Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - pro displeje s zobrazovací frekvenci 360Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - pro displeje s zobrazovací frekvenci 420Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - pro displeje s zobrazovací frekvenci 480Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - pro displeje s zobrazovací frekvenci 540Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - pro displeje s zobrazovací frekvenci 600Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - pro displeje s zobrazovací frekvenci 660Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - pro displeje s zobrazovací frekvenci 720Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - pro displeje s zobrazovací frekvenci 780Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - pro displeje s zobrazovací frekvenci 840Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - pro displeje s zobrazovací frekvenci 900Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - pro displeje s zobrazovací frekvenci 960Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "GPU snímek obrazovky" diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 0439b4f854..f7be1945a4 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -1910,66 +1910,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Fügt Schwarzbild(er) zwischen Frames für verbesserte Bewegungsschärfe ein. Nur die Option benutzen, die für die aktuelle Aktualisierungsrate bestimmt ist. Nicht für die Verwendung bei Aktualisierungsraten mit nicht multiplen 60 Hz wie 144 Hz, 165Hz, usw. Nicht kombinieren mit Swap-Intervall > 1, Unterbilder, Bildverzögerung oder mit exakter Inhaltssignalfrequenz synchronisieren. System-VRR eingeschaltet lassen ist ok, nur nicht diese Einstellung. Wenn -irgendein- temporäres Bild-Nachleuch[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Für eine Bildwiederholfrequenz von 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Für eine Bildwiederholfrequenz von 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Für eine Bildwiederholfrequenz von 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Für eine Bildwiederholfrequenz von 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Für eine Bildwiederholfrequenz von 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Für eine Bildwiederholfrequenz von 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Für eine Bildwiederholfrequenz von 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Für eine Bildwiederholfrequenz von 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Für eine Bildwiederholfrequenz von 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Für eine Bildwiederholfrequenz von 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Für eine Bildwiederholfrequenz von 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Für eine Bildwiederholfrequenz von 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Für eine Bildwiederholfrequenz von 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Für eine Bildwiederholfrequenz von 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Für eine Bildwiederholfrequenz von 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Schwarzbild einfügen - Dunkle Frames" @@ -1994,66 +1934,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Fügt zusätzlich Shader-Bild(er) zwischen Frames für alle möglichen Shader-Effekte ein, die darauf ausgelegt sind, schneller als die Inhaltsrate zu laufen. Nur die Option benutzen, die für die aktuelle Aktualisierungsrate bestimmt ist. Nicht für die Verwendung bei Aktualisierungsraten mit nicht multiplen 60 Hz wie 144 Hz, 165Hz, usw. Nicht kombinieren mit Swap-Intervall > 1, Schwarzbilder, Bildverzögerung oder mit exakter Inhaltssignalfrequenz synchronisieren. System-VRR eingeschaltet lass[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - Für eine Bildwiederholfrequenz von 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - Für eine Bildwiederholfrequenz von 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - Für eine Bildwiederholfrequenz von 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - Für eine Bildwiederholfrequenz von 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - Für eine Bildwiederholfrequenz von 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - Für eine Bildwiederholfrequenz von 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - Für eine Bildwiederholfrequenz von 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - Für eine Bildwiederholfrequenz von 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - Für eine Bildwiederholfrequenz von 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - Für eine Bildwiederholfrequenz von 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - Für eine Bildwiederholfrequenz von 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - Für eine Bildwiederholfrequenz von 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - Für eine Bildwiederholfrequenz von 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - Für eine Bildwiederholfrequenz von 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - Für eine Bildwiederholfrequenz von 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "GPU-Screenshot" diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index bb66627645..e14958a37d 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -1978,66 +1978,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Introduce uno o varios fotogramas negros para mejorar la claridad de los elementos en movimiento. Utiliza únicamente la opción designada para la frecuencia de actualización actual de tu monitor. No se debe utilizar con frecuencias que no sean múltiplos de 60 Hz, como 144 Hz, 165 Hz, etc. No combinar con un intervalo de intercambio de VSync superior a 1, con subfotogramas, con el retraso de fotogramas o con Sincronizar FPS al contenido. No pasa nada por dejar activada la frecuencia de actu[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Para una frecuencia de 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Para una frecuencia de 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Para una frecuencia de 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Para una frecuencia de 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Para una frecuencia de 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Para una frecuencia de 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Para una frecuencia de 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Para una frecuencia de 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Para una frecuencia de 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Para una frecuencia de 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Para una frecuencia de 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Para una frecuencia de 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Para una frecuencia de 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Para una frecuencia de 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Para una frecuencia de 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Insertar fotogramas negros (BFI): fotogramas oscuros" @@ -2062,66 +2002,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Introduce uno o varios fotogramas adicionales para cualquier efecto de shaders pensado para una velocidad de actualización superior a la del contenido. Utiliza únicamente la opción designada para la frecuencia de actualización actual de tu monitor. No se debe utilizar con frecuencias que no sean múltiplos de 60 Hz, como 144 Hz, 165 Hz, etc. No combinar con un intervalo de intercambio de VSync superior a 1, con inserción de fotogramas negros, con el retraso de fotogramas o con Sincroniza[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - Para una frecuencia de 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - Para una frecuencia de 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - Para una frecuencia de 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - Para una frecuencia de 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - Para una frecuencia de 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - Para una frecuencia de 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - Para una frecuencia de 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - Para una frecuencia de 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - Para una frecuencia de 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - Para una frecuencia de 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - Para una frecuencia de 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - Para una frecuencia de 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - Para una frecuencia de 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - Para una frecuencia de 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - Para una frecuencia de 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Capturar pantalla mediante la GPU" diff --git a/intl/msg_hash_fi.h b/intl/msg_hash_fi.h index 84025a750b..a3b0dac063 100644 --- a/intl/msg_hash_fi.h +++ b/intl/msg_hash_fi.h @@ -1886,126 +1886,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, "Mustan ruudun lisäys" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Näytön 120 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Näytön 180 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Näytön 240 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Näytön 300 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Näytön 360 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Näytön 420 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Näytön 480 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Näytön 540 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Näytön 600 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Näytön 660 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Näytön 720 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Näytön 780 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Näytön 840 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Näytön 900 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Näytön 960 Hz:n virkistystaajuudelle" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - 120 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - 180 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - 240 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - 300 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - 360 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - 420 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - 480 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - 540 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - 600 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - 660 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - 720 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - 780 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - 840 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - 900 Hz:n virkistystaajuuden näytöille" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - 960 Hz:n virkistystaajuuden näytöille" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Näytönohjaimen kuvakaappaus" diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 711ea2daab..9bc7888789 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -1954,66 +1954,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Insérer une ou plusieurs images noires entre les images pour une plus grande clarté de mouvement. Utilisez uniquement l'option désignée pour votre fréquence de rafraîchissement actuelle. Ne pas utiliser à des fréquences de rafraîchissement qui ne sont pas des multiples de 60 Hz tels que 144 Hz, 165 Hz, etc. Ne pas combiner avec les options Intervalle d'échange > 1, sous-trames, Retard d'images ou Synchroniser à la fréquence d'affichage exacte du contenu. Laisser l'option VRR (fréque[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Pour une fréquence de rafraîchissement à 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Pour une fréquence de rafraîchissement à 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Pour une fréquence de rafraîchissement à 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Pour une fréquence de rafraîchissement à 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Pour une fréquence de rafraîchissement à 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Pour une fréquence de rafraîchissement à 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Pour une fréquence de rafraîchissement à 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Pour une fréquence de rafraîchissement à 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Pour une fréquence de rafraîchissement à 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Pour une fréquence de rafraîchissement à 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Pour une fréquence de rafraîchissement à 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Pour une fréquence de rafraîchissement à 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Pour une fréquence de rafraîchissement à 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Pour une fréquence de rafraîchissement à 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Pour une fréquence de rafraîchissement à 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Insertion d'images noir - Images sombres" @@ -2038,66 +1978,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Insérer une ou plusieurs images noires entre les images pour chaque effet de shader possible qui est conçu pour tourner plus rapidement que la vitesse du contenu. Utilisez uniquement l'option désignée pour votre fréquence de rafraîchissement actuelle. Ne pas utiliser à des fréquences de rafraîchissement qui ne sont pas des multiples de 60 Hz tels que 144 Hz, 165 Hz, etc. Ne pas combiner avec les options Intervalle d'échange > 1, BFI, Retard d'images ou Synchroniser à la fréquence d'a[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - Pour une fréquence de rafraîchissement à 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - Pour une fréquence de rafraîchissement à 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - Pour une fréquence de rafraîchissement à 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - Pour une fréquence de rafraîchissement à 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - Pour une fréquence de rafraîchissement à 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - Pour une fréquence de rafraîchissement à 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - Pour une fréquence de rafraîchissement à 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - Pour une fréquence de rafraîchissement à 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - Pour une fréquence de rafraîchissement à 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - Pour une fréquence de rafraîchissement à 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - Pour une fréquence de rafraîchissement à 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - Pour une fréquence de rafraîchissement à 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - Pour une fréquence de rafraîchissement à 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - Pour une fréquence de rafraîchissement à 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - Pour une fréquence de rafraîchissement à 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Utiliser le processeur graphique pour les captures d'écran" diff --git a/intl/msg_hash_gl.h b/intl/msg_hash_gl.h index c1d6d7f858..14254d5254 100644 --- a/intl/msg_hash_gl.h +++ b/intl/msg_hash_gl.h @@ -1966,66 +1966,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Insire cadro(s) negros entre cadros para mellorar a claridade do movemento. Use só a opción designada para a súa frecuencia de actualización da pantalla actual. Non se debe usar con frecuencias de actualización que non sexan múltiplos de 60 Hz, como 144 Hz, 165 Hz, etc. Non combines con Intervalo de intercambio > 1, subfotogramas, Retraso de fotogramas ou Sincronización con frecuencia de fotogramas de contido exacto. Deixar o sistema VRR activado está ben, pero non esa configuración. Se[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Para a frecuencia de actualización da pantalla de 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Para a frecuencia de actualización da pantalla de 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Para a frecuencia de actualización da pantalla de 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Para a frecuencia de actualización da pantalla de 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Para a frecuencia de actualización da pantalla de 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Para a frecuencia de actualización da pantalla de 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Para a frecuencia de actualización da pantalla de 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Para a frecuencia de actualización da pantalla de 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Para a frecuencia de actualización da pantalla de 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Para a frecuencia de actualización da pantalla de 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Para a frecuencia de actualización da pantalla de 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Para a frecuencia de actualización da pantalla de 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Para a frecuencia de actualización da pantalla de 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Para a frecuencia de actualización da pantalla de 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Para a frecuencia de actualización da pantalla de 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Inserción de cadros negros - cadros escuros" @@ -2050,66 +1990,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Insire cadro(s) de sombreado extra entre os fotogramas para os posibles efectos de sombreado que estean deseñados para executarse máis rápido que a taxa de contido. Use só a opción designada para a súa frecuencia de actualización da pantalla actual. Non debe usarse con frecuencias de actualización que non sexan múltiplos de 60 Hz, como 144 Hz, 165 Hz, etc. Non combine con Intervalo de intercambio > 1, BFI, Retraso de fotogramas ou Sincronización con frecuencia de fotogramas de contido [...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - Para a frecuencia de actualización da pantalla de 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - Para a frecuencia de actualización da pantalla de 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - Para a frecuencia de actualización da pantalla de 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - Para a frecuencia de actualización da pantalla de 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - Para a frecuencia de actualización da pantalla de 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - Para a frecuencia de actualización da pantalla de 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - Para a frecuencia de actualización da pantalla de 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - Para a frecuencia de actualización da pantalla de 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - Para a frecuencia de actualización da pantalla de 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - Para a frecuencia de actualización da pantalla de 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - Para a frecuencia de actualización da pantalla de 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - Para a frecuencia de actualización da pantalla de 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - Para a frecuencia de actualización da pantalla de 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - Para a frecuencia de actualización da pantalla de 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - Para a frecuencia de actualización da pantalla de 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Captura de pantalla da GPU" diff --git a/intl/msg_hash_hu.h b/intl/msg_hash_hu.h index 817dcf55a1..2edbead773 100644 --- a/intl/msg_hash_hu.h +++ b/intl/msg_hash_hu.h @@ -1958,66 +1958,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Egy vagy több fekete képkocka beszúrása a mozgás tisztább visszaadásáért. Csak az aktuális képernyőfrissítéshez igazodó opció használható. Nem alkalmas olyan frissítési frekvenciához, ami nem 60 Hz többszöröse (pl. 144 Hz, 165 Hz). Nem kombinálható az 1-nél nagyobb váltóperiódussal, az alképkockákkal, a képvárakoztatással, vagy a tartalom pontos képfrissítéséhez igazítással. Átmeneti képbeégés esetén 120 Hz-en kikapcsolandó, magasabb Hz-en pedig a l[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - 120 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - 180 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - 240 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - 300 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - 360 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - 420 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - 480 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - 540 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - 600 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - 660 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - 720 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - 780 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - 840 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - 900 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - 960 Hz-es képfrissítési frekvenciához" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Fekete képkocka beszúrása - Sötét képkockák" @@ -2042,66 +1982,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Egy vagy több plusz képkocka beszúrása olyan shader effektekhez, amelyek a tartalom frissítésénél gyorsabban kell fussanak. Csak a képernyő aktuális frissítési gyakoriságának megfelelő érték használható. Nem alkalmazható, ha ez nem 60 Hz többszöröse (pl. 144 Hz, 165 Hz). Nem kombinálható az 1-nél nagyobb váltóperiódussal, a fekete képkocka beszúrással, a képvárakoztatással, vagy a tartalom pontos képfrissítéséhez igazításával." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - 120 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - 180 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - 240 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - 300 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - 360 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - 420 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - 480 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - 540 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - 600 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - 660 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - 720 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - 780 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - 840 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - 900 Hz-es képfrissítési frekvenciához" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - 960 Hz-es képfrissítési frekvenciához" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "GPU képernyőkép" diff --git a/intl/msg_hash_id.h b/intl/msg_hash_id.h index ed359accc1..16e0c97e95 100644 --- a/intl/msg_hash_id.h +++ b/intl/msg_hash_id.h @@ -1486,66 +1486,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, "Penyisipan Bingkai Hitam" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Untuk Layar di Laju Segar 120Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Untuk Layar di Laju Segar 180Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Untuk Layar di Laju Segar 240Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Untuk Layar di Laju Segar 300Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Untuk Layar di Laju Segar 360Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Untuk Layar di Laju Segar 420Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Untuk Layar di Laju Segar 480Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Untuk Layar di Laju Segar 540Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Untuk Layar di Laju Segar 600Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Untuk Layar di Laju Segar 660Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Untuk Layar di Laju Segar 720Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Untuk Layar di Laju Segar 780Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Untuk Layar di Laju Segar 840Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Untuk Layar di Laju Segar 900Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Untuk Layar di Laju Segar 960Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Sisipan Bingkai Hitam - Bingkai Gelap" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 2d0a203156..994c0af0b1 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -1930,66 +1930,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Inserisce fotogrammi neri intra i quadri per una maggiore chiarezza del movimento. Usa solo l'opzione designata per la frequenza di aggiornamento corrente del display. Da non utilizzare a frequenze di aggiornamento non multipli di 60Hz come 144Hz, 165Hz, ecc. Non combinare con Intervallo di scambio > 1, sottoframe, ritardo del frame o Sincronizza per ottenere un quadro di contenuto esatto. Lasciare il sistema VRR è ok, proprio non quella impostazione. Se si nota -ogni- ritenzione temporanea del[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Per La Frequenza Di Aggiornamento Del Display 120Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Per La Frequenza Di Aggiornamento Del Display 180Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Per La Frequenza Di Aggiornamento Del Display 240Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Per La Frequenza Di Aggiornamento Dell'Esposizione 300Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Per La Frequenza Di Aggiornamento Del Display 360Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Per La Frequenza Di Aggiornamento Del Display 420Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Per La Frequenza Di Aggiornamento Del Display 480Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Per La Frequenza Di Aggiornamento Del Display 540Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Per La Frequenza Di Aggiornamento Del Display 600Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Per La Frequenza Di Aggiornamento Del Display 660Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Per La Frequenza Di Aggiornamento Del Display 720Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Per La Frequenza Di Aggiornamento Del Display 780Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Per La Frequenza Di Aggiornamento Dell'Esposizione 840Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Per La Frequenza Di Aggiornamento Dell'Esposizione 900Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Per La Frequenza Di Aggiornamento Del Display 960Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Inserimento Cornice Nera - Cornici Oscuri" @@ -2014,66 +1954,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Inserisce fotogrammi shader extra tra fotogrammi per ogni possibile effetto shader progettati per girare più velocemente del contenuto. Usa solo l'opzione designata per la frequenza di aggiornamento corrente del display. Da non utilizzare a frequenze di aggiornamento non multipli di 60Hz come 144Hz, 165Hz, ecc. Non combinare con Swap Interval > 1, BFI, Frame Delay, o Sincronizza per Esact Content Framerate. Lasciare il sistema VRR è ok, proprio non quella impostazione." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - Per La Frequenza Di Aggiornamento Del Display 120Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - Per La Frequenza Di Aggiornamento Del Display 180Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - Per La Frequenza Di Aggiornamento Del Display 240Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - Per La Frequenza Di Aggiornamento Del Display 300Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - Per La Frequenza Di Aggiornamento Del Display 360Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - Per La Frequenza Di Aggiornamento Del Display 420Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - Per La Frequenza Di Aggiornamento Del Display 480Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - Per La Frequenza Di Aggiornamento Del Display 540Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - Per La Frequenza Di Aggiornamento Del Display 600Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - Per La Frequenza Di Aggiornamento Del Display 660Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - Per La Frequenza Di Aggiornamento Del Display 720Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - Per La Frequenza Di Aggiornamento Del Display 780Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - Per La Frequenza Di Aggiornamento Dell'Esposizione 840Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - Per La Frequenza Di Aggiornamento Dell'Esposizione 900Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - Per La Frequenza Di Aggiornamento Del Display 960Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Screenshot con la GPU" diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 613b2d8e11..af333b5698 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -1966,66 +1966,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "フレーム間に黒フレームを挿入し、動きをより鮮明にします。現在のディスプレイのリフレッシュレート用に準備されたオプションのみを使用してください。144Hz、165Hz など、60Hz の倍数ではないリフレッシュレートでは使用できません。1 以上のスワップ間隔、フレーム遅延または正確なフレームレートに同期と組み合わせないでください。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - 120Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - 180Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - 240Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - 300Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - 360Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - 420Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - 480Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - 540Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - 600Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - 660Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - 720Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - 780Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - 840Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - 900Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - 960Hz ディスプレイ用リフレッシュレート" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "黒フレーム挿入 - 暗フレーム" @@ -2046,66 +1986,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "コンテンツフレームレートよりも高速に動作するように設計されたシェーダー効果用に、フレーム間に追加のシェーダーフレームを挿入します。現在のディスプレイ Hz に対応するオプションのみを使用してください。144Hz、165Hz など、60Hz の倍数ではないリフレッシュレートでは使用できません。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - 120Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - 180Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - 240Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - 300Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - 360Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - 420Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - 480Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - 540Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - 600Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - 660Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - 720Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - 780Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - 840Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - 900Hz ディスプレイ用リフレッシュレート" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - 960Hz ディスプレイ用リフレッシュレート" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "GPU スクリーンショット" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 62866f1ccc..e529973a98 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -1994,66 +1994,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "향상된 모션 선명도를 위해 프레임 사이에 검정색 프레임을 삽입합니다. 현재 디스플레이의 주사율과 일치하는 옵션만 사용하십시오. 144Hz, 165Hz 등과 같이 60Hz의 배수가 아닌 새로 고침 빈도에서는 사용하지 마십시오. 스왑 간격 > 1, 서브프레임, 프레임 지연, 정확한 프레임 동기화 설정들과 함께 사용하지 마십시오. 시스템의 VRR 설정을 켜두는 것은 괜찮습니다. 일시적인 화면 [...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - 120Hz 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - 180Hz용 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - 240Hz용 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - 300Hz용 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - 360Hz용 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - 420Hz 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - 480Hz 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - 540Hz용 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - 600Hz용 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - 660Hz용 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - 720Hz 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - 780Hz 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - 840Hz용 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - 900Hz용 디스플레이 주사율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - 960Hz용 디스플레이 주사율" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "검정색 프레임 삽입 - 어두운 프레임" @@ -2078,66 +2018,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "콘텐츠의 프레임 레이트보다 더 높은 프레임 레이트로 실행되도록 설계된 셰이더를 위해 프레임 사이에 추가 셰이더 프레임을 삽입합니다. 현재 디스플레이의 주사율과 일치하는 옵션만 사용하십시오. 144Hz, 165Hz 등과 같이 60Hz의 배수가 아닌 새로 고침 빈도에서는 사용하지 마십시오. 스왑 간격 > 1, 검정색 프레임 삽입, 프레임 지연, 정확한 프레임 동기화 설정들과 함께 사용[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - 120Hz 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - 180Hz용 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - 240Hz용 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - 300Hz용 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - 360Hz용 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - 420Hz 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - 480Hz 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - 540Hz용 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - 600Hz용 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - 660Hz용 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - 720Hz 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - 780Hz 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - 840Hz용 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - 900Hz용 디스플레이 주사율 전용" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - 960Hz용 디스플레이 주사율 전용" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "GPU 스크린샷 사용" diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index 1af40d919b..39e1d25e56 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -1938,66 +1938,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Wstawia czarne ramki pomiędzy ramkami w celu zwiększenia jasności ruchu. Użyj opcji tylko dla aktualnego wskaźnika odświeżania ekranu. Nie używać z szybkością odświeżania, które nie są wielokrotnościami 60Hz, takimi jak 144Hz, 165Hz itp. Nie łączyć z Interwalem Swap > 1, podramki, ramki Frame lub Synchronizuj z dokładną zawartością. Pozostawienie systemu VRR jest w porządku, a nie to ustawienie. Jeśli zauważysz dowolne tymczasowe zatrzymanie obrazu, powinieneś wyłącz[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Dla tempa odświeżania ekranu 120Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Dla tempa odświeżania ekranu 180Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Dla częstotliwości Odświeżania ekranu 240Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Dla częstotliwości odświeżania ekranu 300Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Dla częstotliwości odświeżania ekranu 360Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Dla częstotliwości odświeżania ekranu 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Dla częstotliwości odświeżania obrazu 480Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Częstotliwość odświeżania ekranu 540Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Dla częstotliwości odświeżania ekranu 600Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Dla częstotliwości odświeżania obrazu 660Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Przy częstotliwości odświeżania ekranu 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Przy częstotliwości odświeżania ekranu 780Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Dla częstotliwości odświeżania obrazu 840Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Dla częstotliwości odświeżania obrazu 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Przy częstotliwości odświeżania ekranu 960Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Wstawianie Czarnej Ramki - Ciemne Ramki" @@ -2022,66 +1962,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Wstawia dodatkowe klatki shaderów pomiędzy klatkami dla wszelkich możliwych efektów shaderów, które są zaprojektowane do działania szybciej niż częstotliwość zawartości. Używaj tylko opcji wyznaczonej dla bieżącej częstotliwości odświeżania wyświetlacza. Nie używać przy częstotliwościach odświeżania, które nie są wielokrotnościami 60 Hz, takich jak 144 Hz, 165 Hz itp. Nie łączyć z opcjami Interwał zmiany klatek > 1, BFI, Opóźnienie klatek lub Synchronizuj do d[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - Dla tempa odświeżania ekranu 120Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - Dla tempa odświeżania ekranu 180Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - Częstotliwość Odświeżania ekranu 240Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - Dla częstotliwości odświeżania ekranu 300Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - Dla częstotliwości odświeżania ekranu 360Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - Dla częstotliwości odświeżania ekranu 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - Częstotliwość odświeżania ekranu 480Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - Częstotliwość odświeżania ekranu 540Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - Dla częstotliwości odświeżania ekranu 600Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - Dla częstotliwości odświeżania obrazu 660Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - Przy częstotliwości odświeżania ekranu 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - Dla częstotliwości odświeżania obrazu 780Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - Dla częstotliwości odświeżania obrazu 840Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - Dla częstotliwości odświeżania obrazu 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - Przy częstotliwości odświeżania ekranu 960Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Zrzut ekranu GPU" diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 5bff6d35ac..30d792569c 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -1958,66 +1958,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Insere quadro(s) preto(s) entre quadros para maior clareza de movimento. Utilize apenas a opção designada para a sua taxa de atualização de exibição atual. Não é para uso em taxas de atualização que não são múltiplos de 60Hz, como 144Hz, 165Hz, etc. Não combine com o intervalo de troca > 1, sub-frames, Delay de Frame ou Sincronizar para Framerate de Conteúdo Exato. Deixar o sistema com o VRR está certo, apenas não está configurado. Se você notar a retenção de imagens em qual[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Para taxa de atualização de 120Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Para taxa de atualização de 180Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Para taxa de atualização de 240Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Para taxa de atualização de 300Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Para taxa de atualização de 360Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Para taxa de atualização de 420Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Para taxa de atualização de 480Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Para taxa de atualização de 540Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Para taxa de atualização de 600Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Para taxa de atualização de 660Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Para taxa de atualização de 720Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Para taxa de atualização de 780Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Para taxa de atualização de 840Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Para taxa de atualização de 900Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Para taxa de atualização de 960Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Inserção de Quadros Pretos - Quadros Escuros" @@ -2042,66 +1982,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Insere quadro(s) preto(s) entre quadros para maior nitidez. Utilize apenas a opção designada para a sua taxa de atualização de exibição atual. Não use em taxas de atualização que não são múltiplos de 60Hz, como 144Hz, 165Hz, etc. Não combine com o intervalo de troca > 1, subquadros, Delay de Frame ou Sincronizar para Framerate de Conteúdo Exato. Deixar o sistema com o VRR está certo, apenas não está configurado. Se você notar a retenção de imagens em qualquer momento, você d[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - Para taxa de atualização de 120Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - Para taxa de atualização de 180Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - Para taxa de atualização de 240Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - Para taxa de atualização de 300Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - Para taxa de atualização de 360Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - Para taxa de atualização de 420Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - Para taxa de atualização de 480Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - Para taxa de atualização de 540Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - Para taxa de atualização de 600Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - Para taxa de atualização de 660Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - Para taxa de atualização de 720Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - Para taxa de atualização de 780Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - Para taxa de atualização de 840Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - Para taxa de atualização de 900Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - Para taxa de atualização de 960Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Habilitar captura de tela da GPU" diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 2105e36210..d6bb9ff58a 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -1842,66 +1842,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Insere fotograma(s) preto(s) entre os fotogramas para maior nitidez do movimento. Utilize apenas a opção designada para a taxa de atualização do seu ecrã atual. Não deve ser utilizada em taxas de atualização que não sejam múltiplos de 60 Hz, como 144 Hz, 165 Hz, etc. Não combinar com Intervalo de troca > 1, subfotogramas, Atraso de fotogramas, ou Sincronizar com a frequência de fotogramas exata do conteúdo. Deixar o VRR do sistema ligado é aceitável, mas não esta definição. Se [...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Para uma taxa de atualização do ecrã de 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Para uma taxa de atualização do ecrã de 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Para uma taxa de atualização do ecrã de 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Para uma taxa de atualização do ecrã de 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Para uma taxa de atualização do ecrã de 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Para uma taxa de atualização do ecrã de 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Para uma taxa de atualização do ecrã de 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Para uma taxa de atualização do ecrã de 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Para uma taxa de atualização do ecrã de 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Para uma taxa de atualização do ecrã de 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Para uma taxa de atualização do ecrã de 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Para uma taxa de atualização do ecrã de 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Para uma taxa de atualização do ecrã de 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Para uma taxa de atualização do ecrã de 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Para uma taxa de atualização do ecrã de 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Inserir fotogramas a preto - Fotogramas escuros" @@ -1922,66 +1862,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Insere fotograma(s) de sombreador extra entre fotogramas para quaisquer efeitos de sombreador possíveis que tenham sido concebidos para serem executados mais rapidamente do que a taxa de conteúdo. Utilize apenas a opção designada para a taxa de atualização do seu ecrã atual. Não deve ser usada em taxas de atualização que não sejam múltiplos de 60 Hz, como 144 Hz, 165 Hz, etc. Não combinar com Intervalo de troca > 1, BFI, Atraso de fotogramas ou Sincronizar com a frequência de fotog[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - Para uma taxa de atualização do ecrã de 120 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - Para uma taxa de atualização do ecrã de 180 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - Para uma taxa de atualização do ecrã de 240 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - Para uma taxa de atualização do ecrã de 300 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - Para uma taxa de atualização do ecrã de 360 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - Para uma taxa de atualização do ecrã de 420 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - Para uma taxa de atualização do ecrã de 480 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - Para uma taxa de atualização do ecrã de 540 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - Para uma taxa de atualização do ecrã de 600 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - Para uma taxa de atualização do ecrã de 660 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - Para uma taxa de atualização do ecrã de 720 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - Para uma taxa de atualização do ecrã de 780 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - Para uma taxa de atualização do ecrã de 840 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - Para uma taxa de atualização do ecrã de 900 Hz" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - Para uma taxa de atualização do ecrã de 960 Hz" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Captura de ecrã com o GPU" diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 94f7e91064..0d088a5b06 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -1986,66 +1986,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Вставляет между кадрами кадр(ы) чёрного цвета для повышения чёткости движения. Исп. значение только для текущей частоты обновления. Не исп. с частотой не кратной 60 Гц, напр. 144, 165 Гц и т.д. Не вкл. вместе с интервалом обновления > 1, подкадрами, задержкой кадра или синхронизацие[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - для частоты обновления экрана 120 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - для частоты обновления экрана 180 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - для частоты обновления экрана 240 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - для частоты обновления экрана 300 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - для частоты обновления экрана 360 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - для частоты обновления экрана 420 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7- для частоты обновления экрана 480 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - для частоты обновления экрана 540 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - для частоты обновления экрана 600 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - для частоты обновления экрана 660 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - для частоты обновления экрана 720 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - для частоты обновления экрана 780 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - для частоты обновления экрана 840 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - для частоты обновления экрана 900 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - для частоты обновления экрана 960 Гц" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Вставка чёрного кадра - тёмные кадры" @@ -2070,66 +2010,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Вставляет между кадрами доп. кадр(ы) шейдера для всех шейдерных эффектов с частотой выше частоты контента. Исп. значение только для текущей частоты обновления. Не исп. с частотой обновления не кратной 60 Гц, например 144 Гц, 165 Гц и т.д. Не вкл. вместе с интервалом обновления > 1, в[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - для частоты обновления экрана 120 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - для частоты обновления экрана 180 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - для частоты обновления экрана 240 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - для частоты обновления экрана 300 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - для частоты обновления экрана 360 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - для частоты обновления экрана 420 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - для частоты обновления экрана 480 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - для частоты обновления экрана 540 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - для частоты обновления экрана 600 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - для частоты обновления экрана 660 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - для частоты обновления экрана 720 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - для частоты обновления экрана 780 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - для частоты обновления экрана 840 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - для частоты обновления экрана 900 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - для частоты обновления экрана 960 Гц" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Скриншоты с GPU" diff --git a/intl/msg_hash_sv.h b/intl/msg_hash_sv.h index 0b80fb85da..3ee7c2f062 100644 --- a/intl/msg_hash_sv.h +++ b/intl/msg_hash_sv.h @@ -1914,66 +1914,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Infogar svart(a) ram(ar) mellan bildrutorna för ökad rörelseklarhet. Använd endast det alternativ som är avsett för din aktuella bildskärms uppdateringsfrekvens. Används inte vid uppdateringsfrekvenser som inte är multiplar av 60 Hz, t. ex. 144 Hz, 165 Hz osv. Kombinera inte med Swap Interval > 1, subframes, Frame Delay eller Sync to Exact Content Framerate. Att låta systemets VRR vara på är ok, men inte med den inställningen. Om du märker - någon - tillfällig bildretention bör [...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - För 120Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - För 180Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - För 240Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - För 300Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - För 360Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - För 420Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - För 480Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - För 540Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - För 600Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - För 660Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - För 720Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - För 780Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - För 840Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - För 900Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - För 960Hz skärmuppdateringsfrekvens" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Infoga svart bildruta - Mörka bildrutor" @@ -1994,66 +1934,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Infogar extra shader-ram(ar) mellan bildrutorna för eventuella shader-effekter som är utformade för att köras snabbare än innehållshastigheten. Använd endast det alternativ som är avsett för din aktuella bildskärmsuppdateringsfrekvens. Används inte vid uppdateringsfrekvenser som inte är multiplar av 60 Hz, t. ex. 144 Hz, 165 Hz osv. Kombinera inte med Swap Interval > 1, BFI, Frame Delay eller Sync to Exact Content Framerate. Att låta systemets VRR vara på är ok, men inte den inst[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - För 120Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - För 180Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - För 240Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - För 300Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - För 360Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - För 420Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - För 480Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - För 540Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - För 600Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - För 660Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - För 720Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - För 780Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - För 840Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - För 900Hz skärmuppdateringsfrekvens" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - För 960Hz skärmuppdateringsfrekvens" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "GPU-skärmdump" diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 1d4f95656c..70c8ee2bbb 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -1970,66 +1970,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Gelişmiş hareket netliği için karelerin arasına siyah kareler ekler. Yalnızca mevcut ekran yenileme hızınız için belirlenen seçeneği kullanın. 144Hz, 165Hz vb. gibi 60Hz katı olmayan yenileme hızlarında kullanılmaz. Değiştirme Aralığı > 1 (Otomatik tamam), Kare Gecikmesi veya Tam İçerik Kare Hızına Eşitleme ile birleştirmeyin. Sistem VRR açık bırakmak normalde sorun değil ancak bu ayarla uygun değil. Herhangi bir geçici görüntü tutulması fark ederseniz, 120h[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - 120Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - 180Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - 240Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - 300Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - 360Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - 420Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - 480Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - 540Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - 600Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - 660Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - 720Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - 780Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - 840Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - 900Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - 960Hz Ekran Yenileme Hızı İçin" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Siyah Kare Ekleme - Koyu Kareler" @@ -2054,66 +1994,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "İçerik hızından daha hızlı çalışacak şekilde tasarlanmış olası gölgelendirici efektleri için kareler arasına fazladan gölgelendirici kareleri ekler. Yalnızca mevcut ekran yenileme hızınız için belirlenen seçeneği kullanın. 144Hz, 165Hz vb. gibi 60Hz katı olmayan yenileme hızlarında kullanılmaz. Takas Aralığı > 1, BFI, Kare Gecikmesi veya Tam İçerik Kare Hızına Eşitle ile birleştirmeyin. Sistem VRR açık bırakmak bu ayarda sorun çıkarmaz." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - 120Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - 180Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - 240Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - 300Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - 360Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - 420Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - 480Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - 540Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - 600Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - 660Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - 720Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - 780Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - 840Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - 900Hz Ekran Yenileme Hızı İçin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - 960Hz Ekran Yenileme Hızı İçin" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "GPU ile Ekran Görüntüsü" diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index 599ccbfa66..7fc6573ba4 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -1986,66 +1986,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Вставляє чорні рамки між кадрами для покращення чіткості руху. Використовуйте лише опцію, призначену для поточної частоти оновлення екрана. Не можна використовувати з частотою оновлення, не кратною 60 Гц, наприклад, 144 Гц, 165 Гц тощо. Не поєднуйте з інтервалом заміни > 1, під к[...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - Для частоти оновлення дисплея 120 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - Для частоти оновлення дисплея 180 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - Для частоти оновлення дисплея 240 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - Для частоти оновлення дисплея 300 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - Для частоти оновлення дисплея 360 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - Для частоти оновлення дисплея 420 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - Для частоти оновлення дисплея 480 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - Для частоти оновлення дисплея 540 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - Для частоти оновлення дисплея 600 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - Для частоти оновлення дисплея 660 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - Для частоти оновлення дисплея 720 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - Для частоти оновлення дисплея 780 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - Для частоти оновлення дисплея 840 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - Для частоти оновлення дисплея 900 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - Для частоти оновлення дисплея 960 Гц" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Вставка чорного кадру - темні кадри" @@ -2070,66 +2010,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Вставляє додатковий(і) кадр(и) шейдерів між кадрами для будь-яких можливих шейдерних ефектів, які мають працювати швидше за частоту оновлення вмісту. Використовуйте лише той параметр, який призначено для поточної частоти оновлення екрана. Не використовується при частоті [...]" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - Для частоти оновлення дисплея 120 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - Для частоти оновлення дисплея 180 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - Для частоти оновлення дисплея 240 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - Для частоти оновлення дисплея 300 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - Для частоти оновлення дисплея 360 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - Для частоти оновлення дисплея 420 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - Для частоти оновлення дисплея 480 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - Для частоти оновлення дисплея 540 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - Для частоти оновлення дисплея 600 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - Для частоти оновлення дисплея 660 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - Для частоти оновлення дисплея 720 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - Для частоти оновлення дисплея 780 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - Для частоти оновлення дисплея 840 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - Для частоти оновлення дисплея 900 Гц" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - Для частоти оновлення дисплея 960 Гц" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Зняток екрану силами GPU" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index aa1a6d0edd..4f8ed4a426 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2022,66 +2022,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, "Inserts black frame(s) inbetween frames for enhanced motion clarity. Only use option designated for your current display refresh rate. Not for use at refresh rates that are non-multiples of 60Hz such as 144Hz, 165Hz, etc. Do not combine with Swap Interval > 1, sub-frames, Frame Delay, or Sync to Exact Content Framerate. Leaving system VRR on is ok, just not that setting. If you notice -any- temporary image retention, you should disable at 120hz, and for higher hz adjust the dark frames setting below." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - "1 - For 120Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - "2 - For 180Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - "3 - For 240Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - "4 - For 300Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - "5 - For 360Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - "6 - For 420Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - "7 - For 480Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - "8 - For 540Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - "9 - For 600Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - "10 - For 660Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - "11 - For 720Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - "12 - For 780Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - "13 - For 840Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - "14 - For 900Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - "15 - For 960Hz Display Refresh Rate" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, "Black Frame Insertion - Dark Frames" @@ -2106,66 +2046,6 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, "Inserts extra shader frame(s) inbetween frames for any possible shader effects that are designed to run faster than content rate. Only use option designated for your current display refresh rate. Not for use at refresh rates that are non-multiples of 60Hz such as 144Hz, 165Hz, etc. Do not combine with Swap Interval > 1, BFI, Frame Delay, or Sync to Exact Content Framerate. Leaving system VRR on is ok, just not that setting." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - "2 - For 120Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - "3 - For 180Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - "4 - For 240Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - "5 - For 300Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - "6 - For 360Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - "7 - For 420Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - "8 - For 480Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - "9 - For 540Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - "10 - For 600Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - "11 - For 660Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - "12 - For 720Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - "13 - For 780Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - "14 - For 840Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - "15 - For 900Hz Display Refresh Rate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - "16 - For 960Hz Display Refresh Rate" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "GPU Screenshot" diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 82b990e8fe..d12b236a08 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -6382,41 +6382,13 @@ static size_t setting_get_string_representation_black_frame_insertion(rarch_sett { if (setting) { - switch (*setting->value.target.unsigned_integer) - { - case 0: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len); - case 1: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120), len); - case 2: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180), len); - case 3: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240), len); - case 4: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300), len); - case 5: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360), len); - case 6: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420), len); - case 7: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480), len); - case 8: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540), len); - case 9: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600), len); - case 10: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660), len); - case 11: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720), len); - case 12: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780), len); - case 13: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840), len); - case 14: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900), len); - case 15: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960), len); - } + unsigned value = *setting->value.target.unsigned_integer; + + if (value == 0) + return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len); + else + return snprintf(s, len, "%u (%u/50, %u/60, %u/70 Hz)", + value, ((value + 1) * 50), ((value + 1) * 60), ((value + 1) * 70)); } return 0; } @@ -6426,41 +6398,13 @@ static size_t setting_get_string_representation_shader_subframes( { if (setting) { - switch (*setting->value.target.unsigned_integer) - { - case 1: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len); - case 2: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120), len); - case 3: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180), len); - case 4: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240), len); - case 5: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300), len); - case 6: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360), len); - case 7: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420), len); - case 8: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480), len); - case 9: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540), len); - case 10: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600), len); - case 11: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660), len); - case 12: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720), len); - case 13: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780), len); - case 14: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840), len); - case 15: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900), len); - case 16: - return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960), len); - } + unsigned value = *setting->value.target.unsigned_integer; + + if (value == 1) + return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len); + else + return snprintf(s, len, "%u (%u/50, %u/60, %u/70 Hz)", + value, (value * 50), (value * 60), (value * 70)); } return 0; } diff --git a/msg_hash.h b/msg_hash.h index d4afd2092a..013a4d47ec 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1495,38 +1495,6 @@ enum msg_hash_enums MENU_LABEL(VIDEO_SWAP_INTERVAL), MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL_AUTO, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, - MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, - - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_960, - MENU_LABEL(VIDEO_FULLSCREEN), MENU_LBL_H(VIDEO_MONITOR_INDEX), MENU_LABEL(VIDEO_WIIU_PREFER_DRC), From cd78050c79ca4b2de586a69b61ebff47a2807606 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 14 May 2025 00:16:16 +0000 Subject: [PATCH 079/175] Fetch translations from Crowdin --- intl/googleplay_sv.json | 2 +- intl/msg_hash_be.h | 8 ------- intl/msg_hash_ca.h | 16 -------------- intl/msg_hash_cht.h | 8 ------- intl/msg_hash_cs.h | 8 ------- intl/msg_hash_de.h | 8 +++---- intl/msg_hash_en.h | 8 ------- intl/msg_hash_es.h | 12 +++++++++-- intl/msg_hash_fr.h | 16 -------------- intl/msg_hash_gl.h | 8 ------- intl/msg_hash_hu.h | 8 ------- intl/msg_hash_it.h | 16 -------------- intl/msg_hash_ko.h | 8 ------- intl/msg_hash_ru.h | 8 ------- intl/msg_hash_sv.h | 46 +++++++++++++++++++++++++++++++++-------- intl/msg_hash_tr.h | 8 +++---- intl/msg_hash_uk.h | 8 ------- intl/progress.h | 12 +++++------ 18 files changed, 62 insertions(+), 146 deletions(-) diff --git a/intl/googleplay_sv.json b/intl/googleplay_sv.json index 5a14d128be..26ed223ff7 100644 --- a/intl/googleplay_sv.json +++ b/intl/googleplay_sv.json @@ -1,4 +1,4 @@ { - "main-desc": "RetroArch är ett open source-projekt som använder ett kraftfullt utvecklingsgränssnitt som heter Libretro. Libretro är ett gränssnitt som gör att du kan skapa kross-plattformsapplikationer som kan använda många funktioner som OpenGL, stöd för kross-plattformskamera, platsstöd och mer i framtiden.\n\nDet kommer med dess egena inbyggda samling applikationer för att ge dig en \"one-stop-shop\" för underhållning.\n\nLibretro och RetroArch passar perfekt för att skapa spel, emulatorer och multimediaprogram. Om du vill lära dig mer, gå till vår webbplats (listad nedan).\nVIKTIGT!!!\n\nRetroArch är ett mångsidigt program, vilket betyder att du behöver modulära program som vi kallar \"kärnor\" för att det ska kunna göra någonting. Dessa kärnor FÖLJER INTE MED. Du måste gå till \"Online Uppdateraren -> Kärnuppdateraren\" inifrån appen för att ladda ner dem.\n\nFUNKTIONER:\n* Ögon-godismenyer att välja mellan!\n* Skanna filer / kataloger och lägg till dem i spelsystemsamlingar!\n* Visa databasinformation om varje spel när de är tillagda i en samling!\n* Ladda ner program (\"kärnor\") online\n* Uppdatera allt!\n* Ladda ner Game & Watch spel och spela dem med vår exklusiva Game & Watch-emulator!\n* Inbyggd mappning av kontroller\n* Möjlighet att mappa om kontroller\n* Möjlighet att skriva in och ladda fusk\n* Flerspråkigt stöd!\n* Över 80+ program (\"kärnor\") nu och det ökar!\n* Spela multiplayer med NetPlay!\n* Ta skärmdumpar, spara ögonblicksbilder och mer!\n\n* Ingen DRM\n* Inga begränsningar för användning\n* Öppen källkod\n* Inga push-annonser\n* Ingen spionering\n* Inga annonser alls\n\nGå med oss på discord för support och matchmaking via netplay\nhttps://discord.gg/C4amCeV\n\nBesök vår Youtube-kanal här för handledning, spel, nyheter och utvecklingsframsteg!\nhttps://www.youtube.com/user/libretro\nhttps://www.youtube.com/RetroArchOfficial\n\nFör information och hjälp, se vår dokumentationssida -\nhttps://docs.libretro.com/\n\nBesök vår hemsida!\nhttps://www.retroarch.com/\n\nwww.libretro.com", + "main-desc": "RetroArch är ett projekt med öppen källkod som använder ett kraftfullt utvecklingsgränssnitt som heter Libretro. Libretro är ett gränssnitt som gör att du kan skapa kross-plattformsapplikationer som kan använda många funktioner som OpenGL, stöd för korsplattformskamera, platsstöd och mer i framtiden.\n\nDet kommer med dess egena inbyggda samling applikationer för att ge dig en \"one-stop-shop\" för underhållning.\n\nLibretro och RetroArch passar perfekt för att skapa spel, emulatorer och multimediaprogram. Om du vill lära dig mer, gå till vår webbplats (listad nedan).\nVIKTIGT!!!\n\nRetroArch är ett mångsidigt program, vilket betyder att du behöver modulära program som vi kallar \"kärnor\" för att det ska kunna göra någonting. Dessa kärnor FÖLJER INTE MED. Du måste gå till \"Online Uppdateraren -> Kärnuppdateraren\" inifrån appen för att ladda ner dem.\n\nFUNKTIONER:\n* Ögongodismenyer att välja mellan!\n* Skanna filer / kataloger och lägg till dem i spelsystemsamlingar!\n* Visa databasinformation om varje spel när de är tillagda i en samling!\n* Hämta ner program (\"kärnor\") online\n* Uppdatera allt!\n* Hämta ner Game & Watch-spel och spela dem med vår exklusiva Game & Watch-emulator!\n* Inbyggd mappning av kontroller\n* Möjlighet att mappa om kontroller\n* Möjlighet att skriva in och ladda fusk\n* Flerspråkigt stöd!\n* Över 80+ program (\"kärnor\") nu och det ökar!\n* Spela multiplayer med NetPlay!\n* Ta skärmdumpar, spara ögonblicksbilder och mer!\n\n* Ingen DRM\n* Inga begränsningar för användning\n* Öppen källkod\n* Inga push-annonser\n* Ingen spionering\n* Inga annonser alls\n\nGå med oss på discord för support och matchmaking via netplay\nhttps://discord.gg/C4amCeV\n\nBesök vår Youtube-kanal här för handledning, spel, nyheter och utvecklingsframsteg!\nhttps://www.youtube.com/user/libretro\nhttps://www.youtube.com/RetroArchOfficial\n\nFör information och hjälp, se vår dokumentationssida -\nhttps://docs.libretro.com/\n\nBesök vår hemsida!\nhttps://www.retroarch.com/\n\nwww.libretro.com", "short-desc": "Retrospel och emulatorer på din enhet!" } diff --git a/intl/msg_hash_be.h b/intl/msg_hash_be.h index a4b10b038b..7fa69d81e1 100644 --- a/intl/msg_hash_be.h +++ b/intl/msg_hash_be.h @@ -3656,18 +3656,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Адключыць левы аналагавы стык у меню" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Прадухіліць пераход па меню левым аналагавымі стыкам." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Адключыць правы аналагавы стык у меню" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Прадухіліць пераход па меню правым аналагавымі стыкам." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Замена кнопак кіравання меню Згода ды Скасаванне" diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 8ffda7f782..32b2cac154 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -3688,34 +3688,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Inhabilita el botó d’informació" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Si aquesta opció està activada, la funció d'informació estarà desactivada." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Inhabilita el botó de cerca" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Si aquesta opció està activada, la funció de cerca estarà desactivada." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Deshabilita analògic esquerre en el menú" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Impedeix que el joystick esquerra pugui navegar pels menús." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Deshabilita l'analògic dret en els menús" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Impedeix que el joystick dret pugui navegar pels menús." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "El menú inverteix els botons d'OK i Cancel·la" diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index ddc4e9e68f..dc44ab6b73 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -3496,18 +3496,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "選單禁用左類比搖桿" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "停用左類比搖桿瀏覽選單。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "選單禁用右類比搖桿" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "停用右類比搖桿瀏覽選單。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "交換確定和返回的按鍵" diff --git a/intl/msg_hash_cs.h b/intl/msg_hash_cs.h index f7be5e469d..42063f7108 100644 --- a/intl/msg_hash_cs.h +++ b/intl/msg_hash_cs.h @@ -3636,18 +3636,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Zakázat levý analog v menu" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Zabránění navigaci levou analogovou páčkou v menu." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Zakázat pravý analog v menu" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Zabránění navigaci pravou analogovou páčkou v menu." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu pro nahrazení tlačítek OK a Storno" diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 0439b4f854..eff04492fd 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -3602,7 +3602,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Wenn aktiviert, wird die Info-Funktion ausgeschaltet." + "Menü-Info-Funktion verhindern." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, @@ -3610,7 +3610,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Wenn aktiviert, wird die Suchfunktion ausgeschaltet." + "Menü-Suchen-Funktion verhindern." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, @@ -3618,7 +3618,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Linken Analogstick am Navigieren im Menü hindern." + "Eingabe von linkem Analogstick im Menü verhindern." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, @@ -3626,7 +3626,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Rechten Analogstick am Navigieren im Menü hindern." + "Eingabe von rechtem Analogstick im Menü verhindern. Der rechte Analogstick wechselt die Miniaturansichten in Wiedergabelisten durch." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, diff --git a/intl/msg_hash_en.h b/intl/msg_hash_en.h index 56761872ad..0d104e2f9d 100644 --- a/intl/msg_hash_en.h +++ b/intl/msg_hash_en.h @@ -544,18 +544,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Disable Left Analogue in Menu" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Prevent Left Analogue stick from navigating in menu." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Disable Right Analogue in Menu" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Prevent Right Analogue stick from navigating in menu." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu Swap Okay and Cancel Buttons" diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index bb66627645..cde15cf8a7 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -3696,17 +3696,25 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Desactivar botón Información" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, + "Evita que aparezca la opción Información en el menú." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Desactivar botón Buscar" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, + "Evita que aparezca la opción Buscar en el menú." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Desactivar analógico izquierdo en menús" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Impide que el stick analógico izquierdo pueda navegar por los menús." + "Evita que el stick analógico izquierdo pueda mover el menú." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, @@ -3714,7 +3722,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Impide que el stick analógico derecho pueda navegar por los menús." + "Evita que el stick analógico derecho pueda mover el menú. El stick analógico derecho cambia las miniaturas de las listas de reproducción." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 711ea2daab..65e306ff75 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -3656,34 +3656,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Désactiver la touche d'informations" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Si activé, la fonction d'informations sera désactivée." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Désactiver la touche de recherche" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Si activé, la fonction de recherche sera désactivée." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Désactiver le stick analogique gauche dans le menu" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Empêche le stick analogique gauche de naviguer dans le menu." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Désactiver le stick analogique droit dans le menu" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Empêche le stick analogique droit de naviguer dans le menu." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Inverser les touches OK/Annuler dans le menu" diff --git a/intl/msg_hash_gl.h b/intl/msg_hash_gl.h index c1d6d7f858..0b499e9997 100644 --- a/intl/msg_hash_gl.h +++ b/intl/msg_hash_gl.h @@ -3660,18 +3660,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Desactivar o analóxico esquerdo no menú" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Previr que a panca (stick) analóxica esquerda navegue no menú." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Desactivar o analóxico dereito no menú" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Previr que a panca (stick) analóxica dereita navegue no menú." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Botóns Intercambiar menú Aceptar e Cancelar" diff --git a/intl/msg_hash_hu.h b/intl/msg_hash_hu.h index 817dcf55a1..8209697bc0 100644 --- a/intl/msg_hash_hu.h +++ b/intl/msg_hash_hu.h @@ -3692,18 +3692,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "A bal analóg kar letiltása a menüben" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "A bal analóg kar nem használható menünavigációhoz." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "A jobb analóg kar letiltása a menüben" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "A jobb analóg kar nem használható menünavigációhoz." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Az OK és Mégse gombok felcserélése a menüben" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 2d0a203156..d588070ab3 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -3624,34 +3624,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Disabilita Pulsante Info" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Se abilitata, la funzione Info sarà disabilitata." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Disabilita Pulsante Ricerca" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Se abilitata, la funzione di ricerca sarà disabilitata." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Disabilita l'analogico sinistro nel menu" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Impedisci all'analogico sinistro di navigare nel menu." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Disabilita l'analogico destro nel menu" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Impedisci all'analogico destro di navigare nel menu." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu: Scambia pulsanti OK e Annulla" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 62866f1ccc..ff55416023 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -3732,18 +3732,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "메뉴에서 왼쪽 아날로그 비활성화" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "메뉴를 탐색할 때 왼쪽 아날로그 스틱을 비활성화합니다." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "메뉴에서 오른쪽 아날로그 비활성화" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "메뉴를 탐색할 때 오른쪽 아날로그 스틱을 비활성화합니다." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "확인/취소 버튼 반전" diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 94f7e91064..b2483d970c 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -3724,18 +3724,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Отключить левый стик в меню" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Не использовать левый аналоговый стик для навигации по меню." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Отключить правый стик в меню" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Не использовать правый аналоговый стик для навигации по меню." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Поменять кнопки OK и Отмена" diff --git a/intl/msg_hash_sv.h b/intl/msg_hash_sv.h index 0b80fb85da..542aa90040 100644 --- a/intl/msg_hash_sv.h +++ b/intl/msg_hash_sv.h @@ -3488,18 +3488,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Inaktivera vänster analog i meny" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Förhindra vänster analog spak från menynavigering." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Inaktivera höger analog i meny" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Förhindra höger analog spak från menynavigering." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Skifta OK/Avbryt-knappen" @@ -8638,10 +8630,18 @@ MSG_HASH( MENU_ENUM_SUBLABEL_REMAP_FILE_LOAD, "Läs in och ersätt nuvarande inmatningsmappningar." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_SAVE_AS, + "Spara aktuella inmatningsmappningar som en ny ommappningsfil." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, "Spara spelommappningsfil" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_GAME, + "Ta bort fil för spelommappningar" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_RESET, "Nollställ inmatningsmappning" @@ -10776,7 +10776,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_EXIT, - "&Avsluta" + "A&vsluta" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_MENU_EDIT, @@ -12130,6 +12130,14 @@ MSG_HASH( MSG_PLAYLIST_MANAGER_REFRESH_INVALID_CORE, "Uppdatering misslyckades - ogiltig kärna: " ) +MSG_HASH( + MSG_PLAYLIST_MANAGER_REFRESH_INVALID_DAT_FILE, + "Uppdatering misslyckades - ogiltig/saknad arcade DAT-fil: " + ) +MSG_HASH( + MSG_PLAYLIST_MANAGER_REFRESH_DAT_FILE_TOO_LARGE, + "Uppdatering misslyckades - arcade DAT-filen är för stor (otillräckligt med minne): " + ) MSG_HASH( MSG_ADDED_TO_FAVORITES, "Tillagd i favoriter" @@ -13122,6 +13130,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "Du måste pausa eller inaktivera Hardcore-läget för prestationer för att läsa in tillstånd." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "Du måste pausa eller inaktivera hardcoreläget för prestationer för att läsa in srm-sparningar." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "Ett sparat tillstånd lästes in. Hardcore-läget för prestationer inaktiverades för aktuell session." @@ -13254,6 +13266,18 @@ MSG_HASH( MSG_ERROR_REMOVING_SHADER_PRESET, "Fel vid borttagning av shader-förval." ) +MSG_HASH( + MSG_MANUAL_CONTENT_SCAN_DAT_FILE_INVALID, + "Ogiltig arcade DAT-fil vald." + ) +MSG_HASH( + MSG_MANUAL_CONTENT_SCAN_DAT_FILE_TOO_LARGE, + "Vald arcade DAT-fil är för stor (otillräckligt med ledigt minne)." + ) +MSG_HASH( + MSG_MANUAL_CONTENT_SCAN_DAT_FILE_LOAD_ERROR, + "Misslyckades med att läsa in arcade DAT-fil (ogiltigt format?)" + ) MSG_HASH( MSG_MANUAL_CONTENT_SCAN_INVALID_CONFIG, "Ogiltig konfiguration för manuell genomsökning." @@ -13306,6 +13330,10 @@ MSG_HASH( MSG_RESTORING_CORE, "Återställer kärna: " ) +MSG_HASH( + MSG_CORE_INSTALLATION_ALREADY_INSTALLED, + "Vald kärnfil är redan installerad: " + ) MSG_HASH( MSG_INSTALLING_CORE, "Installerar kärna: " diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 1d4f95656c..44b88f2eb4 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -3698,7 +3698,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, - "Etkinleştirilirse Bilgi fonksiyonu devre dışı bırakılır." + "Menü bilgisi fonksiyonunu engelle." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, @@ -3706,7 +3706,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, - "Etkinleştirilirse Arama fonksiyonu devre dışı bırakılır." + "Menü arama fonksiyonunu engelle." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, @@ -3714,7 +3714,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Sol Analog çubuğun menüde gezinmesini önleyin." + "Menü sol analog çubuk girişini engelle." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, @@ -3722,7 +3722,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Sağ Analog çubuğun menüde gezinmesini önleyin." + "Menü sağ analog çubuk girişini engelle. Sağ analog çubuk, oynatma listelerindeki küçük resimleri döndürür." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index 599ccbfa66..55d84c98de 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -3716,18 +3716,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Вимкніть лівий аналоговий сигнал у меню" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, - "Запобігання навігації лівим аналоговим джойстиком у меню." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Вимкніть Right Analog у меню" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, - "Заборонити правій аналоговій ручці навігацію в меню." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Поміняти місцями кнопки ОК та Скасувати" diff --git a/intl/progress.h b/intl/progress.h index 53e733c3b6..409e3b710b 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -7,7 +7,7 @@ #define LANGUAGE_PROGRESS_ASTURIAN_APPROVED 9 /* Belarusian */ -#define LANGUAGE_PROGRESS_BELARUSIAN_TRANSLATED 98 +#define LANGUAGE_PROGRESS_BELARUSIAN_TRANSLATED 97 #define LANGUAGE_PROGRESS_BELARUSIAN_APPROVED 0 /* Bulgarian */ @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -47,7 +47,7 @@ #define LANGUAGE_PROGRESS_ESPERANTO_APPROVED 0 /* Spanish */ -#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 100 #define LANGUAGE_PROGRESS_SPANISH_APPROVED 91 /* Persian */ @@ -59,8 +59,8 @@ #define LANGUAGE_PROGRESS_FINNISH_APPROVED 45 /* French */ -#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 100 -#define LANGUAGE_PROGRESS_FRENCH_APPROVED 100 +#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_FRENCH_APPROVED 99 /* Galician */ #define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 99 @@ -132,7 +132,7 @@ /* Swedish */ #define LANGUAGE_PROGRESS_SWEDISH_TRANSLATED 87 -#define LANGUAGE_PROGRESS_SWEDISH_APPROVED 50 +#define LANGUAGE_PROGRESS_SWEDISH_APPROVED 51 /* Turkish */ #define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 100 From 1886f76bba901c2fa6a4f5489c23f737b2771b7b Mon Sep 17 00:00:00 2001 From: sonninnos Date: Wed, 14 May 2025 15:12:04 +0300 Subject: [PATCH 080/175] Frame delay menu string fix --- menu/menu_setting.c | 56 +++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index d12b236a08..d0a633d8d1 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -6425,43 +6425,45 @@ static size_t setting_get_string_representation_video_frame_delay( value = *setting->value.target.unsigned_integer; - if (!settings->bools.video_frame_delay_auto - || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST))) - { - if (value >= 20) - _len = snprintf(s, len, "%u%% (%ums)", - value, - (unsigned)(1 / settings->floats.video_refresh_rate - * 1000 * (value / 100.0f))); - else - _len = snprintf(s, len, "%ums", value); - return _len; - } - menu_stack = MENU_LIST_GET(menu_st->entries.list, 0); if (menu_stack && menu_stack->size) label = menu_stack->list[menu_stack->size - 1].label; - if (value == 0) + /* Non-automatic and dropdown list */ + if ( !settings->bools.video_frame_delay_auto + || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST))) { - _len = strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_AUTOMATIC), len); - if (!string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST))) - _len += snprintf(s + _len, len - _len, " (%ums %s)", - video_st->frame_delay_effective, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_EFFECTIVE)); + if (value == 0) + _len = snprintf(s, len, "%s", + (settings->bools.video_frame_delay_auto) + ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_AUTOMATIC) + : msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)); + else if (value >= 20) + _len = snprintf(s, len, "%u%% (%ums)", + value, + (unsigned)(1 / settings->floats.video_refresh_rate * 1000 * (value / 100.0f))); + else + _len = snprintf(s, len, "%ums", value); + return _len; } + + /* Automatic delay also shows current effective delay */ + if (value == 0) + _len = snprintf(s, len, "%s (%ums %s)", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_AUTOMATIC), + video_st->frame_delay_effective, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_EFFECTIVE)); else if (value >= 20) _len = snprintf(s, len, "%u%% (%ums, %ums %s)", - value, - (unsigned)(1 / settings->floats.video_refresh_rate - * 1000 * (value / 100.0f)), - video_st->frame_delay_effective, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_EFFECTIVE)); + value, + (unsigned)(1 / settings->floats.video_refresh_rate * 1000 * (value / 100.0f)), + video_st->frame_delay_effective, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_EFFECTIVE)); else _len = snprintf(s, len, "%ums (%ums %s)", - value, - video_st->frame_delay_effective, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_EFFECTIVE)); + value, + video_st->frame_delay_effective, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY_EFFECTIVE)); return _len; } From b1da352de60b2c9f8b6d655480fd2ca6d6c67c27 Mon Sep 17 00:00:00 2001 From: Ningyuan Li Date: Thu, 31 Oct 2024 20:01:07 +0900 Subject: [PATCH 081/175] Properly ships libSDL2 for webOS Updated some build config --- Makefile.webos | 9 ++++++--- gfx/drivers_context/sdl_gl_ctx.c | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Makefile.webos b/Makefile.webos index f774f23505..01c15bd5c1 100644 --- a/Makefile.webos +++ b/Makefile.webos @@ -5,10 +5,10 @@ ifneq ($(CROSS_COMPILE),arm-webos-linux-gnueabi-) endif ifdef SDKTARGETSYSROOT - $(warning OE-based toolchain isn't supported anymore. Please use https://github.com/webosbrew/native-toolchain) + $(warning "OE-based toolchain isn't supported anymore. Please use https://github.com/webosbrew/native-toolchain") STAGING_DIR = $(SDKTARGETSYSROOT) else ifndef STAGING_DIR - $(error Can't find buildroot based toolchain. Please use https://github.com/webosbrew/native-toolchain) + $(error "Can't find buildroot based toolchain. Please use https://github.com/webosbrew/native-toolchain") endif WEBOS_FREETYPE_CONFIG ?= $(STAGING_DIR)/usr/bin/freetype-config @@ -17,7 +17,7 @@ WEBOS_INC_DIR ?= $(STAGING_DIR)/usr/include WEBOS_LIB_DIR ?= $(STAGING_DIR)/usr/lib ADD_SDL2_LIB ?= 0 -SDL2_PREBUILT_ARCHIVE ?= https://github.com/webosbrew/SDL-webOS/releases/download/release-2.30.0-webos.2/SDL2-2.30.0-webos.tar.gz +SDL2_PREBUILT_ARCHIVE ?= https://github.com/webosbrew/SDL-webOS/releases/download/release-2.30.8-webos.3/SDL2-2.30.8-webos-abi.tar.gz ######################### ######################### @@ -151,6 +151,7 @@ DEFINES += -DHAVE_FILTERS_BUILTIN DEFINES += -DHAVE_SDL2 DEFINES += -DHAVE_PULSE DEFINES += -DHAVE_NETWORKING -DHAVE_IFINFO -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES +DEFINES += -DHAVE_NETWORKGAMEPAD DEFINES += -DHAVE_UPDATE_CORE_INFO PKG_CONFIG=pkg-config @@ -159,6 +160,8 @@ SDL2_CFLAGS := $(shell $(PKG_CONFIG) --cflags sdl2) SDL2_LIBS := $(shell $(PKG_CONFIG) --libs sdl2) OPENGLES_LIBS = -lGLESv2 PULSE_LIBS = $(shell $(PKG_CONFIG) --libs libpulse) +FREETYPE_CFLAGS := $(shell $(WEBOS_FREETYPE_CONFIG) --cflags) +FREETYPE_LIBS := $(shell $(WEBOS_FREETYPE_CONFIG) --libs) MMAP_LIBS = -lc NEON_CFLAGS = -mfpu=neon NEON_ASFLAGS = -mfpu=neon diff --git a/gfx/drivers_context/sdl_gl_ctx.c b/gfx/drivers_context/sdl_gl_ctx.c index 48ced42505..2920cee070 100644 --- a/gfx/drivers_context/sdl_gl_ctx.c +++ b/gfx/drivers_context/sdl_gl_ctx.c @@ -109,7 +109,7 @@ static void *sdl_ctx_init(void *video_driver) #ifdef WEBOS SDL_SetHint(SDL_HINT_WEBOS_ACCESS_POLICY_KEYS_BACK, "true"); SDL_SetHint(SDL_HINT_WEBOS_ACCESS_POLICY_KEYS_EXIT, "true"); - SDL_SetHint(SDL_HINT_WEBOS_CURSOR_SLEEP_TIME, "1000"); + SDL_SetHint(SDL_HINT_WEBOS_CURSOR_SLEEP_TIME, "5000"); #endif /* Initialise graphics subsystem, if required */ From ce406353ccf63afff52b8325321e55d4cd2a3e16 Mon Sep 17 00:00:00 2001 From: Ningyuan Li Date: Thu, 31 Oct 2024 21:15:42 +0900 Subject: [PATCH 082/175] added webOS default fonts --- Makefile.webos | 13 ++++++++----- gfx/drivers_font_renderer/freetype.c | 4 ++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Makefile.webos b/Makefile.webos index 01c15bd5c1..8a2ec10994 100644 --- a/Makefile.webos +++ b/Makefile.webos @@ -60,8 +60,8 @@ HAVE_DR_MP3 = 1 HAVE_DYNAMIC = 1 HAVE_DYLIB = 1 HAVE_EGL = 0 -HAVE_FREETYPE = 0 -HAVE_GDI = 1 +HAVE_FREETYPE = 1 +HAVE_GDI = 0 HAVE_GETADDRINFO = 1 HAVE_GETOPT_LONG = 1 HAVE_GLSL = 1 @@ -107,7 +107,7 @@ HAVE_RUNAHEAD = 1 HAVE_SDL = 0 HAVE_SDL2 = 1 HAVE_SHADERPIPELINE = 1 -HAVE_STB_FONT = 1 +HAVE_STB_FONT = 0 HAVE_STB_IMAGE = 1 HAVE_STB_VORBIS = 1 HAVE_STDIN_CMD = 1 @@ -152,6 +152,7 @@ DEFINES += -DHAVE_SDL2 DEFINES += -DHAVE_PULSE DEFINES += -DHAVE_NETWORKING -DHAVE_IFINFO -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES DEFINES += -DHAVE_NETWORKGAMEPAD +DEFINES += -DHAVE_FREETYPE DEFINES += -DHAVE_UPDATE_CORE_INFO PKG_CONFIG=pkg-config @@ -160,8 +161,10 @@ SDL2_CFLAGS := $(shell $(PKG_CONFIG) --cflags sdl2) SDL2_LIBS := $(shell $(PKG_CONFIG) --libs sdl2) OPENGLES_LIBS = -lGLESv2 PULSE_LIBS = $(shell $(PKG_CONFIG) --libs libpulse) -FREETYPE_CFLAGS := $(shell $(WEBOS_FREETYPE_CONFIG) --cflags) -FREETYPE_LIBS := $(shell $(WEBOS_FREETYPE_CONFIG) --libs) +FREETYPE_CFLAGS := $(shell $(PKG_CONFIG) --cflags freetype2) +FREETYPE_LIBS := $(shell $(PKG_CONFIG) --libs freetype2) +FONTCONFIG_CFLAGS := $(shell $(PKG_CONFIG) --cflags fontconfig) +FONTCONFIG_LIBS := $(shell $(PKG_CONFIG) --libs fontconfig) MMAP_LIBS = -lc NEON_CFLAGS = -mfpu=neon NEON_ASFLAGS = -mfpu=neon diff --git a/gfx/drivers_font_renderer/freetype.c b/gfx/drivers_font_renderer/freetype.c index 2f014409ff..74a637ed35 100644 --- a/gfx/drivers_font_renderer/freetype.c +++ b/gfx/drivers_font_renderer/freetype.c @@ -403,6 +403,10 @@ static const char *font_paths[] = { "/Library/Fonts/Microsoft/Candara.ttf", "/Library/Fonts/Verdana.ttf", "/Library/Fonts/Tahoma.ttf", +#elif defined(WEBOS) + "/usr/share/fonts/MuseoSans-Medium.ttf", + "/usr/share/fonts/LG_Smart_UI-Regular.ttf", + "/usr/share/fonts/DroidSans.ttf", #else "/usr/share/fonts/TTF/DejaVuSansMono.ttf", "/usr/share/fonts/TTF/DejaVuSans.ttf", From f260d3edab206e007f4fd9aa17c72095d914bf24 Mon Sep 17 00:00:00 2001 From: Ningyuan Li Date: Thu, 31 Oct 2024 22:39:57 +0900 Subject: [PATCH 083/175] changed package version #7 --- Makefile.webos | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.webos b/Makefile.webos index 8a2ec10994..03f0fe888b 100644 --- a/Makefile.webos +++ b/Makefile.webos @@ -22,7 +22,7 @@ SDL2_PREBUILT_ARCHIVE ?= https://github.com/webosbrew/SDL-webOS/releases/downloa ######################### ######################### -PACKAGE_NAME = com.retroarch +PACKAGE_NAME ?= com.retroarch.webos PACKAGE_VERSION := $(patsubst "%",%,$(RARCH_VERSION)) DEBUG ?= 0 @@ -294,7 +294,7 @@ install: ipk ares-install webos/$(PACKAGE_NAME)_$(PACKAGE_VERSION)_$(ARCH).ipk launch: install - ares-launch com.retroarch + ares-launch $(PACKAGE_NAME) .PHONY: all clean ipk From 5b0fb964436ebac8dd45814129645b3b756af490 Mon Sep 17 00:00:00 2001 From: Ningyuan Li Date: Thu, 31 Oct 2024 22:59:26 +0900 Subject: [PATCH 084/175] added release workflow --- .github/workflows/webOS.yml | 45 ++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/.github/workflows/webOS.yml b/.github/workflows/webOS.yml index adca736991..dbaee893de 100644 --- a/.github/workflows/webOS.yml +++ b/.github/workflows/webOS.yml @@ -2,14 +2,18 @@ name: CI webOS on: push: + tags-ignore: + - '*' + branches: + - '*' pull_request: + release: + types: [ published ] repository_dispatch: - types: [run_build] - -permissions: - contents: read + types: [ run_build ] env: + PACKAGE_NAME: com.retroarch.webos ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true jobs: @@ -28,6 +32,14 @@ jobs: fileName: "ares-package_*.deb" out-file-path: "temp" + - name: Download Manifest Generator + uses: robinraju/release-downloader@v1.9 + with: + repository: "webosbrew/dev-toolbox-cli" + latest: true + fileName: "webosbrew-toolbox-gen-manifest_*.deb" + out-file-path: "temp" + - name: Update packages run: sudo apt-get -yq update @@ -50,6 +62,29 @@ jobs: ./arm-webos-linux-gnueabi_sdk-buildroot/relocate-sdk.sh - name: Compile RA + shell: bash run: | . /tmp/arm-webos-linux-gnueabi_sdk-buildroot/environment-setup - make -f Makefile.webos ADD_SDL2_LIB=1 -j$(getconf _NPROCESSORS_ONLN) info all + make -f Makefile.webos ipk PACKAGE_NAME=${PACKAGE_NAME} ADD_SDL2_LIB=1 -j$(getconf _NPROCESSORS_ONLN) + + - name: Generate Manifest + shell: bash + run: | + . version.all + webosbrew-gen-manifest -o webos/${PACKAGE_NAME}.manifest.json \ + -p webos/${PACKAGE_NAME}_${RARCH_VERSION}_arm.ipk \ + -i https://github.com/webosbrew/RetroArch/raw/webos/webos/icon160.png \ + -l https://github.com/webosbrew/RetroArch + + - name: Release + if: github.event_name == 'release' + uses: ncipollo/release-action@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.event.release.tag_name }} + allowUpdates: true + omitNameDuringUpdate: true + omitBody: true + omitPrereleaseDuringUpdate: true + artifacts: webos/*.ipk,webos/*.manifest.json +>>>>>>> 0c0fb0eaf4 (added release workflow) From 9c9d68ae20117d208c53b1257ee2e9147b2658f6 Mon Sep 17 00:00:00 2001 From: Craig Carnell Date: Wed, 14 May 2025 13:20:21 +0100 Subject: [PATCH 085/175] Fix missing package name on webos --- Makefile.webos | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.webos b/Makefile.webos index 03f0fe888b..ec07052eb5 100644 --- a/Makefile.webos +++ b/Makefile.webos @@ -22,7 +22,7 @@ SDL2_PREBUILT_ARCHIVE ?= https://github.com/webosbrew/SDL-webOS/releases/downloa ######################### ######################### -PACKAGE_NAME ?= com.retroarch.webos +APP_PACKAGE_NAME ?= com.retroarch.webos PACKAGE_VERSION := $(patsubst "%",%,$(RARCH_VERSION)) DEBUG ?= 0 @@ -197,7 +197,7 @@ RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ)) define APPINFO { - "id": "$(PACKAGE_NAME)", + "id": "$(APP_PACKAGE_NAME)", "version": "$(PACKAGE_VERSION)", "vendor": "webosbrew.org", "title": "RetroArch", @@ -291,10 +291,10 @@ endif cd webos && ares-package dist install: ipk - ares-install webos/$(PACKAGE_NAME)_$(PACKAGE_VERSION)_$(ARCH).ipk + ares-install webos/$(APP_PACKAGE_NAME)_$(PACKAGE_VERSION)_$(ARCH).ipk launch: install - ares-launch $(PACKAGE_NAME) + ares-launch $(APP_PACKAGE_NAME) .PHONY: all clean ipk From 667b16964bde82e66189cfb425f2989145a6cba0 Mon Sep 17 00:00:00 2001 From: Craig Carnell Date: Wed, 14 May 2025 16:45:15 +0100 Subject: [PATCH 086/175] Add artifact build for webOS --- .github/workflows/webOS.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/webOS.yml b/.github/workflows/webOS.yml index dbaee893de..ff833a2c9e 100644 --- a/.github/workflows/webOS.yml +++ b/.github/workflows/webOS.yml @@ -67,6 +67,16 @@ jobs: . /tmp/arm-webos-linux-gnueabi_sdk-buildroot/environment-setup make -f Makefile.webos ipk PACKAGE_NAME=${PACKAGE_NAME} ADD_SDL2_LIB=1 -j$(getconf _NPROCESSORS_ONLN) + - name: Get short SHA + id: slug + run: echo "sha8=$(echo ${GITHUB_SHA} | cut -c1-8)" >> $GITHUB_OUTPUT + + - uses: actions/upload-artifact@v4 + with: + name: com.retroarch.webos_${{ steps.slug.outputs.sha8 }}_arm.ipk + path: | + webos/*.ipk + - name: Generate Manifest shell: bash run: | @@ -87,4 +97,3 @@ jobs: omitBody: true omitPrereleaseDuringUpdate: true artifacts: webos/*.ipk,webos/*.manifest.json ->>>>>>> 0c0fb0eaf4 (added release workflow) From cc57bbc06e87cb6770d83345e760d20df6ecb5cd Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Wed, 14 May 2025 22:37:05 +0300 Subject: [PATCH 087/175] Turbo mode corrections (#17905) --- input/input_driver.c | 45 +++++++++++++++++++++++--------------------- menu/menu_setting.c | 2 +- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 4c1c7a86e0..d88516a0e7 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1505,19 +1505,20 @@ static int16_t input_state_device( #endif } - /* Don't allow turbo for D-pad unless explicitly allowed. */ - if ( (id < RETRO_DEVICE_ID_JOYPAD_UP) - || ( ((settings->bools.input_turbo_allow_dpad || settings->ints.input_turbo_bind != -1) - || (id > RETRO_DEVICE_ID_JOYPAD_RIGHT)) - && (id <= RETRO_DEVICE_ID_JOYPAD_R3))) + if (id <= RETRO_DEVICE_ID_JOYPAD_R3) { - /* - * Apply turbo button if activated. - */ + /* Apply turbo button if activated. */ uint8_t turbo_period = settings->uints.input_turbo_period; uint8_t turbo_duty_cycle = settings->uints.input_turbo_duty_cycle; uint8_t turbo_mode = settings->uints.input_turbo_mode; + /* Don't allow classic mode turbo for D-pad unless explicitly allowed. */ + if ( turbo_mode <= INPUT_TURBO_MODE_CLASSIC_TOGGLE + && !settings->bools.input_turbo_allow_dpad + && id >= RETRO_DEVICE_ID_JOYPAD_UP + && id <= RETRO_DEVICE_ID_JOYPAD_RIGHT) + break; + if (turbo_duty_cycle == 0) turbo_duty_cycle = turbo_period / 2; @@ -1528,9 +1529,16 @@ static int16_t input_state_device( if (turbo_mode > INPUT_TURBO_MODE_CLASSIC_TOGGLE) { - /* Pressing turbo button toggles turbo mode on or off. - * Holding the button will - * pass through, else the pressed state will be modulated by a + unsigned turbo_button = settings->uints.input_turbo_button; + unsigned remap_button = settings->uints.input_remap_ids[port][turbo_button]; + + /* Single button modes only care about the defined button. */ + if (id != remap_button) + break; + + /* Pressing turbo bind toggles turbo button on or off. + * Holding the button will pass through, else + * the pressed state will be modulated by a * periodic pulse defined by the configured duty cycle. */ @@ -1539,13 +1547,10 @@ static int16_t input_state_device( input_st->turbo_btns.turbo_pressed[port] &= ~(1 << 31); else if (input_st->turbo_btns.turbo_pressed[port] >= 0) { - unsigned turbo_button = settings->uints.input_turbo_button; - unsigned remap_button = settings->uints.input_remap_ids[port][turbo_button]; - input_st->turbo_btns.turbo_pressed[port] |= (1 << 31); - /* Toggle turbo for selected buttons. */ - if (input_st->turbo_btns.enable[port] != (1 << remap_button)) - input_st->turbo_btns.enable[port] = (1 << remap_button); + /* Toggle turbo for selected button. */ + if (input_st->turbo_btns.enable[port] != (1 << id)) + input_st->turbo_btns.enable[port] = (1 << id); input_st->turbo_btns.mode1_enable[port] ^= 1; } @@ -1559,8 +1564,6 @@ static int16_t input_state_device( { uint16_t enable_new; input_st->turbo_btns.turbo_pressed[port] |= 1 << id; - /* Toggle turbo for pressed button but make - * sure at least one button has turbo */ enable_new = input_st->turbo_btns.enable[port] ^ (1 << id); if (enable_new) input_st->turbo_btns.enable[port] = enable_new; @@ -1579,8 +1582,8 @@ static int16_t input_state_device( } else if (turbo_mode == INPUT_TURBO_MODE_CLASSIC) { - /* If turbo button is held, all buttons pressed except - * for D-pad will go into a turbo mode. Until the button is + /* If turbo button is held, all buttons pressed + * will go into a turbo mode. Until the button is * released again, the input state will be modulated by a * periodic pulse defined by the configured duty cycle. */ diff --git a/menu/menu_setting.c b/menu/menu_setting.c index d0a633d8d1..c965b56507 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -15912,7 +15912,7 @@ static bool setting_append_list( general_read_handler); (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; (*list)[list_info->index - 1].offset_by = 1; - menu_settings_list_current_add_range(list, list_info, 1, 100, 1, true, true); + menu_settings_list_current_add_range(list, list_info, 2, 100, 1, true, true); CONFIG_UINT( list, list_info, From b5cbe6eaed4269ccb6f6162fc1be529b136e7f1a Mon Sep 17 00:00:00 2001 From: sonninnos Date: Wed, 14 May 2025 23:32:37 +0300 Subject: [PATCH 088/175] Clean up input + latency menus --- menu/menu_displaylist.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index c8d5cdeed7..2cea74a3cc 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -8067,10 +8067,15 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_INPUT_MENU_SETTINGS, PARSE_ACTION, true }, {MENU_ENUM_LABEL_INPUT_HAPTIC_FEEDBACK_SETTINGS, PARSE_ACTION, true }, {MENU_ENUM_LABEL_INPUT_MAX_USERS, PARSE_ONLY_UINT, true }, + {MENU_ENUM_LABEL_INPUT_AUTO_MOUSE_GRAB, PARSE_ONLY_BOOL, true }, + {MENU_ENUM_LABEL_INPUT_AUTO_GAME_FOCUS, PARSE_ONLY_UINT, true }, + {MENU_ENUM_LABEL_PAUSE_ON_DISCONNECT, PARSE_ONLY_BOOL, true }, + {MENU_ENUM_LABEL_QUIT_PRESS_TWICE, PARSE_ONLY_BOOL, true }, + {MENU_ENUM_LABEL_INPUT_BIND_TIMEOUT, PARSE_ONLY_UINT, true }, + {MENU_ENUM_LABEL_INPUT_BIND_HOLD, PARSE_ONLY_UINT, true }, {MENU_ENUM_LABEL_INPUT_AUTODETECT_ENABLE, PARSE_ONLY_BOOL, true }, {MENU_ENUM_LABEL_INPUT_REMAP_BINDS_ENABLE, PARSE_ONLY_BOOL, true }, {MENU_ENUM_LABEL_INPUT_REMAP_SORT_BY_CONTROLLER_ENABLE, PARSE_ONLY_BOOL, true }, - {MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR, PARSE_ONLY_UINT, true }, {MENU_ENUM_LABEL_INPUT_ICADE_ENABLE, PARSE_ONLY_BOOL, true }, {MENU_ENUM_LABEL_INPUT_SMALL_KEYBOARD_ENABLE, PARSE_ONLY_BOOL, true }, {MENU_ENUM_LABEL_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, PARSE_ONLY_UINT, true }, @@ -8092,19 +8097,15 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_INPUT_TOUCH_VMOUSE_TRACKBALL, PARSE_ONLY_BOOL, true }, {MENU_ENUM_LABEL_INPUT_TOUCH_VMOUSE_GESTURE, PARSE_ONLY_BOOL, true }, #endif - {MENU_ENUM_LABEL_INPUT_BIND_TIMEOUT, PARSE_ONLY_UINT, true }, - {MENU_ENUM_LABEL_INPUT_BIND_HOLD, PARSE_ONLY_UINT, true }, - {MENU_ENUM_LABEL_QUIT_PRESS_TWICE, PARSE_ONLY_BOOL, true }, - {MENU_ENUM_LABEL_PAUSE_ON_DISCONNECT, PARSE_ONLY_BOOL, true }, - {MENU_ENUM_LABEL_INPUT_AUTO_MOUSE_GRAB, PARSE_ONLY_BOOL, true }, - {MENU_ENUM_LABEL_INPUT_AUTO_GAME_FOCUS, PARSE_ONLY_UINT, true }, + {MENU_ENUM_LABEL_INPUT_SENSORS_ENABLE, PARSE_ONLY_BOOL, true }, #if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) {MENU_ENUM_LABEL_INPUT_NOWINKEY_ENABLE, PARSE_ONLY_BOOL, true }, #endif #ifdef ANDROID {MENU_ENUM_LABEL_ANDROID_INPUT_DISCONNECT_WORKAROUND, PARSE_ONLY_BOOL, true }, + {MENU_ENUM_LABEL_INPUT_BLOCK_TIMEOUT, PARSE_ONLY_UINT, true }, #endif - {MENU_ENUM_LABEL_INPUT_SENSORS_ENABLE, PARSE_ONLY_BOOL, true }, + {MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR, PARSE_ONLY_UINT, true }, }; for (i = 0; i < ARRAY_SIZE(build_list); i++) @@ -10405,12 +10406,6 @@ unsigned menu_displaylist_build_list( bool preempt_enabled = settings->bools.preemptive_frames_enable; #endif menu_displaylist_build_info_selective_t build_list[] = { - {MENU_ENUM_LABEL_AUDIO_LATENCY, PARSE_ONLY_UINT, true }, -#ifdef HAVE_MICROPHONE - {MENU_ENUM_LABEL_MICROPHONE_LATENCY, PARSE_ONLY_UINT, true }, -#endif - {MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR, PARSE_ONLY_UINT, true }, - {MENU_ENUM_LABEL_INPUT_BLOCK_TIMEOUT, PARSE_ONLY_UINT, true }, {MENU_ENUM_LABEL_VIDEO_FRAME_DELAY_AUTO, PARSE_ONLY_BOOL, true }, {MENU_ENUM_LABEL_VIDEO_FRAME_DELAY, PARSE_ONLY_UINT, true }, #ifdef HAVE_RUNAHEAD @@ -10418,6 +10413,10 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_RUN_AHEAD_FRAMES, PARSE_ONLY_UINT, false }, {MENU_ENUM_LABEL_PREEMPT_FRAMES, PARSE_ONLY_UINT, false }, {MENU_ENUM_LABEL_RUN_AHEAD_HIDE_WARNINGS, PARSE_ONLY_BOOL, false }, +#endif + {MENU_ENUM_LABEL_AUDIO_LATENCY, PARSE_ONLY_UINT, true }, +#ifdef HAVE_MICROPHONE + {MENU_ENUM_LABEL_MICROPHONE_LATENCY, PARSE_ONLY_UINT, true }, #endif }; From 13616bafe0c4305cccbbfc432444a623208a1fd2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 15 May 2025 00:15:17 +0000 Subject: [PATCH 089/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 16 ++++++++++++++++ intl/msg_hash_fr.h | 16 ++++++++++++++++ intl/msg_hash_hu.h | 40 ++++++++++++++++++++++++++++++++++++++++ intl/msg_hash_it.h | 4 ++++ intl/msg_hash_ko.h | 34 +++++++++++++++++++++++++++++++--- intl/msg_hash_ru.h | 18 +++++++++++++++++- intl/progress.h | 14 +++++++------- 7 files changed, 131 insertions(+), 11 deletions(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index f5720f1c24..e8bf45dc6b 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -3568,18 +3568,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Inhabilita el botó d’informació" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, + "Evita que aparegui el menú d'informació." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Inhabilita el botó de cerca" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, + "Evita que aparegui el menú de cerca." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Deshabilita analògic esquerre en el menú" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, + "Evita que el joystick analògic esquerre pugui moure el menú." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Deshabilita l'analògic dret en els menús" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, + "Evita que el joystick analògic dret pugui moure el menú. El joystick analògic dret canvia les miniatures de les llistes de reproducció." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "El menú inverteix els botons d'OK i Cancel·la" diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 234b88cd45..f5242ecb15 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -3536,18 +3536,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Désactiver la touche d'informations" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, + "Empêcher la fonction info dans le menu." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Désactiver la touche de recherche" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, + "Empêcher la fonction de recherche dans le menu." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Désactiver le stick analogique gauche dans le menu" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, + "Empêcher l'entrée du stick analogique gauche dans le menu." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Désactiver le stick analogique droit dans le menu" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, + "Empêcher l'entrée du stick analogique droit dans le menu. Le stick analogique droit fait défiler les miniatures dans les listes de lecture." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Inverser les touches OK/Annuler dans le menu" diff --git a/intl/msg_hash_hu.h b/intl/msg_hash_hu.h index 907b1c82b1..881b9bc1b3 100644 --- a/intl/msg_hash_hu.h +++ b/intl/msg_hash_hu.h @@ -1492,6 +1492,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Felhasználó" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Felhasználónevek, fiókok, és az adatvédelem beállításai." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Könyvtárak" @@ -3564,18 +3568,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Info gomb kikapcsolása" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, + "Az Info funkció kikapcsolása a menüben." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Keresés gomb kikapcsolása" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, + "A Keresés funkció kikapcsolása a menüben." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "A bal analóg kar letiltása a menüben" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, + "A bal analóg kar letiltása a menüben." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "A jobb analóg kar letiltása a menüben" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, + "A jobb analóg kar letiltása a menüben. A jobb analóg kar a bélyegképeket váltja a játéklistákban." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Az OK és Mégse gombok felcserélése a menüben" @@ -3827,6 +3847,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "Az aktuális shadert be/ki kapcsolja." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "Shaderek (pillanatgomb)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "Az éppen kiválasztott shader ki/be kapcsolása, amíg a gomb le van nyomva." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "Következő shader" @@ -6950,6 +6978,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD, "A megadott értéknél kevésbé széles/magas bélyegképeket automatikusan felskálázza. Javítja a képminőséget, mérsékelt hatása van a teljesítményre." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, + "Háttér a bélyegképekhez" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, "A bélyegképek körüli felhasználatlan terület kitöltése tömör háttérszínnel. Ez javítja a menü megjelenését, ha változó méretű bélyegképek szerepelnek benne, mert azokat egyenletes méretben jeleníti meg." @@ -11540,6 +11572,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE, "Második bélyegkép megjelenítése \"Lista\" típusú nézetekben. Csak akkor érvényes, ha a képernyő ténylegesen elég széles két bélyegképhez." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, + "Háttér a bélyegképekhez" + ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, "A bélyegképek körüli felhasználatlan terület kitöltése tömör háttérszínnel. Ez javítja a menü megjelenését, ha változó méretű bélyegképek szerepelnek benne, mert azokat egyenletes méretben jeleníti meg." @@ -14470,6 +14506,10 @@ MSG_HASH( MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, "A Hardcore trófea módot fel kell függeszteni vagy ki kell kapcsolni az állás betöltéséhez." ) +MSG_HASH( + MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, + "A Hardcore trófea módot fel kell függeszteni vagy ki kell kapcsolni az srm mentések betöltéséhez." + ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, "Állás betöltve. A Hardcore trófea mód letiltva a mostani játékmenet idejére." diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 6bdcf90f24..c66e6d67f9 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -1468,6 +1468,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "Utente" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Cambia le impostazioni di privacy, account e username." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "Cartella" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 4470a911e9..1f0d81632f 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -1520,6 +1520,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, "사용자" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "개인정보 보호, 계정, 사용자 이름 등의 설정을 변경합니다." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, "디렉토리" @@ -3604,18 +3608,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "정보 버튼 사용 안 함" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, + "메뉴 정보 기능을 비활성화합니다." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "검색 버튼 사용 안 함" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, + "메뉴 검색 기능을 비활성화합니다." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "메뉴에서 왼쪽 아날로그 비활성화" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, + "메뉴에서 왼쪽 아날로그 스틱 입력을 비활성화합니다." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "메뉴에서 오른쪽 아날로그 비활성화" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, + "메뉴에서 오른쪽 아날로그 스틱 입력을 비활성화합니다. 오른쪽 아날로그 스틱은 실행목록 화면에서 미리보기를 전환하는 데 사용됩니다." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "확인/취소 버튼 반전" @@ -3867,6 +3887,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_SHADER_TOGGLE, "현재 선택된 셰이더를 활성화/비활성화합니다." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_HOLD, + "셰이더 (홀드)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_SHADER_HOLD, + "현재 선택된 셰이더를 키가 눌려있는 동안 활성화/비활성화합니다." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, "다음 셰이더" @@ -7008,7 +7036,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_BACKGROUND_ENABLE, - "썸네일 백그라운드" + "미리보기 배경" ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_THUMBNAIL_BACKGROUND_ENABLE, @@ -11818,7 +11846,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, - "썸네일 백그라운드" + "미리보기 배경" ) MSG_HASH( MENU_ENUM_SUBLABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE, @@ -14836,7 +14864,7 @@ MSG_HASH( ) MSG_HASH( MSG_CHEEVOS_LOAD_SAVEFILE_PREVENTED_BY_HARDCORE_MODE, - "Srm 저장 파일을 불러오려면 업적 하드코어 모드를 일시 정지하거나 비활성화해야 합니다." + "srm 저장 파일을 불러오려면 도전과제 하드코어 모드를 일시 정지하거나 비활성화해야 합니다." ) MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 6cf4545a21..d7e414b946 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -3594,20 +3594,36 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, - "Отключить кнопку подсказки" + "Отключить кнопку описания" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, + "Отключает функцию вызова описания в меню." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Отключить кнопку поиска" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, + "Отключает функцию поиска в меню." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Отключить левый стик в меню" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, + "Отключает левый аналоговый стик в меню." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Отключить правый стик в меню" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, + "Отключает правый аналоговый стик в меню. Отклонения стика переключают миниатюры в плейлистах." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Поменять кнопки OK и Отмена" diff --git a/intl/progress.h b/intl/progress.h index 409e3b710b..727a9f9897 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -1,5 +1,5 @@ /* Arabic */ -#define LANGUAGE_PROGRESS_ARABIC_TRANSLATED 44 +#define LANGUAGE_PROGRESS_ARABIC_TRANSLATED 45 #define LANGUAGE_PROGRESS_ARABIC_APPROVED 0 /* Asturian */ @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -59,8 +59,8 @@ #define LANGUAGE_PROGRESS_FINNISH_APPROVED 45 /* French */ -#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 99 -#define LANGUAGE_PROGRESS_FRENCH_APPROVED 99 +#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_FRENCH_APPROVED 100 /* Galician */ #define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 99 @@ -75,7 +75,7 @@ #define LANGUAGE_PROGRESS_CROATIAN_APPROVED 0 /* Hungarian */ -#define LANGUAGE_PROGRESS_HUNGARIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_HUNGARIAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_HUNGARIAN_APPROVED 0 /* Indonesian */ @@ -91,7 +91,7 @@ #define LANGUAGE_PROGRESS_JAPANESE_APPROVED 0 /* Korean */ -#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_KOREAN_APPROVED 0 /* Dutch */ @@ -115,7 +115,7 @@ #define LANGUAGE_PROGRESS_PORTUGUESE_BRAZILIAN_APPROVED 9 /* Portuguese */ -#define LANGUAGE_PROGRESS_PORTUGUESE_TRANSLATED 29 +#define LANGUAGE_PROGRESS_PORTUGUESE_TRANSLATED 28 #define LANGUAGE_PROGRESS_PORTUGUESE_APPROVED 0 /* Russian */ From a77049b02219b9eaed9212db35961bf7b48cd24f Mon Sep 17 00:00:00 2001 From: Aleksey Samoilov Date: Thu, 15 May 2025 20:52:02 +0400 Subject: [PATCH 090/175] Bump required wayland-protocols (#17908) --- qb/config.libs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index c19fe32a9d..3553b997d5 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -564,7 +564,7 @@ check_header '' XSHM X11/Xlib.h X11/extensions/XShm.h check_val '' XKBCOMMON -lxkbcommon '' xkbcommon 0.3.2 '' false check_val '' WAYLAND '-lwayland-egl -lwayland-client' '' wayland-egl 10.1.0 '' false check_val '' WAYLAND_CURSOR -lwayland-cursor '' wayland-cursor 1.12 '' false -check_pkgconf WAYLAND_PROTOS wayland-protocols 1.32 +check_pkgconf WAYLAND_PROTOS wayland-protocols 1.37 check_pkgconf WAYLAND_SCANNER wayland-scanner '1.15 1.12' if [ "$HAVE_WAYLAND_SCANNER" = yes ] && From f1538b1326c8ad8d3d69a13765fbb88a11221183 Mon Sep 17 00:00:00 2001 From: Craig Carnell Date: Fri, 16 May 2025 12:53:10 +0100 Subject: [PATCH 091/175] Add target cpu and tune for webOS --- Makefile.webos | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile.webos b/Makefile.webos index ec07052eb5..fafb316a10 100644 --- a/Makefile.webos +++ b/Makefile.webos @@ -138,9 +138,10 @@ DEF_FLAGS += -ffunction-sections -fdata-sections DEF_FLAGS += -I. -Ideps -Ideps/stb -DWEBOS=1 -MMD DEF_FLAGS += -Wall -Wno-unused-variable LIBS := -ldl -lz -lrt -pthread -CFLAGS := -CXXFLAGS := -fno-exceptions -fno-rtti -std=c++11 -D__STDC_CONSTANT_MACROS -ASFLAGS := +ARCHFLAGS := -mcpu=cortex-a9 -mtune=cortex-a53 -mfloat-abi=softfp +CFLAGS := $(ARCHFLAGS) +CXXFLAGS := $(ARCHFLAGS) -fno-exceptions -fno-rtti -std=c++11 -D__STDC_CONSTANT_MACROS +ASFLAGS := $(ARCHFLAGS) LDFLAGS := -Wl,-rpath=\$$ORIGIN/lib,--gc-sections INCLUDE_DIRS = -I$(WEBOS_INC_DIR) LIBRARY_DIRS = -L$(WEBOS_LIB_DIR) From 537bc2dbe9c96b9597988a04005ed8379b8f6336 Mon Sep 17 00:00:00 2001 From: pstef <3462925+pstef@users.noreply.github.com> Date: Sat, 17 May 2025 09:13:54 +0000 Subject: [PATCH 092/175] Fix broken logic in the clean target --- Makefile.psl1ght | 9 +++------ Makefile.vita | 9 ++++----- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Makefile.psl1ght b/Makefile.psl1ght index cbff2b32ff..d23b43c708 100644 --- a/Makefile.psl1ght +++ b/Makefile.psl1ght @@ -159,11 +159,8 @@ pkg: create-core # $(PACKAGE_FINALIZE) $(PACKAGE_BASENAME).gnpdrm.pkg clean: -ifneq ($(V),1) - @echo RM -else - rm -f $(ELF_TARGET) - rm -f $(OBJ) -endif + @$(if $(Q), echo $@,) + $(Q)rm -f $(ELF_TARGET) + $(Q)rm -f $(OBJ) .PHONY: clean diff --git a/Makefile.vita b/Makefile.vita index 7a1c715a30..eb0db08950 100644 --- a/Makefile.vita +++ b/Makefile.vita @@ -274,11 +274,10 @@ $(TARGET).elf: $(OBJ) liblibScePiglet_stub.a vita-pack-vpk -s param.sfo -b $< $@ clean: -ifneq ($(V),1) - rm -f $(OBJ) $(TARGET).elf $(TARGET).elf.unstripped.elf $(TARGET).velf $(TARGET).self param.sfo $(TARGET).vpk - rm -rf deps/Pigs-In-A-Blanket/piglet_stub/libScePiglet - rm -f $(OBJ:.o=.depend) -endif + @$(if $(Q), echo $@,) + $(Q)rm -f $(OBJ) $(TARGET).elf $(TARGET).elf.unstripped.elf $(TARGET).velf $(TARGET).self param.sfo $(TARGET).vpk + $(Q)rm -rf deps/Pigs-In-A-Blanket/piglet_stub/libScePiglet + $(Q)rm -f $(OBJ:.o=.depend) # Useful for developers vpksend: $(TARGET).vpk From 97bc2da36c2e4a2c0b5d82843e08f35c67ee145c Mon Sep 17 00:00:00 2001 From: sonninnos Date: Sat, 17 May 2025 18:53:17 +0300 Subject: [PATCH 093/175] Fix menu core unload --- menu/cbs/menu_cbs_ok.c | 12 ++++++++++++ menu/cbs/menu_cbs_start.c | 5 +++-- menu/menu_setting.c | 1 - tasks/task_content.c | 2 ++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 99a5f25b25..101f7f0ef3 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -7785,6 +7785,17 @@ static int action_ok_start_core(const char *path, return 0; } +static int action_ok_unload_core(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + struct menu_state *menu_st = menu_state_get_ptr(); + int ret = generic_action_ok_command(CMD_EVENT_UNLOAD_CORE); + path_clear(RARCH_PATH_CORE_LAST); + menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH + | MENU_ST_FLAG_PREVENT_POPULATE; + return 0; +} + static int action_ok_contentless_core_run(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -9030,6 +9041,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_FILE_BROWSER_CORE, action_ok_load_core}, {MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION,action_ok_core_deferred_set}, {MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION_CURRENT_CORE,action_ok_core_deferred_set}, + {MENU_ENUM_LABEL_CORE_LIST_UNLOAD, action_ok_unload_core}, {MENU_ENUM_LABEL_START_CORE, action_ok_start_core}, {MENU_ENUM_LABEL_START_NET_RETROPAD, action_ok_start_net_retropad_core}, {MENU_ENUM_LABEL_START_VIDEO_PROCESSOR, action_ok_start_video_processor_core}, diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index 97f50ce12e..3a07faa3b2 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -39,6 +39,7 @@ #endif #include "../../retroarch.h" #include "../../verbosity.h" +#include "../../paths.h" #include "../../performance_counters.h" #include "../../playlist.h" #include "../../manual_content_scan.h" @@ -634,8 +635,8 @@ static int action_start_load_core( unsigned type, size_t idx, size_t entry_idx) { struct menu_state *menu_st = menu_state_get_ptr(); - int ret = generic_action_ok_command( - CMD_EVENT_UNLOAD_CORE); + int ret = generic_action_ok_command(CMD_EVENT_UNLOAD_CORE); + path_clear(RARCH_PATH_CORE_LAST); menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH | MENU_ST_FLAG_PREVENT_POPULATE; return ret; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index c965b56507..f3119835a0 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9884,7 +9884,6 @@ static bool setting_append_list( &group_info, &subgroup_info, parent_group); - MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_UNLOAD_CORE); } } diff --git a/tasks/task_content.c b/tasks/task_content.c index 6fb9f22f4c..233654820b 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -2114,6 +2114,7 @@ bool task_push_load_content_from_playlist_from_menu( * > Forget manually loaded core */ path_set(RARCH_PATH_CORE, core_path); path_clear(RARCH_PATH_CORE_LAST); + #ifdef HAVE_DYNAMIC command_event(CMD_EVENT_LOAD_CORE, NULL); #else @@ -2469,6 +2470,7 @@ bool task_push_load_content_with_new_core_from_menu( path_set(RARCH_PATH_CONTENT, fullpath); path_set(RARCH_PATH_CORE, core_path); + path_clear(RARCH_PATH_CORE_LAST); #ifdef HAVE_DYNAMIC /* Load core */ From b632a1373edc478ee44c26a837086cdf6e9fdc89 Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Sat, 17 May 2025 21:58:57 -0400 Subject: [PATCH 094/175] cloud sync: don't always trust the server hash --- tasks/task_cloudsync.c | 67 ++++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 15 deletions(-) diff --git a/tasks/task_cloudsync.c b/tasks/task_cloudsync.c index 975efaf287..c3bae6165f 100644 --- a/tasks/task_cloudsync.c +++ b/tasks/task_cloudsync.c @@ -541,20 +541,35 @@ static void task_cloud_sync_backup_file(struct item_file *file) filestream_rename(file->path, new_path); } +typedef struct +{ + task_cloud_sync_state_t *sync_state; + struct item_file *server_file; +} task_cloud_sync_fetch_state_t; + static void task_cloud_sync_fetch_cb(void *user_data, const char *path, bool success, RFILE *file) { - task_cloud_sync_state_t *sync_state = (task_cloud_sync_state_t *)user_data; - char *hash = NULL; + task_cloud_sync_fetch_state_t *fetch_state = (task_cloud_sync_fetch_state_t *)user_data; + task_cloud_sync_state_t *sync_state; + struct item_file *server_file; + char *hash = NULL; - if (!sync_state) + if (!fetch_state) return; + sync_state = fetch_state->sync_state; + server_file = fetch_state->server_file; + if (success && file) { hash = task_cloud_sync_md5_rfile(file); filestream_close(file); RARCH_LOG(CSPFX "successfully fetched %s\n", path); task_cloud_sync_add_to_updated_manifest(sync_state, path, hash, false); + task_cloud_sync_add_to_updated_manifest(sync_state, path, hash, true); + /* if the file fetched from the server does not match its own hash, the manifest needs to be updated */ + if (!string_is_equal(hash, CS_FILE_HASH(server_file))) + sync_state->need_manifest_uploaded = true; sync_state->downloads++; } else @@ -564,34 +579,43 @@ static void task_cloud_sync_fetch_cb(void *user_data, const char *path, bool suc RARCH_WARN(CSPFX "failed to fetch %s\n", path); else RARCH_WARN(CSPFX "failed to write file from server: %s\n", path); + task_cloud_sync_add_to_updated_manifest(sync_state, path, CS_FILE_HASH(server_file), true); sync_state->failures = true; } slock_lock(tcs_running_lock); sync_state->waiting--; slock_unlock(tcs_running_lock); + + free(fetch_state); } static void task_cloud_sync_fetch_server_file(task_cloud_sync_state_t *sync_state) { - size_t i; - char filename[PATH_MAX_LENGTH]; - char directory[DIR_MAX_LENGTH]; - struct string_list *dirlist = task_cloud_sync_directory_map(); - struct item_file *server_file = &sync_state->server_manifest->list[sync_state->server_idx]; - const char *key = CS_FILE_KEY(server_file); + size_t i; + char filename[PATH_MAX_LENGTH]; + char directory[DIR_MAX_LENGTH]; + struct string_list *dirlist = task_cloud_sync_directory_map(); + struct item_file *server_file = &sync_state->server_manifest->list[sync_state->server_idx]; + const char *key = CS_FILE_KEY(server_file); /* the key from the server file is in "portable" format, use '/' */ - const char *path = strchr(key, '/') + 1; - settings_t *settings = config_get_ptr(); + const char *path = strchr(key, '/') + 1; + settings_t *settings = config_get_ptr(); + task_cloud_sync_fetch_state_t *fetch_state; - /* we're just fetching a file the server has, we can update this now */ - task_cloud_sync_add_to_updated_manifest(sync_state, key, CS_FILE_HASH(server_file), true); - /* no need to mark need_manifest_uploaded, nothing changed */ + /* there is a weird thing that can happen, where the server file changes but + * the manifest does not have the updated hash. in that case when the file is + * downloaded we have an opportunity to check that the hash matches and + * update the server manifest, and correct the issue. to do this the server + * manifest cannot be updated early; only on error or after the download is + * successful. on error just add to the updated manifest without marking + * need_manifest_uplaod. */ if (task_cloud_sync_should_ignore_file(key)) { /* don't fetch a file we're supposed to ignore, even if the server has it */ RARCH_LOG(CSPFX "ignoring %s\n", key); + task_cloud_sync_add_to_updated_manifest(sync_state, key, CS_FILE_HASH(server_file), true); return; } RARCH_LOG(CSPFX "fetching %s\n", key); @@ -609,6 +633,7 @@ static void task_cloud_sync_fetch_server_file(task_cloud_sync_state_t *sync_stat { /* how did this end up here? we don't know where to put it... */ RARCH_WARN(CSPFX "don't know where to put %s!\n", key); + task_cloud_sync_add_to_updated_manifest(sync_state, key, CS_FILE_HASH(server_file), true); return; } @@ -621,12 +646,24 @@ static void task_cloud_sync_fetch_server_file(task_cloud_sync_state_t *sync_stat fill_pathname_basedir(directory, filename, sizeof(directory)); path_mkdir(directory); - if (cloud_sync_read(key, filename, task_cloud_sync_fetch_cb, sync_state)) + fetch_state = malloc(sizeof(task_cloud_sync_fetch_state_t)); + if (!fetch_state) + { + RARCH_WARN(CSPFX "wanted to fetch %s but failed to malloc\n", key); + task_cloud_sync_add_to_updated_manifest(sync_state, key, CS_FILE_HASH(server_file), true); + sync_state->failures = true; + return; + } + fetch_state->sync_state = sync_state; + fetch_state->server_file = server_file; + if (cloud_sync_read(key, filename, task_cloud_sync_fetch_cb, fetch_state)) sync_state->waiting++; else { RARCH_WARN(CSPFX "wanted to fetch %s but failed\n", key); + task_cloud_sync_add_to_updated_manifest(sync_state, key, CS_FILE_HASH(server_file), true); sync_state->failures = true; + free(fetch_state); } } From 48f77a948fee5dab19c905ee37845f95be03715a Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Sat, 17 May 2025 23:09:06 -0400 Subject: [PATCH 095/175] vulkan: fix hdr (#17915) fixes #17912 --- gfx/drivers/vulkan.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index 0a80a93459..9a596730d1 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -2863,11 +2863,11 @@ static bool vulkan_init_default_filter_chain(vk_t *vk) if (vk->context->flags & VK_CTX_FLAG_HDR_ENABLE) { struct video_shader* shader_preset = vulkan_filter_chain_get_preset( - vk->filter_chain); + vk->filter_chain_default); VkFormat rt_format = (shader_preset && shader_preset->passes) - ? vulkan_filter_chain_get_pass_rt_format(vk->filter_chain, shader_preset->passes - 1) + ? vulkan_filter_chain_get_pass_rt_format(vk->filter_chain_default, shader_preset->passes - 1) : VK_FORMAT_UNDEFINED; - bool emits_hdr10 = shader_preset && shader_preset->passes && vulkan_filter_chain_emits_hdr10(vk->filter_chain); + bool emits_hdr10 = shader_preset && shader_preset->passes && vulkan_filter_chain_emits_hdr10(vk->filter_chain_default); if (vulkan_is_hdr10_format(rt_format)) { From 531a8d75a74bd72e25469a9ae83c4c68c4650a04 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 19 May 2025 00:17:26 +0000 Subject: [PATCH 096/175] Fetch translations from Crowdin --- intl/msg_hash_uk.h | 16 ++++++++++++++++ intl/progress.h | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index 4645b0ba18..332c636fb5 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -3588,18 +3588,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Вимкнути кнопку «Інформація»" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, + "Вимкнути функцію інформації меню." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Вимкнути кнопку «Пошук»" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, + "Не показувати функцію пошуку в меню." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Вимкніть лівий аналоговий сигнал у меню" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, + "Заборонити меню вивести аналогову паличку введення." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Вимкніть Right Analog у меню" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, + "Запобігає меню права аналогова паличка введення. Правий аналоговий мініатюр в списках відтворення." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Поміняти місцями кнопки ОК та Скасувати" diff --git a/intl/progress.h b/intl/progress.h index 727a9f9897..b8fd4d9123 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -143,7 +143,7 @@ #define LANGUAGE_PROGRESS_TATAR_APPROVED 0 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ From 5568a1e25da69ae0c48f0852225f7c91bce716f5 Mon Sep 17 00:00:00 2001 From: Jamiras Date: Mon, 19 May 2025 07:44:56 -0600 Subject: [PATCH 097/175] show additional warning message when unsupported achievements are detected --- cheevos/cheevos.c | 7 +++++++ intl/msg_hash_us.h | 4 ++++ msg_hash.h | 1 + 3 files changed, 12 insertions(+) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 46ac200d18..3fc8b8126c 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -1279,6 +1279,13 @@ static void rcheevos_show_game_placard(void) runloop_msg_queue_push(msg, _len, 0, 3 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); } + + if (summary.num_unsupported_achievements) + { + const char* warning = msg_hash_to_str(MSG_CHEEVOS_UNSUPPORTED_WARNING); + runloop_msg_queue_push(warning, strlen(warning), 0, 3 * 60, false, NULL, + MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_WARNING); + } } static uint32_t rcheevos_client_read_memory(uint32_t address, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 4f8ed4a426..d61808dd11 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -15594,6 +15594,10 @@ MSG_HASH( MSG_CHEEVOS_UNSUPPORTED_COUNT, "%d unsupported" ) +MSG_HASH( + MSG_CHEEVOS_UNSUPPORTED_WARNING, + "Unsupported achievements detected. Please try a different core or update RetroArch." +) MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Spectating %s" diff --git a/msg_hash.h b/msg_hash.h index 013a4d47ec..7feac96f4a 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -4101,6 +4101,7 @@ enum msg_hash_enums MSG_CHEEVOS_UNOFFICIAL_ACHIEVEMENTS_ACTIVATED, MSG_CHEEVOS_NUMBER_ACHIEVEMENTS_UNLOCKED, MSG_CHEEVOS_UNSUPPORTED_COUNT, + MSG_CHEEVOS_UNSUPPORTED_WARNING, MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, MSG_CHEEVOS_HARDCORE_PAUSED_MANUAL_FRAME_DELAY, MSG_CHEEVOS_HARDCORE_PAUSED_VSYNC_SWAP_INTERVAL, From 7d98987f9d8db9d9bf169271ff95e83336cbc705 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 20 May 2025 00:16:59 +0000 Subject: [PATCH 098/175] Fetch translations from Crowdin --- intl/msg_hash_es.h | 4 ++++ intl/msg_hash_ru.h | 4 ++++ intl/msg_hash_tr.h | 4 ++++ intl/progress.h | 14 +++++++------- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index 819a23c87c..add15d9eda 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -14806,6 +14806,10 @@ MSG_HASH( MSG_CHEEVOS_UNSUPPORTED_COUNT, "%d no compatibles" ) +MSG_HASH( + MSG_CHEEVOS_UNSUPPORTED_WARNING, + "Se han detectado logros no soportados. Prueba otro núcleo o actualiza RetroArch." +) MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Observando %s" diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index d7e414b946..bdd403ebba 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -14850,6 +14850,10 @@ MSG_HASH( MSG_CHEEVOS_UNSUPPORTED_COUNT, "%d не поддерживаются" ) +MSG_HASH( + MSG_CHEEVOS_UNSUPPORTED_WARNING, + "Обнаружены неподдерживаемые достижения. Пожалуйста, попробуйте другое ядро или обновите RetroArch." +) MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Наблюдают %s" diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 79835b46e7..688a8ba3bc 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -14898,6 +14898,10 @@ MSG_HASH( MSG_CHEEVOS_UNSUPPORTED_COUNT, "%d desteklenmiyor" ) +MSG_HASH( + MSG_CHEEVOS_UNSUPPORTED_WARNING, + "Desteklenmeyen başarımlar algılandı. Lütfen farklı bir çekirdek deneyin veya RetroArch'ı güncelleyin." +) MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "İzleyici %s" diff --git a/intl/progress.h b/intl/progress.h index b8fd4d9123..4e8ec5b179 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -31,7 +31,7 @@ #define LANGUAGE_PROGRESS_DANISH_APPROVED 0 /* German */ -#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_GERMAN_APPROVED 13 /* Greek */ @@ -59,8 +59,8 @@ #define LANGUAGE_PROGRESS_FINNISH_APPROVED 45 /* French */ -#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 100 -#define LANGUAGE_PROGRESS_FRENCH_APPROVED 100 +#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_FRENCH_APPROVED 99 /* Galician */ #define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 99 @@ -75,7 +75,7 @@ #define LANGUAGE_PROGRESS_CROATIAN_APPROVED 0 /* Hungarian */ -#define LANGUAGE_PROGRESS_HUNGARIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_HUNGARIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_HUNGARIAN_APPROVED 0 /* Indonesian */ @@ -91,7 +91,7 @@ #define LANGUAGE_PROGRESS_JAPANESE_APPROVED 0 /* Korean */ -#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_KOREAN_APPROVED 0 /* Dutch */ @@ -143,7 +143,7 @@ #define LANGUAGE_PROGRESS_TATAR_APPROVED 0 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ From 0e4cf00d1fa8a045c31891af7ac0bb893811c910 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Tue, 20 May 2025 15:54:22 +0300 Subject: [PATCH 099/175] Add option for suggesting cores when a core is loaded (#17920) --- config.def.h | 1 + configuration.c | 1 + configuration.h | 4 +- intl/msg_hash_us.h | 8 ++++ menu/cbs/menu_cbs_ok.c | 9 ++++- menu/cbs/menu_cbs_sublabel.c | 4 ++ menu/menu_displaylist.c | 1 + menu/menu_setting.c | 74 ++++++++++++++++++++++-------------- msg_hash.h | 1 + tasks/task_content.c | 1 - 10 files changed, 71 insertions(+), 33 deletions(-) diff --git a/config.def.h b/config.def.h index 0bfb35bd9b..dda01137e7 100644 --- a/config.def.h +++ b/config.def.h @@ -570,6 +570,7 @@ #define DEFAULT_REMAP_SAVE_ON_EXIT true #define DEFAULT_SHOW_HIDDEN_FILES false +#define DEFAULT_CORE_SUGGEST_ALWAYS false /* Initialise file browser with the last used start directory */ #define DEFAULT_USE_LAST_START_DIRECTORY false diff --git a/configuration.c b/configuration.c index fc547dfdb1..f5a1c9a6f5 100644 --- a/configuration.c +++ b/configuration.c @@ -1812,6 +1812,7 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("remap_save_on_exit", &settings->bools.remap_save_on_exit, true, DEFAULT_REMAP_SAVE_ON_EXIT, false); SETTING_BOOL("show_hidden_files", &settings->bools.show_hidden_files, true, DEFAULT_SHOW_HIDDEN_FILES, false); SETTING_BOOL("use_last_start_directory", &settings->bools.use_last_start_directory, true, DEFAULT_USE_LAST_START_DIRECTORY, false); + SETTING_BOOL("core_suggest_always", &settings->bools.core_suggest_always, true, DEFAULT_CORE_SUGGEST_ALWAYS, false); SETTING_BOOL("camera_allow", &settings->bools.camera_allow, true, false, false); SETTING_BOOL("location_allow", &settings->bools.location_allow, true, false, false); SETTING_BOOL("cloud_sync_enable", &settings->bools.cloud_sync_enable, true, false, false); diff --git a/configuration.h b/configuration.h index 8cae2cbb1f..c1d8cd67ee 100644 --- a/configuration.h +++ b/configuration.h @@ -731,7 +731,6 @@ typedef struct settings bool frame_time_counter_reset_after_save_state; /* Menu */ - bool filter_by_current_core; bool menu_enable_widgets; bool menu_show_load_content_animation; bool notification_show_autoconfig; @@ -1037,8 +1036,11 @@ typedef struct settings bool sort_screenshots_by_content_enable; bool config_save_on_exit; bool remap_save_on_exit; + bool show_hidden_files; + bool filter_by_current_core; bool use_last_start_directory; + bool core_suggest_always; bool savefiles_in_content_dir; bool savestates_in_content_dir; diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index d61808dd11..c233e8cfe8 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -5002,6 +5002,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "Open File Browser at the last used location when loading content from the Start Directory. Note: Location will be reset to default upon restarting RetroArch." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Always Suggest Cores" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Suggest available cores even when a core is already loaded." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Use Built-In Media Player" diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 101f7f0ef3..74359f8ffe 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1930,6 +1930,7 @@ static bool menu_content_find_first_core( menu_content_ctx_defer_info_t *def_info, bool load_content_with_current_core, char *s, size_t len) { + settings_t *settings = config_get_ptr(); const core_info_t *info = NULL; size_t supported = 0; core_info_list_t *core_info = (core_info_list_t*)def_info->data; @@ -1961,6 +1962,11 @@ static bool menu_content_find_first_core( def_info->s, &info, &supported); + /* Don't suggest cores if a core is already loaded. */ + if ( !path_is_empty(RARCH_PATH_CORE) + && !settings->bools.core_suggest_always) + load_content_with_current_core = true; + /* We started the menu with 'Load Content', we are * going to use the current core to load this. */ if (load_content_with_current_core) @@ -9691,8 +9697,7 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs, } else { - if ( string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_FAVORITES)) - && path_is_empty(RARCH_PATH_CORE)) + if (string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_FAVORITES))) BIND_ACTION_OK(cbs, action_ok_compressed_archive_push_detect_core); else BIND_ACTION_OK(cbs, action_ok_compressed_archive_push); diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 94193a84a4..dbac9f0523 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -1069,6 +1069,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_playlist_entry_remove, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_system_directory, MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_rgui_browser_directory, MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_use_last_start_directory, MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_suggest_always, MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_content_dir, MENU_ENUM_SUBLABEL_CONTENT_DIR) DEFAULT_SUBLABEL_MACRO(action_bind_dynamic_wallpapers_directory, MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPERS_DIRECTORY) DEFAULT_SUBLABEL_MACRO(action_bind_thumbnails_directory, MENU_ENUM_SUBLABEL_THUMBNAILS_DIRECTORY) @@ -4902,6 +4903,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_USE_LAST_START_DIRECTORY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_use_last_start_directory); break; + case MENU_ENUM_LABEL_CORE_SUGGEST_ALWAYS: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_suggest_always); + break; case MENU_ENUM_LABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_toggle_gamepad_combo); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 2cea74a3cc..d191f2a0c7 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -10147,6 +10147,7 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_FILTER_BY_CURRENT_CORE, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_USE_LAST_START_DIRECTORY, PARSE_ONLY_BOOL}, + {MENU_ENUM_LABEL_CORE_SUGGEST_ALWAYS, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_USE_BUILTIN_PLAYER, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_USE_BUILTIN_IMAGE_VIEWER, PARSE_ONLY_BOOL}, }; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index f3119835a0..462120b67a 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -20015,20 +20015,6 @@ static bool setting_append_list( (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh; (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh; - CONFIG_BOOL( - list, list_info, - &settings->bools.use_last_start_directory, - MENU_ENUM_LABEL_USE_LAST_START_DIRECTORY, - MENU_ENUM_LABEL_VALUE_USE_LAST_START_DIRECTORY, - false, - MENU_ENUM_LABEL_VALUE_OFF, - MENU_ENUM_LABEL_VALUE_ON, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler, - SD_FLAG_NONE); END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); @@ -20057,6 +20043,51 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE); + CONFIG_BOOL( + list, list_info, + &settings->bools.filter_by_current_core, + MENU_ENUM_LABEL_FILTER_BY_CURRENT_CORE, + MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE, + DEFAULT_FILTER_BY_CURRENT_CORE, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + + CONFIG_BOOL( + list, list_info, + &settings->bools.use_last_start_directory, + MENU_ENUM_LABEL_USE_LAST_START_DIRECTORY, + MENU_ENUM_LABEL_VALUE_USE_LAST_START_DIRECTORY, + DEFAULT_USE_LAST_START_DIRECTORY, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + + CONFIG_BOOL( + list, list_info, + &settings->bools.core_suggest_always, + MENU_ENUM_LABEL_CORE_SUGGEST_ALWAYS, + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + DEFAULT_CORE_SUGGEST_ALWAYS, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); break; @@ -20101,21 +20132,6 @@ static bool setting_append_list( SD_FLAG_NONE); #endif - CONFIG_BOOL( - list, list_info, - &settings->bools.filter_by_current_core, - MENU_ENUM_LABEL_FILTER_BY_CURRENT_CORE, - MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE, - DEFAULT_FILTER_BY_CURRENT_CORE, - MENU_ENUM_LABEL_VALUE_OFF, - MENU_ENUM_LABEL_VALUE_ON, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler, - SD_FLAG_NONE); - END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); break; diff --git a/msg_hash.h b/msg_hash.h index 7feac96f4a..7a8a3c7e2e 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -2583,6 +2583,7 @@ enum msg_hash_enums MENU_LABEL(CONFIRM_ON_EXIT), MENU_LABEL(SHOW_HIDDEN_FILES), MENU_LABEL(USE_LAST_START_DIRECTORY), + MENU_LABEL(CORE_SUGGEST_ALWAYS), /* Driver settings */ diff --git a/tasks/task_content.c b/tasks/task_content.c index 233654820b..ec315665cb 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -2470,7 +2470,6 @@ bool task_push_load_content_with_new_core_from_menu( path_set(RARCH_PATH_CONTENT, fullpath); path_set(RARCH_PATH_CORE, core_path); - path_clear(RARCH_PATH_CORE_LAST); #ifdef HAVE_DYNAMIC /* Load core */ From f5280fe5265e20ac2c87d9f4fed25a33e392610f Mon Sep 17 00:00:00 2001 From: zoltanvb <101990835+zoltanvb@users.noreply.github.com> Date: Wed, 14 May 2025 07:43:16 +0200 Subject: [PATCH 100/175] Lock core and save state explanations. --- intl/msg_hash_us.c | 6 ++++++ intl/msg_hash_us.h | 10 +++++++++- msg_hash.h | 4 ++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 85f9341d8b..df6c8064e2 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -463,6 +463,12 @@ int msg_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) case MENU_ENUM_LABEL_CHEAT_START_OR_CONT: strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_HELP_CHEAT_START_OR_CONT), len); break; + case MENU_ENUM_LABEL_SAVE_STATE: + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_HELP_SAVE_STATE), len); + break; + case MENU_ENUM_LABEL_LOAD_STATE: + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_HELP_LOAD_STATE), len); + break; #ifdef HAVE_LAKKA case MENU_ENUM_LABEL_TIMEZONE: strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_HELP_TIMEZONE), len); diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 4f8ed4a426..c3674a7239 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -569,7 +569,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LOCK, - "Prevent modification of the currently installed core. May be used to avoid unwanted updates when content requires a specific core version (e.g. Arcade ROM sets)." + "Prevent modification of the currently installed core. May be used to avoid unwanted updates when content requires a specific core version (e.g. Arcade ROM sets) or the core's own save state format changes." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, @@ -9144,6 +9144,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_STATE, "Save a state to the currently selected slot." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SAVE_STATE, + "Save a state to the currently selected slot. Note: save states are typically not portable and may not work with other versions of this core." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Load State" @@ -9152,6 +9156,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_STATE, "Load a saved state from the currently selected slot." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LOAD_STATE, + "Load a saved state from the currently selected slot. Note: may not work if state was saved with another version of the core." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Undo Load State" diff --git a/msg_hash.h b/msg_hash.h index 013a4d47ec..dfad810c46 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -2307,8 +2307,8 @@ enum msg_hash_enums MENU_LABEL(MICROPHONE_WASAPI_SH_BUFFER_LENGTH), #endif - MENU_LABEL(SAVE_STATE), - MENU_LABEL(LOAD_STATE), + MENU_LBL_H(SAVE_STATE), + MENU_LBL_H(LOAD_STATE), MENU_LABEL(UNDO_LOAD_STATE), MENU_LABEL(UNDO_SAVE_STATE), From e2b725b5a32f9bea472c64ac8e1229543eeb38e1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 21 May 2025 00:17:00 +0000 Subject: [PATCH 101/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 12 ++++++++++++ intl/msg_hash_de.h | 12 ++++++++++++ intl/msg_hash_es.h | 8 ++++++++ intl/msg_hash_fr.h | 12 ++++++++++++ intl/msg_hash_ko.h | 4 ++++ intl/msg_hash_pl.h | 8 ++++++++ intl/msg_hash_pt_br.h | 8 ++++++++ intl/msg_hash_tr.h | 8 ++++++++ intl/progress.h | 10 +++++----- 9 files changed, 77 insertions(+), 5 deletions(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index e8bf45dc6b..7d9ad1467b 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -4922,6 +4922,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "Obre l'explorador de fitxers a l'última localització que s'ha fet servir quan es carrega contingut des de la carpeta inicial. Nota: La localització torna al seu valor predeterminat en reiniciar RetroArch." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Suggereix nuclis sempre" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Suggereix tots els nuclis disponibles quan es carrega un nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Fes servir el reproductor integrat" @@ -14710,6 +14718,10 @@ MSG_HASH( MSG_CHEEVOS_UNSUPPORTED_COUNT, "%d no compatible" ) +MSG_HASH( + MSG_CHEEVOS_UNSUPPORTED_WARNING, + "S'han trobat assoliments que no estan suportats. Prova amb un nucli diferent o prova d'actualitzar RetroArch." +) MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Expectant %s" diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index b3f6823542..ce8675fe4e 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -4826,6 +4826,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "Den Dateibrowser im zuletzt verwendeten Pfad öffnen, wenn Inhalte aus dem Startverzeichnis geladen werden. Hinweis: Der Pfad wird beim Neustart von RetroArch zurückgesetzt." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Cores immer vorschlagen" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Verfügbare Cores vorschlagen, auch wenn bereits ein Core geladen ist." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Eingebauten Mediaplayer verwenden" @@ -14474,6 +14482,10 @@ MSG_HASH( MSG_CHEEVOS_UNSUPPORTED_COUNT, "%d nicht unterstützt" ) +MSG_HASH( + MSG_CHEEVOS_UNSUPPORTED_WARNING, + "Nicht unterstützte Errungenschaft entdeckt. Bitte einen anderen Core versuchen oder RetroArch aktualisieren." +) MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Zuschauer %s" diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index add15d9eda..1a8d01b87a 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -4934,6 +4934,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "Abre el explorador de archivos en el último directorio usado al cargar contenidos desde el directorio inicial. Nota: la posición volverá a su valor predeterminado al reiniciar RetroArch." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Sugerir núcleos siempre" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Sugiere los núcleos disponbles, aunque haya otro ya cargado." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Usar visor de medios integrado" diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index f5242ecb15..8ef9c7f6a7 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -4894,6 +4894,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "Ouvrir le navigateur de fichiers au dernier emplacement utilisé lors du chargement du contenu depuis le dossier de démarrage. Remarque : L'emplacement sera réinitialisé par défaut au redémarrage de RetroArch." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Toujours suggérer des cœurs" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Suggérer des cœurs disponibles même lorsqu'un cœur est déjà chargé." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Utiliser le lecteur média intégré" @@ -14766,6 +14774,10 @@ MSG_HASH( MSG_CHEEVOS_UNSUPPORTED_COUNT, "%d non pris en charge" ) +MSG_HASH( + MSG_CHEEVOS_UNSUPPORTED_WARNING, + "Succès non pris en charge détectés. Veuillez essayer un autre cœur ou mettre à jour RetroArch." +) MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Spectateur pour %s" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 1f0d81632f..2baa9e1a5e 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -14914,6 +14914,10 @@ MSG_HASH( MSG_CHEEVOS_UNSUPPORTED_COUNT, "%d개 지원 안 됨" ) +MSG_HASH( + MSG_CHEEVOS_UNSUPPORTED_WARNING, + "지원되지 않는 도전 과제가 있습니다. 다른 코어를 사용해보거나 RetroArch를 업데이트하십시오." +) MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "%s 관전 중" diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index 39e1d25e56..5294e3f1eb 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -4274,6 +4274,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "Otwórz przeglądarkę plików w ostatnio używanej lokalizacji podczas ładowania zawartości z katalogu startowego. Uwaga: Lokalizacja zostanie przywrócona do wartości domyślnych po ponownym uruchomieniu RetroArch." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Zawsze proponuj rdzenie" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Zaproponuj dostępne rdzenie nawet wtedy, gdy rdzeń jest już załadowany." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Użyj wbudowanego odtwarzacza multimedialnego" diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 30d792569c..9891c1462c 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -4374,6 +4374,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_LAST_START_DIRECTORY, "Lembrar do último diretório usado" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Sempre Sugerir Núcleos" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Sugerir núcleos disponíveis mesmo quando um núcleo já estiver carregado." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Utilizar o reprodutor de mídia integrado" diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 688a8ba3bc..cab4c1b3af 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -4934,6 +4934,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "Başlangıç ​​Dizininden içerik yüklerken son kullanılan konumda dosya tarayıcısını açın. Not: RetroArch yeniden başlatıldığında konum varsayılana sıfırlanacaktır." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Her Zaman Çekirdekleri Öner" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Bir çekirdek zaten yüklü olsa bile kullanılabilir çekirdekleri öner." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Dahili Medya Oynatıcı Kullan" diff --git a/intl/progress.h b/intl/progress.h index 4e8ec5b179..d2a1df75b6 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -31,7 +31,7 @@ #define LANGUAGE_PROGRESS_DANISH_APPROVED 0 /* German */ -#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_GERMAN_APPROVED 13 /* Greek */ @@ -59,8 +59,8 @@ #define LANGUAGE_PROGRESS_FINNISH_APPROVED 45 /* French */ -#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 99 -#define LANGUAGE_PROGRESS_FRENCH_APPROVED 99 +#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_FRENCH_APPROVED 100 /* Galician */ #define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 99 @@ -159,6 +159,6 @@ #define LANGUAGE_PROGRESS_CHINESE_SIMPLIFIED_APPROVED 43 /* Chinese Traditional */ -#define LANGUAGE_PROGRESS_CHINESE_TRADITIONAL_TRANSLATED 91 +#define LANGUAGE_PROGRESS_CHINESE_TRADITIONAL_TRANSLATED 90 #define LANGUAGE_PROGRESS_CHINESE_TRADITIONAL_APPROVED 72 From 14c5956ff8e3b1fbda897393f68fc700a641d04a Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Tue, 20 May 2025 23:43:36 -0400 Subject: [PATCH 102/175] macOS: use CFRunLoopObserver for running runloop --- ui/drivers/cocoa/cocoa_common.m | 50 +++++++++++++++++++++++++++++++++ ui/drivers/ui_cocoa.m | 10 +++++++ ui/drivers/ui_cocoatouch.m | 44 ----------------------------- 3 files changed, 60 insertions(+), 44 deletions(-) diff --git a/ui/drivers/cocoa/cocoa_common.m b/ui/drivers/cocoa/cocoa_common.m index 875e2992ea..ecb140c440 100644 --- a/ui/drivers/cocoa/cocoa_common.m +++ b/ui/drivers/cocoa/cocoa_common.m @@ -96,6 +96,56 @@ void cocoa_file_load_with_detect_core(const char *filename); @end #endif +static CFRunLoopObserverRef iterate_observer; + +static void rarch_draw_observer(CFRunLoopObserverRef observer, + CFRunLoopActivity activity, void *info) +{ + uint32_t runloop_flags; + int ret = runloop_iterate(); + + if (ret == -1) + { +#ifdef HAVE_QT + application->quit(); +#endif + main_exit(NULL); + exit(0); + return; + } + + task_queue_check(); + +#ifdef HAVE_MIST + steam_poll(); +#endif + + runloop_flags = runloop_get_flags(); + if (!(runloop_flags & RUNLOOP_FLAG_IDLE)) + CFRunLoopWakeUp(CFRunLoopGetMain()); +} + +void rarch_start_draw_observer(void) +{ + if (iterate_observer && CFRunLoopObserverIsValid(iterate_observer)) + return; + + if (iterate_observer != NULL) + CFRelease(iterate_observer); + iterate_observer = CFRunLoopObserverCreate(0, kCFRunLoopBeforeWaiting, + true, 0, rarch_draw_observer, 0); + CFRunLoopAddObserver(CFRunLoopGetMain(), iterate_observer, kCFRunLoopCommonModes); +} + +void rarch_stop_draw_observer(void) +{ + if (!iterate_observer || !CFRunLoopObserverIsValid(iterate_observer)) + return; + CFRunLoopObserverInvalidate(iterate_observer); + CFRelease(iterate_observer); + iterate_observer = NULL; +} + @implementation CocoaView #if defined(OSX) diff --git a/ui/drivers/ui_cocoa.m b/ui/drivers/ui_cocoa.m index f5a24ae883..314730c040 100644 --- a/ui/drivers/ui_cocoa.m +++ b/ui/drivers/ui_cocoa.m @@ -642,7 +642,13 @@ static ui_application_t ui_application_cocoa = { [self setupMainWindow]; #endif +#ifdef HAVE_QT + /* I think the draw observer should be absolutely fine for qt but I'm not testing it; + * whoever does test it and confirm it works can just delete this */ [self performSelectorOnMainThread:@selector(rarch_main) withObject:nil waitUntilDone:NO]; +#else + rarch_start_draw_observer(); +#endif } #pragma mark - ApplePlatform @@ -788,6 +794,7 @@ static ui_application_t ui_application_cocoa = { } #endif +#ifdef HAVE_QT - (void) rarch_main { for (;;) @@ -822,6 +829,7 @@ static ui_application_t ui_application_cocoa = { main_exit(NULL); } +#endif - (void)applicationDidBecomeActive:(NSNotification *)notification { } - (void)applicationWillResignActive:(NSNotification *)notification @@ -839,6 +847,8 @@ static ui_application_t ui_application_cocoa = { command_event(CMD_EVENT_QUIT, NULL); + rarch_stop_draw_observer(); + return reply; } diff --git a/ui/drivers/ui_cocoatouch.m b/ui/drivers/ui_cocoatouch.m index e7e71a219a..9b72d6789a 100644 --- a/ui/drivers/ui_cocoatouch.m +++ b/ui/drivers/ui_cocoatouch.m @@ -62,7 +62,6 @@ id apple_platform; #else static id apple_platform; #endif -static CFRunLoopObserverRef iterate_observer; static void ui_companion_cocoatouch_event_command( void *data, enum event_command cmd) { } @@ -148,49 +147,6 @@ static uintptr_t ui_companion_cocoatouch_get_app_icon_texture(const char *icon) return [textures[iconName] unsignedLongValue]; } -static void rarch_draw_observer(CFRunLoopObserverRef observer, - CFRunLoopActivity activity, void *info) -{ - uint32_t runloop_flags; - int ret = runloop_iterate(); - - if (ret == -1) - { - ui_companion_cocoatouch_event_command( - NULL, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG); - main_exit(NULL); - exit(0); - return; - } - - task_queue_check(); - - runloop_flags = runloop_get_flags(); - if (!(runloop_flags & RUNLOOP_FLAG_IDLE)) - CFRunLoopWakeUp(CFRunLoopGetMain()); -} - -void rarch_start_draw_observer(void) -{ - if (iterate_observer && CFRunLoopObserverIsValid(iterate_observer)) - return; - - if (iterate_observer != NULL) - CFRelease(iterate_observer); - iterate_observer = CFRunLoopObserverCreate(0, kCFRunLoopBeforeWaiting, - true, 0, rarch_draw_observer, 0); - CFRunLoopAddObserver(CFRunLoopGetMain(), iterate_observer, kCFRunLoopCommonModes); -} - -void rarch_stop_draw_observer(void) -{ - if (!iterate_observer || !CFRunLoopObserverIsValid(iterate_observer)) - return; - CFRunLoopObserverInvalidate(iterate_observer); - CFRelease(iterate_observer); - iterate_observer = NULL; -} - void get_ios_version(int *major, int *minor) { static int savedMajor, savedMinor; From 5afbca8904740146a2acae123fd88097e6b9a29a Mon Sep 17 00:00:00 2001 From: sonninnos Date: Wed, 21 May 2025 16:46:45 +0300 Subject: [PATCH 103/175] video_driver_build_info crash fix --- gfx/video_driver.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 9efecff999..8f07107660 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -2817,8 +2817,15 @@ void video_driver_build_info(video_frame_info_t *video_info) input_driver_state_t *input_st = input_state_get_ptr(); #ifdef HAVE_MENU struct menu_state *menu_st = menu_state_get_ptr(); +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) + struct video_shader *menu_shader = menu_shader_get(); +#else + struct video_shader *menu_shader = NULL; #endif - uint8_t menu_shdr_flags = 0; +#else + struct video_shader *menu_shader = NULL; +#endif /* HAVE_MENU */ + uint8_t menu_shdr_flags = (menu_shader) ? menu_shader->flags : 0; #ifdef HAVE_GFX_WIDGETS dispgfx_widget_t *p_dispwidget = dispwidget_get_ptr(); #endif @@ -2829,11 +2836,6 @@ void video_driver_build_info(video_frame_info_t *video_info) VIDEO_DRIVER_THREADED_LOCK(video_st, is_threaded); #endif -#ifdef HAVE_MENU -#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) - menu_shdr_flags = menu_shader_get()->flags; -#endif -#endif custom_vp = &settings->video_vp_custom; #ifdef HAVE_GFX_WIDGETS video_info->widgets_active = p_dispwidget->active; From 610a6d0026993c64acb2babb6c2d728d0a8a982e Mon Sep 17 00:00:00 2001 From: sonninnos Date: Wed, 21 May 2025 18:18:14 +0300 Subject: [PATCH 104/175] Internal core logging newlines --- cores/libretro-ffmpeg/ffmpeg_core.c | 8 ++++---- cores/libretro-mpv/mpv-libretro.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cores/libretro-ffmpeg/ffmpeg_core.c b/cores/libretro-ffmpeg/ffmpeg_core.c index 374d0a7072..f69cb57d1f 100644 --- a/cores/libretro-ffmpeg/ffmpeg_core.c +++ b/cores/libretro-ffmpeg/ffmpeg_core.c @@ -1330,7 +1330,7 @@ static bool init_media_info(void) media.duration.hours = 0; media.duration.minutes = 0; media.duration.seconds = 0; - log_cb(RETRO_LOG_ERROR, "[FFMPEG] Could not determine media duration\n"); + log_cb(RETRO_LOG_ERROR, "[FFMPEG] Could not determine media duration.\n"); } } @@ -2161,7 +2161,7 @@ bool CORE_PREFIX(retro_load_game)(const struct retro_game_info *info) if (!CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt)) { - log_cb(RETRO_LOG_ERROR, "[FFMPEG] Cannot set pixel format."); + log_cb(RETRO_LOG_ERROR, "[FFMPEG] Cannot set pixel format.\n"); goto error; } @@ -2192,13 +2192,13 @@ bool CORE_PREFIX(retro_load_game)(const struct retro_game_info *info) if (!open_codecs()) { - log_cb(RETRO_LOG_ERROR, "[FFMPEG] Failed to find codec."); + log_cb(RETRO_LOG_ERROR, "[FFMPEG] Failed to find codec.\n"); goto error; } if (!init_media_info()) { - log_cb(RETRO_LOG_ERROR, "[FFMPEG] Failed to init media info."); + log_cb(RETRO_LOG_ERROR, "[FFMPEG] Failed to init media info.\n"); goto error; } diff --git a/cores/libretro-mpv/mpv-libretro.c b/cores/libretro-mpv/mpv-libretro.c index 9c7f2960cf..1e2a991ead 100644 --- a/cores/libretro-mpv/mpv-libretro.c +++ b/cores/libretro-mpv/mpv-libretro.c @@ -97,7 +97,7 @@ static void process_mpv_events(mpv_event_id event_block) { struct mpv_event_log_message *msg = (struct mpv_event_log_message *)mp_event->data; - log_cb(RETRO_LOG_INFO, "mpv: [%s] %s: %s", + log_cb(RETRO_LOG_INFO, "mpv: [%s] %s: %s\n", msg->prefix, msg->level, msg->text); } else if(mp_event->event_id == MPV_EVENT_END_FILE) @@ -151,7 +151,7 @@ void CORE_PREFIX(retro_init)(void) if(mpv_client_api_version() != MPV_CLIENT_API_VERSION) { log_cb(RETRO_LOG_WARN, "libmpv version mismatch. Please update or " - "recompile mpv-libretro after updating libmpv."); + "recompile mpv-libretro after updating libmpv.\n"); } return; From 79a05ef28665fd57b778307a489c1a3b3b791e71 Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Wed, 21 May 2025 12:31:08 -0400 Subject: [PATCH 105/175] macos build fix for steam --- ui/drivers/cocoa/cocoa_common.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui/drivers/cocoa/cocoa_common.m b/ui/drivers/cocoa/cocoa_common.m index ecb140c440..fe2b5c91ee 100644 --- a/ui/drivers/cocoa/cocoa_common.m +++ b/ui/drivers/cocoa/cocoa_common.m @@ -57,6 +57,10 @@ #include "../../menu/menu_driver.h" #endif +#ifdef HAVE_MIST +#include "steam/steam.h" +#endif + #if IOS #import extern bool RAIsVoiceOverRunning(void) From ca190dbe0a7605737eb47adcd5dc8872be3c0b4f Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 22 May 2025 00:16:17 +0000 Subject: [PATCH 106/175] Fetch translations from Crowdin --- intl/msg_hash_ru.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index bdd403ebba..99c50f01b1 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -4958,6 +4958,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "При загрузке контента открывать браузер файлов в последнем использованном каталоге. Путь будет сброшен к стандартному значению при перезапуске RetroArch." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Всегда предлагать ядра" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Предлагать доступные ядра даже если ядро уже загружено." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Встроенный медиаплеер" From c2d7366ea1f7217dfb6fc858c7a5ef3cf17b4096 Mon Sep 17 00:00:00 2001 From: BinBashBanana <51469593+BinBashBanana@users.noreply.github.com> Date: Wed, 21 May 2025 18:05:05 -0700 Subject: [PATCH 107/175] Rewrite RWebAudio driver --- CHANGES.md | 1 + Makefile.emscripten | 60 ++++--- audio/drivers/rwebaudio.c | 210 +++++++++++++++++++++---- config.def.h | 4 +- configuration.c | 2 +- emscripten/library_rwebaudio.js | 194 ++++++++--------------- frontend/drivers/platform_emscripten.c | 10 ++ frontend/drivers/platform_emscripten.h | 14 ++ retroarch.c | 29 +++- 9 files changed, 328 insertions(+), 196 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1cb87c7e44..f238d0e75c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ - EMSCRIPTEN/RWEBCAM: Fix camera driver - EMSCRIPTEN/RWEBINPUT: Add accelerometer/gyroscope support - EMSCRIPTEN/RWEBPAD: Add rumble support +- EMSCRIPTEN/RWEBAUDIO: Rewrite driver, set as default audio driver # 1.21.0 - 3DS: Fix unique IDs for newer cores diff --git a/Makefile.emscripten b/Makefile.emscripten index 7f3fc7b437..6d7cab21dc 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -27,7 +27,7 @@ HAVE_GLSL = 1 HAVE_SCREENSHOTS = 1 HAVE_REWIND = 1 HAVE_AUDIOMIXER = 1 -HAVE_CC_RESAMPLER = 1 +HAVE_CC_RESAMPLER ?= 1 HAVE_EGL ?= 0 HAVE_OPENGLES = 1 HAVE_RJPEG = 0 @@ -54,8 +54,6 @@ HAVE_BSV_MOVIE = 1 HAVE_CHD ?= 0 HAVE_NETPLAYDISCOVERY ?= 0 -HAVE_AL ?= 1 - # enables pthreads, requires special headers on the web server: # see https://web.dev/articles/coop-coep HAVE_THREADS ?= 0 @@ -63,18 +61,14 @@ HAVE_THREADS ?= 0 # requires HAVE_THREADS HAVE_AUDIOWORKLET ?= 0 -# WARNING -- READ BEFORE ENABLING -# The rwebaudio driver is known to have several audio bugs, such as -# minor crackling, or the entire page freezing/crashing. -# It works perfectly on chrome, but even firefox has really bad audio quality. -# I should also note, the driver on iOS is completely broken (crashes the page). -# You have been warned. -HAVE_RWEBAUDIO ?= 0 +# doesn't work on PROXY_TO_PTHREAD +HAVE_RWEBAUDIO ?= 1 -# whether the browser thread is allowed to block to wait for audio to play, -# may lead to the issues mentioned above. -# currently this variable is only used by audioworklet; -# rwebaudio will always busywait and openal will never busywait. +# requires ASYNC or PROXY_TO_PTHREAD +HAVE_AL ?= 0 + +# whether the browser thread is allowed to block to wait for audio to play, not CPU usage-friendly! +# currently this variable is only used by rwebaudio and audioworklet; openal will never busywait. ALLOW_AUDIO_BUSYWAIT ?= 0 # minimal asyncify; better performance than full asyncify, @@ -196,6 +190,9 @@ endif ifeq ($(HAVE_RWEBAUDIO), 1) LDFLAGS += --js-library emscripten/library_rwebaudio.js DEFINES += -DHAVE_RWEBAUDIO + ifeq ($(PROXY_TO_PTHREAD), 1) + $(error ERROR: RWEBAUDIO is incompatible with PROXY_TO_PTHREAD) + endif endif ifeq ($(HAVE_AUDIOWORKLET), 1) @@ -205,18 +202,24 @@ ifeq ($(HAVE_AUDIOWORKLET), 1) ifeq ($(HAVE_THREADS), 0) $(error ERROR: AUDIOWORKLET requires HAVE_THREADS) endif - ifeq ($(PROXY_TO_PTHREAD), 1) - else ifeq ($(ASYNC), 1) +endif + +ifeq ($(HAVE_AL), 1) + LDFLAGS += -lopenal + DEFINES += -DHAVE_AL +endif + +ifeq ($(PROXY_TO_PTHREAD), 1) +else ifeq ($(ASYNC), 1) +else + DEFINES += -DEMSCRIPTEN_AUDIO_EXTERNAL_BLOCK + ifeq ($(MIN_ASYNC), 1) + DEFINES += -DEMSCRIPTEN_AUDIO_ASYNC_BLOCK else - DEFINES += -DEMSCRIPTEN_AUDIO_EXTERNAL_BLOCK - ifeq ($(MIN_ASYNC), 1) - DEFINES += -DEMSCRIPTEN_AUDIO_ASYNC_BLOCK - else - DEFINES += -DEMSCRIPTEN_AUDIO_FAKE_BLOCK - endif - ifneq ($(ALLOW_AUDIO_BUSYWAIT), 1) - DEFINES += -DEMSCRIPTEN_AUDIO_EXTERNAL_WRITE_BLOCK - endif + DEFINES += -DEMSCRIPTEN_AUDIO_FAKE_BLOCK + endif + ifneq ($(ALLOW_AUDIO_BUSYWAIT), 1) + DEFINES += -DEMSCRIPTEN_AUDIO_EXTERNAL_WRITE_BLOCK endif endif @@ -227,16 +230,11 @@ endif # explanation of some of these defines: # EMSCRIPTEN_AUDIO_EXTERNAL_BLOCK: audio blocking occurs in the main loop instead of in the audio driver functions. # EMSCRIPTEN_AUDIO_EXTERNAL_WRITE_BLOCK: along with above, enables external blocking in the write function. -# ALLOW_AUDIO_BUSYWAIT: write function will busywait. init function may still use an external block. +# EMSCRIPTEN_AUDIO_BUSYWAIT: write function will busywait. init function may still use an external block. # EMSCRIPTEN_AUDIO_ASYNC_BLOCK: external block uses emscripten_sleep (requires MIN_ASYNC). # EMSCRIPTEN_AUDIO_FAKE_BLOCK: external block uses main loop timing (doesn't require asyncify). # when building with either PROXY_TO_PTHREAD or ASYNC (full asyncify), none of the above are required. -ifeq ($(HAVE_AL), 1) - LDFLAGS += -lopenal - DEFINES += -DHAVE_AL -endif - ifeq ($(HAVE_THREADS), 1) LDFLAGS += -pthread -s PTHREAD_POOL_SIZE=$(PTHREAD_POOL_SIZE) CFLAGS += -pthread -s SHARED_MEMORY diff --git a/audio/drivers/rwebaudio.c b/audio/drivers/rwebaudio.c index 486398781b..189da9f29f 100644 --- a/audio/drivers/rwebaudio.c +++ b/audio/drivers/rwebaudio.c @@ -1,6 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2015 - Michael Lelli * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2025 - OlyB * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- @@ -17,81 +18,230 @@ #include #include #include +#include #include "../audio_driver.h" +#include "../../verbosity.h" +#include "../../frontend/drivers/platform_emscripten.h" + +#define RWEBAUDIO_BUFFER_SIZE_MS 10 /* forward declarations */ unsigned RWebAudioSampleRate(void); void *RWebAudioInit(unsigned latency); -ssize_t RWebAudioWrite(const void *s, size_t len); +ssize_t RWebAudioQueueBuffer(size_t num_frames, float *left, float *right); bool RWebAudioStop(void); bool RWebAudioStart(void); void RWebAudioSetNonblockState(bool state); void RWebAudioFree(void); -size_t RWebAudioWriteAvail(void); -size_t RWebAudioBufferSize(void); +size_t RWebAudioWriteAvailFrames(void); +size_t RWebAudioBufferSizeFrames(void); +void RWebAudioRecalibrateTime(void); +bool RWebAudioResumeCtx(void); -typedef struct rweb_audio +typedef struct rwebaudio_data { - bool is_paused; -} rweb_audio_t; + size_t tmpbuf_frames; + size_t tmpbuf_offset; + float *tmpbuf_left; + float *tmpbuf_right; + bool nonblock; + bool running; +#ifdef EMSCRIPTEN_AUDIO_FAKE_BLOCK + bool block_requested; +#endif +} rwebaudio_data_t; + +static rwebaudio_data_t *rwebaudio_static_data = NULL; static void rwebaudio_free(void *data) { + rwebaudio_data_t *rwebaudio = (rwebaudio_data_t*)data; + if (!rwebaudio) + return; + RWebAudioFree(); - free(data); + if (rwebaudio->tmpbuf_left) + free(rwebaudio->tmpbuf_left); + if (rwebaudio->tmpbuf_right) + free(rwebaudio->tmpbuf_right); + free(rwebaudio); + rwebaudio_static_data = NULL; } static void *rwebaudio_init(const char *device, unsigned rate, unsigned latency, unsigned block_frames, unsigned *new_rate) { - rweb_audio_t *rwebaudio = (rweb_audio_t*)calloc(1, sizeof(rweb_audio_t)); + rwebaudio_data_t *rwebaudio; + if (rwebaudio_static_data) + { + RARCH_ERR("[RWebAudio] Tried to start already running driver!\n"); + return NULL; + } + + rwebaudio = (rwebaudio_data_t*)calloc(1, sizeof(rwebaudio_data_t)); if (!rwebaudio) return NULL; - if (RWebAudioInit(latency)) - *new_rate = RWebAudioSampleRate(); + if (!RWebAudioInit(latency)) + { + RARCH_ERR("[RWebAudio] Failed to initialize driver!\n"); + return NULL; + } + rwebaudio_static_data = rwebaudio; + *new_rate = RWebAudioSampleRate(); + rwebaudio->tmpbuf_frames = RWEBAUDIO_BUFFER_SIZE_MS * *new_rate / 1000; + rwebaudio->tmpbuf_left = memalign(sizeof(float), rwebaudio->tmpbuf_frames * sizeof(float)); + rwebaudio->tmpbuf_right = memalign(sizeof(float), rwebaudio->tmpbuf_frames * sizeof(float)); + RARCH_LOG("[RWebAudio] Device rate: %d Hz.\n", *new_rate); + RARCH_LOG("[RWebAudio] Buffer size: %lu bytes.\n", RWebAudioBufferSizeFrames() * 2 * sizeof(float)); return rwebaudio; } static ssize_t rwebaudio_write(void *data, const void *s, size_t len) { - return RWebAudioWrite(s, len); + rwebaudio_data_t *rwebaudio = (rwebaudio_data_t*)data; + const float *samples = (const float*)s; + size_t num_frames = len / 2 / sizeof(float); + size_t written = 0; + if (!rwebaudio) + return -1; + + while (num_frames) + { + rwebaudio->tmpbuf_left[rwebaudio->tmpbuf_offset] = *(samples++); + rwebaudio->tmpbuf_right[rwebaudio->tmpbuf_offset] = *(samples++); + num_frames--; + if (++rwebaudio->tmpbuf_offset == rwebaudio->tmpbuf_frames) + { + size_t queued = RWebAudioQueueBuffer(rwebaudio->tmpbuf_frames, rwebaudio->tmpbuf_left, rwebaudio->tmpbuf_right); + rwebaudio->tmpbuf_offset = 0; + /* fast-forward or context is suspended */ + if (queued < rwebaudio->tmpbuf_frames) + break; + written += queued; + } + } + + if (rwebaudio->nonblock) + return written; + +#ifdef EMSCRIPTEN_AUDIO_EXTERNAL_WRITE_BLOCK +#ifdef EMSCRIPTEN_AUDIO_FAKE_BLOCK + if (RWebAudioWriteAvailFrames() == 0) + { + rwebaudio->block_requested = true; + platform_emscripten_enter_fake_block(1); + } +#endif + /* async external block doesn't need to do anything else */ +#else + while (RWebAudioWriteAvailFrames() == 0) + { +#ifdef EMSCRIPTEN_FULL_ASYNCIFY + retro_sleep(1); +#endif + RWebAudioResumeCtx(); + } +#endif + + return written; +} + +#ifdef EMSCRIPTEN_AUDIO_EXTERNAL_BLOCK +/* returns true if fake block should continue */ +bool rwebaudio_external_block(void) +{ + rwebaudio_data_t *rwebaudio = rwebaudio_static_data; + + if (!rwebaudio) + return false; + +#ifdef EMSCRIPTEN_AUDIO_FAKE_BLOCK + if (!rwebaudio->block_requested) + return false; +#endif + +#ifdef EMSCRIPTEN_AUDIO_EXTERNAL_WRITE_BLOCK + while (!rwebaudio->nonblock && RWebAudioWriteAvailFrames() == 0) + { + RWebAudioResumeCtx(); +#ifdef EMSCRIPTEN_AUDIO_ASYNC_BLOCK + retro_sleep(1); +#else + return true; +#endif + } +#endif + +#ifdef EMSCRIPTEN_AUDIO_FAKE_BLOCK + rwebaudio->block_requested = false; + platform_emscripten_exit_fake_block(); + return true; /* return to RAF if needed */ +#endif + return false; +} +#endif + +void rwebaudio_recalibrate_time(void) +{ + if (rwebaudio_static_data) + RWebAudioRecalibrateTime(); } static bool rwebaudio_stop(void *data) { - rweb_audio_t *rwebaudio = (rweb_audio_t*)data; + rwebaudio_data_t *rwebaudio = (rwebaudio_data_t*)data; if (!rwebaudio) return false; - rwebaudio->is_paused = true; + rwebaudio->running = false; return RWebAudioStop(); } -static void rwebaudio_set_nonblock_state(void *data, bool state) -{ - RWebAudioSetNonblockState(state); -} - -static bool rwebaudio_alive(void *data) -{ - rweb_audio_t *rwebaudio = (rweb_audio_t*)data; - if (!rwebaudio) - return false; - return !rwebaudio->is_paused; -} - static bool rwebaudio_start(void *data, bool is_shutdown) { - rweb_audio_t *rwebaudio = (rweb_audio_t*)data; + rwebaudio_data_t *rwebaudio = (rwebaudio_data_t*)data; if (!rwebaudio) return false; - rwebaudio->is_paused = false; + rwebaudio->running = true; return RWebAudioStart(); } -static size_t rwebaudio_write_avail(void *data) {return RWebAudioWriteAvail();} -static size_t rwebaudio_buffer_size(void *data) {return RWebAudioBufferSize();} +static bool rwebaudio_alive(void *data) +{ + rwebaudio_data_t *rwebaudio = (rwebaudio_data_t*)data; + if (!rwebaudio) + return false; + return rwebaudio->running; +} + +static void rwebaudio_set_nonblock_state(void *data, bool state) +{ + rwebaudio_data_t *rwebaudio = (rwebaudio_data_t*)data; + if (!rwebaudio) + return; + rwebaudio->nonblock = state; + RWebAudioSetNonblockState(state); +} + +static size_t rwebaudio_write_avail(void *data) +{ + rwebaudio_data_t *rwebaudio = (rwebaudio_data_t*)data; + size_t avail_frames; + if (!rwebaudio) + return 0; + + avail_frames = RWebAudioWriteAvailFrames(); + if (avail_frames > rwebaudio->tmpbuf_offset) + return (avail_frames - rwebaudio->tmpbuf_offset) * 2 * sizeof(float); + return 0; +} + +static size_t rwebaudio_buffer_size(void *data) +{ + return RWebAudioBufferSizeFrames() * 2 * sizeof(float); +} + static bool rwebaudio_use_float(void *data) { return true; } audio_driver_t audio_rwebaudio = { diff --git a/config.def.h b/config.def.h index dda01137e7..faee2e89ca 100644 --- a/config.def.h +++ b/config.def.h @@ -1176,7 +1176,7 @@ /* Desired audio latency in milliseconds. Might not be honored * if driver can't provide given latency. */ -#if defined(ANDROID) || defined(RETROFW) || defined(MIYOO) || (defined(EMSCRIPTEN) && !defined(HAVE_AUDIOWORKLET)) +#if defined(ANDROID) || defined(RETROFW) || defined(MIYOO) || (defined(EMSCRIPTEN) && defined(HAVE_AL)) /* For most Android devices, 64ms is way too low. */ #define DEFAULT_OUT_LATENCY 128 #define DEFAULT_IN_LATENCY 128 @@ -1682,7 +1682,7 @@ #if defined(__QNX__) || defined(_XBOX1) || defined(_XBOX360) || (defined(__MACH__) && defined(IOS)) || defined(ANDROID) || defined(WIIU) || defined(HAVE_NEON) || defined(GEKKO) || defined(__ARM_NEON__) || defined(__PS3__) #define DEFAULT_AUDIO_RESAMPLER_QUALITY_LEVEL RESAMPLER_QUALITY_LOWER -#elif defined(PSP) || defined(_3DS) || defined(VITA) || defined(PS2) || defined(DINGUX) || defined(EMSCRIPTEN) +#elif defined(PSP) || defined(_3DS) || defined(VITA) || defined(PS2) || defined(DINGUX) #define DEFAULT_AUDIO_RESAMPLER_QUALITY_LEVEL RESAMPLER_QUALITY_LOWEST #else #define DEFAULT_AUDIO_RESAMPLER_QUALITY_LEVEL RESAMPLER_QUALITY_NORMAL diff --git a/configuration.c b/configuration.c index f5a1c9a6f5..d3917d2170 100644 --- a/configuration.c +++ b/configuration.c @@ -590,7 +590,7 @@ static const enum microphone_driver_enum MICROPHONE_DEFAULT_DRIVER = MICROPHONE_ #if defined(RS90) || defined(MIYOO) static const enum audio_resampler_driver_enum AUDIO_DEFAULT_RESAMPLER_DRIVER = AUDIO_RESAMPLER_NEAREST; -#elif defined(PSP) || defined(EMSCRIPTEN) +#elif defined(PSP) || (defined(EMSCRIPTEN) && defined(HAVE_CC_RESAMPLER)) static const enum audio_resampler_driver_enum AUDIO_DEFAULT_RESAMPLER_DRIVER = AUDIO_RESAMPLER_CC; #else static const enum audio_resampler_driver_enum AUDIO_DEFAULT_RESAMPLER_DRIVER = AUDIO_RESAMPLER_SINC; diff --git a/emscripten/library_rwebaudio.js b/emscripten/library_rwebaudio.js index e7fa3dd76f..1599a50549 100644 --- a/emscripten/library_rwebaudio.js +++ b/emscripten/library_rwebaudio.js @@ -1,140 +1,79 @@ //"use strict"; var LibraryRWebAudio = { - $RA__deps: ['$Browser'], - $RA: { - BUFFER_SIZE: 2048, - + $RWA: { + /* add 10 ms of silence on start, seems to prevent underrun on start/unpausing (terrible crackling in firefox) */ + MIN_START_OFFSET_SEC: 0.01, + /* firefox needs more latency (transparent to audio driver) */ + EXTRA_LATENCY_FIREFOX_SEC: 0.01, + PLATFORM_EMSCRIPTEN_BROWSER_FIREFOX: 2, context: null, - buffers: [], - numBuffers: 0, - bufIndex: 0, - bufOffset: 0, - startTime: 0, + contextRunning: false, nonblock: false, - currentTimeWorkaround: false, - - setStartTime: function() { - if (RA.context.currentTime) { - RA.startTime = window['performance']['now']() - RA.context.currentTime * 1000; - Module["resumeMainLoop"](); - } else window['setTimeout'](RA.setStartTime, 0); - }, - - getCurrentPerfTime: function() { - if (RA.startTime) return (window['performance']['now']() - RA.startTime) / 1000; - else return 0; - }, - - process: function(queueBuffers) { - var currentTime = RA.getCurrentPerfTime(); - for (var i = 0; i < RA.bufIndex; i++) { - if (RA.buffers[i].endTime !== 0 && RA.buffers[i].endTime < currentTime) { - RA.buffers[i].endTime = 0; - var buf = RA.buffers.splice(i, 1); - RA.buffers[RA.numBuffers - 1] = buf[0]; - i--; - RA.bufIndex--; - } else if (!RA.startTime) { - RA.setStartTime(); - } - } - }, - - fillBuffer: function(buf, samples) { - var count = 0; - const leftBuffer = RA.buffers[RA.bufIndex].getChannelData(0); - const rightBuffer = RA.buffers[RA.bufIndex].getChannelData(1); - while (samples && RA.bufOffset !== RA.BUFFER_SIZE) { - leftBuffer[RA.bufOffset] = {{{ makeGetValue('buf', 'count * 8', 'float') }}}; - rightBuffer[RA.bufOffset] = {{{ makeGetValue('buf', 'count * 8 + 4', 'float') }}}; - RA.bufOffset++; - count++; - samples--; - } - - return count; - }, - - queueAudio: function() { - var index = RA.bufIndex; - - var startTime; - if (RA.bufIndex) startTime = RA.buffers[RA.bufIndex - 1].endTime; - else startTime = RA.context.currentTime; - RA.buffers[index].endTime = startTime + RA.buffers[index].duration; - - const bufferSource = RA.context.createBufferSource(); - bufferSource.buffer = RA.buffers[index]; - bufferSource.connect(RA.context.destination); - bufferSource.start(startTime); - - RA.bufIndex++; - RA.bufOffset = 0; - }, - - block: function() { - do { - RA.process(); - } while (RA.bufIndex === RA.numBuffers); - } + endTime: 0, + latency: 0, + virtualBufferFrames: 0, + currentTimeDiff: 0, + extraLatencySec: 0 }, - RWebAudioInit: function(latency) { - var ac = window['AudioContext'] || window['webkitAudioContext']; + /* AudioContext.currentTime can be inaccurate: https://bugzilla.mozilla.org/show_bug.cgi?id=901247 */ + $RWebAudioGetCurrentTime: function() { + return performance.now() / 1000 - RWA.currentTimeDiff; + }, + $RWebAudioStateChangeCB: function() { + RWA.contextRunning = RWA.context.state == "running"; + }, + + RWebAudioResumeCtx: function() { + if (!RWA.contextRunning) RWA.context.resume(); + return RWA.contextRunning; + }, + + RWebAudioInit__deps: ["$RWebAudioStateChangeCB", "platform_emscripten_get_browser"], + RWebAudioInit: function(latency) { + var ac = window.AudioContext || window.webkitAudioContext; if (!ac) return 0; - RA.context = new ac(); + RWA.context = new ac(); + RWA.currentTimeDiff = performance.now() / 1000 - RWA.context.currentTime; + RWA.nonblock = false; + RWA.endTime = 0; + RWA.latency = latency; + RWA.virtualBufferFrames = Math.round(RWA.latency * RWA.context.sampleRate / 1000); + RWA.context.addEventListener("statechange", RWebAudioStateChangeCB); + RWebAudioStateChangeCB(); + RWA.extraLatencySec = (_platform_emscripten_get_browser() == RWA.PLATFORM_EMSCRIPTEN_BROWSER_FIREFOX) ? RWA.EXTRA_LATENCY_FIREFOX_SEC : 0; - RA.numBuffers = ((latency * RA.context.sampleRate) / (1000 * RA.BUFFER_SIZE))|0; - if (RA.numBuffers < 2) RA.numBuffers = 2; - - for (var i = 0; i < RA.numBuffers; i++) { - RA.buffers[i] = RA.context.createBuffer(2, RA.BUFFER_SIZE, RA.context.sampleRate); - RA.buffers[i].endTime = 0 - } - - RA.nonblock = false; - RA.startTime = 0; - // chrome hack to get currentTime running - RA.context.createGain(); - window['setTimeout'](RA.setStartTime, 0); - Module["pauseMainLoop"](); return 1; }, RWebAudioSampleRate: function() { - return RA.context.sampleRate; + return RWA.context.sampleRate; }, - RWebAudioWrite: function (buf, size) { - RA.process(); - var samples = size / 8; - var count = 0; + RWebAudioQueueBuffer__deps: ["$RWebAudioGetCurrentTime", "RWebAudioResumeCtx", "RWebAudioWriteAvailFrames"], + RWebAudioQueueBuffer: function(num_frames, left, right) { + if (RWA.nonblock && _RWebAudioWriteAvailFrames() < num_frames) return 0; + if (!_RWebAudioResumeCtx()) return 0; - while (samples) { - if (RA.bufIndex === RA.numBuffers) { - if (RA.nonblock) break; - else RA.block(); - } + var buffer = RWA.context.createBuffer(2, num_frames, RWA.context.sampleRate); + buffer.getChannelData(0).set(HEAPF32.subarray(left >> 2, (left >> 2) + num_frames)); + buffer.getChannelData(1).set(HEAPF32.subarray(right >> 2, (right >> 2) + num_frames)); + var bufferSource = RWA.context.createBufferSource(); + bufferSource.buffer = buffer; + bufferSource.connect(RWA.context.destination); - var fill = RA.fillBuffer(buf, samples); - samples -= fill; - count += fill; - buf += fill * 8; + var currentTime = RWebAudioGetCurrentTime(); + var startTime = RWA.endTime > currentTime ? RWA.endTime : currentTime + RWA.MIN_START_OFFSET_SEC; + RWA.endTime = startTime + buffer.duration; + bufferSource.start(startTime + RWA.extraLatencySec); - if (RA.bufOffset === RA.BUFFER_SIZE) { - RA.queueAudio(); - } - } - - return count * 8; + return num_frames; }, RWebAudioStop: function() { - RA.bufIndex = 0; - RA.bufOffset = 0; return true; }, @@ -143,29 +82,32 @@ var LibraryRWebAudio = { }, RWebAudioSetNonblockState: function(state) { - RA.nonblock = state; + RWA.nonblock = state; }, + RWebAudioFree__deps: ["$RWebAudioStateChangeCB"], RWebAudioFree: function() { - RA.bufIndex = 0; - RA.bufOffset = 0; + RWA.context.removeEventListener("statechange", RWebAudioStateChangeCB); + RWA.context.close(); + RWA.contextRunning = false; }, - RWebAudioBufferSize: function() { - return RA.numBuffers * RA.BUFFER_SIZE * 8; + RWebAudioBufferSizeFrames: function() { + return RWA.virtualBufferFrames; }, - RWebAudioWriteAvail: function() { - RA.process(); - return ((RA.numBuffers - RA.bufIndex) * RA.BUFFER_SIZE - RA.bufOffset) * 8; + RWebAudioWriteAvailFrames__deps: ["$RWebAudioGetCurrentTime"], + RWebAudioWriteAvailFrames: function() { + var avail = Math.round(((RWA.latency / 1000) - RWA.endTime + RWebAudioGetCurrentTime()) * RWA.context.sampleRate); + if (avail <= 0) return 0; + if (avail >= RWA.virtualBufferFrames) return RWA.virtualBufferFrames; + return avail; }, RWebAudioRecalibrateTime: function() { - if (RA.startTime) { - RA.startTime = window['performance']['now']() - RA.context.currentTime * 1000; - } + if (RWA.contextRunning) RWA.currentTimeDiff = performance.now() / 1000 - RWA.context.currentTime; } }; -autoAddDeps(LibraryRWebAudio, '$RA'); +autoAddDeps(LibraryRWebAudio, '$RWA'); addToLibrary(LibraryRWebAudio); diff --git a/frontend/drivers/platform_emscripten.c b/frontend/drivers/platform_emscripten.c index 778622808f..f16d47829b 100644 --- a/frontend/drivers/platform_emscripten.c +++ b/frontend/drivers/platform_emscripten.c @@ -532,6 +532,16 @@ void platform_emscripten_set_canvas_size(int width, int height) PlatformEmscriptenSetCanvasSize(width, height); } +enum platform_emscripten_browser platform_emscripten_get_browser(void) +{ + return emscripten_platform_data->browser; +} + +enum platform_emscripten_os platform_emscripten_get_os(void) +{ + return emscripten_platform_data->os; +} + /* frontend driver impl */ static void frontend_emscripten_get_env(int *argc, char *argv[], diff --git a/frontend/drivers/platform_emscripten.h b/frontend/drivers/platform_emscripten.h index 58dfa27946..ae2204f57b 100644 --- a/frontend/drivers/platform_emscripten.h +++ b/frontend/drivers/platform_emscripten.h @@ -184,4 +184,18 @@ void platform_emscripten_set_wake_lock(bool state); */ void platform_emscripten_set_canvas_size(int width, int height); +/** + * Get the browser that the program is running in. + * + * @return enum platform_emscripten_browser + */ +enum platform_emscripten_browser platform_emscripten_get_browser(void); + +/** + * Get the OS that the program is running in. + * + * @return enum platform_emscripten_os + */ +enum platform_emscripten_os platform_emscripten_get_os(void); + #endif diff --git a/retroarch.c b/retroarch.c index 65f455c8fd..6bda54ec09 100644 --- a/retroarch.c +++ b/retroarch.c @@ -6008,11 +6008,17 @@ int rarch_main(int argc, char *argv[], void *data) #if defined(EMSCRIPTEN) -#if defined(EMSCRIPTEN_AUDIO_EXTERNAL_BLOCK) && defined(HAVE_AUDIOWORKLET) +#ifdef EMSCRIPTEN_AUDIO_EXTERNAL_BLOCK +#ifdef HAVE_AUDIOWORKLET bool audioworklet_external_block(void); #endif #ifdef HAVE_RWEBAUDIO -void RWebAudioRecalibrateTime(void); +bool rwebaudio_external_block(void); +#endif +#endif + +#ifdef HAVE_RWEBAUDIO +void rwebaudio_recalibrate_time(void); #endif void emscripten_mainloop(void) @@ -6037,13 +6043,19 @@ void emscripten_mainloop(void) if (platform_emscripten_should_drop_iter()) return; -#if defined(EMSCRIPTEN_AUDIO_FAKE_BLOCK) && defined(HAVE_AUDIOWORKLET) +#ifdef HAVE_RWEBAUDIO + rwebaudio_recalibrate_time(); +#endif + +#ifdef EMSCRIPTEN_AUDIO_FAKE_BLOCK +#ifdef HAVE_AUDIOWORKLET if (audioworklet_external_block()) return; #endif - #ifdef HAVE_RWEBAUDIO - RWebAudioRecalibrateTime(); + if (rwebaudio_external_block()) + return; +#endif #endif emscripten_frame_count++; @@ -6068,8 +6080,13 @@ void emscripten_mainloop(void) ret = runloop_iterate(); -#if defined(EMSCRIPTEN_AUDIO_ASYNC_BLOCK) && defined(HAVE_AUDIOWORKLET) +#ifdef EMSCRIPTEN_AUDIO_ASYNC_BLOCK +#ifdef HAVE_AUDIOWORKLET audioworklet_external_block(); +#endif +#ifdef HAVE_RWEBAUDIO + rwebaudio_external_block(); +#endif #endif task_queue_check(); From 0a6db1088a16252531b7fa127da35234aad6a37c Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Wed, 21 May 2025 21:37:54 -0400 Subject: [PATCH 108/175] macos: followup to runloop observer --- ui/drivers/ui_cocoa.m | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ui/drivers/ui_cocoa.m b/ui/drivers/ui_cocoa.m index 314730c040..3fe8313bd7 100644 --- a/ui/drivers/ui_cocoa.m +++ b/ui/drivers/ui_cocoa.m @@ -840,10 +840,6 @@ static ui_application_t ui_application_cocoa = { - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { NSApplicationTerminateReply reply = NSTerminateNow; - uint32_t runloop_flags = runloop_get_flags(); - - if (runloop_flags & RUNLOOP_FLAG_IS_INITED) - reply = NSTerminateCancel; command_event(CMD_EVENT_QUIT, NULL); From 0c872e7c94ab1778e366e3b355502ac9a312548d Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Thu, 22 May 2025 00:11:24 -0400 Subject: [PATCH 109/175] apple: add gearcoleco, geargrafx cores to app store builds --- pkg/apple/update-cores.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/apple/update-cores.sh b/pkg/apple/update-cores.sh index 2d3dbf951a..cb93e3c3fa 100755 --- a/pkg/apple/update-cores.sh +++ b/pkg/apple/update-cores.sh @@ -172,6 +172,8 @@ else fuse gambatte gearboy + gearcoleco + geargrafx gearsystem genesis_plus_gx genesis_plus_gx_wide From 7e52201fb64b45c521bef8a6bf5c5416c8bf66b8 Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Thu, 22 May 2025 01:38:28 -0400 Subject: [PATCH 110/175] apple: add sameduck core to app store builds --- pkg/apple/update-cores.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/apple/update-cores.sh b/pkg/apple/update-cores.sh index 2d3dbf951a..69ca971e70 100755 --- a/pkg/apple/update-cores.sh +++ b/pkg/apple/update-cores.sh @@ -221,6 +221,7 @@ else quicknes race sameboy + sameduck scummvm smsplus snes9x From 5514f71a00f14a4b479a11fc6935e16de75ce0b7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 23 May 2025 00:16:34 +0000 Subject: [PATCH 111/175] Fetch translations from Crowdin --- intl/msg_hash_ko.h | 8 ++++++++ intl/msg_hash_uk.h | 12 ++++++++++++ intl/progress.h | 4 ++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 2baa9e1a5e..567b28d501 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -4970,6 +4970,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "시작 디렉토리에서 콘텐츠를 불러올 경우 최근 사용한 위치에서 파일 탐색기를 시작합니다. 참고: RetroArch를 재시작하면 기본 위치로 초기화 됩니다." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "항상 코어 제안하기" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "코어가 이미 불러와져 있더라도 항상 사용 가능한 코어 목록을 표시합니다." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "내장 미디어 플레이어 사용" diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index 332c636fb5..e0009bdfbc 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -4938,6 +4938,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "Відкрити Файловий браузер в останньому використаному місці при завантаженні вмісту з папки Старт. Примітка: Місцезнаходження буде скинуто при перезапуску RetroArch." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Завжди пропонувати ядра" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Пропозиція доступних ядер навіть тоді, коли ядро вже завантажено." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Використовувати вбудований медіа-програвач" @@ -14902,6 +14910,10 @@ MSG_HASH( MSG_CHEEVOS_UNSUPPORTED_COUNT, "%d не підтримується" ) +MSG_HASH( + MSG_CHEEVOS_UNSUPPORTED_WARNING, + "Виявлені не підтримувані досягнення. Спробуйте змінити ядро або оновити Retroch." +) MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Перегляд %s" diff --git a/intl/progress.h b/intl/progress.h index d2a1df75b6..c90da2eec4 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -91,7 +91,7 @@ #define LANGUAGE_PROGRESS_JAPANESE_APPROVED 0 /* Korean */ -#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_KOREAN_APPROVED 0 /* Dutch */ @@ -143,7 +143,7 @@ #define LANGUAGE_PROGRESS_TATAR_APPROVED 0 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ From 766f8959484d045c335ebc27b98b99b426b02019 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Fri, 23 May 2025 14:51:23 +0300 Subject: [PATCH 112/175] Turbo fire override corrections (#17932) --- configuration.c | 86 +++++++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 49 deletions(-) diff --git a/configuration.c b/configuration.c index f5a1c9a6f5..34ef4ceb84 100644 --- a/configuration.c +++ b/configuration.c @@ -4639,11 +4639,11 @@ bool config_load_override_file(const char *config_path) */ bool config_unload_override(void) { - settings_t *settings = config_st; - bool fullscreen_prev = settings->bools.video_fullscreen; - uint32_t flags = runloop_get_flags(); + settings_t *settings = config_st; + runloop_state_t *runloop_st = runloop_state_get_ptr(); + bool fullscreen_prev = settings->bools.video_fullscreen; - runloop_state_get_ptr()->flags &= ~RUNLOOP_FLAG_OVERRIDES_ACTIVE; + runloop_st->flags &= ~RUNLOOP_FLAG_OVERRIDES_ACTIVE; path_clear(RARCH_PATH_CONFIG_OVERRIDE); /* Toggle has_save_path to false so it resets */ @@ -4664,10 +4664,14 @@ bool config_unload_override(void) && !settings->bools.video_fullscreen) settings->flags |= SETTINGS_FLG_SKIP_WINDOW_POSITIONS; - if (flags & RUNLOOP_FLAG_CORE_RUNNING) + if (runloop_st->flags & RUNLOOP_FLAG_CORE_RUNNING) command_event(CMD_EVENT_REINIT, NULL); } + /* Turbo fire settings must be reloaded from remap */ + if (settings->bools.auto_remaps_enable) + config_load_remap(settings->paths.directory_input_remapping, &runloop_st->system); + RARCH_LOG("[Overrides]: Configuration overrides unloaded, original configuration restored.\n"); /* Reset save paths */ @@ -5628,8 +5632,12 @@ int8_t config_save_overrides(enum override_type type, if (conf) { + /* Turbo fire settings are saved to remaps and therefore skipped from overrides */ for (i = 0; i < (unsigned)bool_settings_size; i++) { + if (string_starts_with(bool_settings[i].ident, "input_turbo")) + continue; + if ((*bool_settings[i].ptr) != (*bool_overrides[i].ptr)) { config_set_string(conf, bool_overrides[i].ident, @@ -5641,6 +5649,9 @@ int8_t config_save_overrides(enum override_type type, } for (i = 0; i < (unsigned)int_settings_size; i++) { + if (string_starts_with(int_settings[i].ident, "input_turbo")) + continue; + if ((*int_settings[i].ptr) != (*int_overrides[i].ptr)) { config_set_int(conf, int_overrides[i].ident, @@ -5651,6 +5662,9 @@ int8_t config_save_overrides(enum override_type type, } for (i = 0; i < (unsigned)uint_settings_size; i++) { + if (string_starts_with(uint_settings[i].ident, "input_turbo")) + continue; + if ((*uint_settings[i].ptr) != (*uint_overrides[i].ptr)) { config_set_int(conf, uint_overrides[i].ident, @@ -6071,30 +6085,17 @@ bool input_remapping_load_file(void *data, const char *path) _len = strlcpy(s1, "input_remap_port_p", sizeof(s1)); strlcpy(s1 + _len, formatted_number, sizeof(s1) - _len); CONFIG_GET_INT_BASE(conf, settings, uints.input_remap_ports[i], s1); - - /* Turbo fire settings */ - _len = strlcpy(s1, "input_turbo_enable", sizeof(s1)); - CONFIG_GET_BOOL_BASE(conf, settings, bools.input_turbo_enable, s1); - - _len = strlcpy(s1, "input_turbo_allow_dpad", sizeof(s1)); - CONFIG_GET_BOOL_BASE(conf, settings, bools.input_turbo_allow_dpad, s1); - - _len = strlcpy(s1, "input_turbo_mode", sizeof(s1)); - CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_mode, s1); - - _len = strlcpy(s1, "input_turbo_bind", sizeof(s1)); - CONFIG_GET_INT_BASE(conf, settings, ints.input_turbo_bind, s1); - - _len = strlcpy(s1, "input_turbo_button", sizeof(s1)); - CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_button, s1); - - _len = strlcpy(s1, "input_turbo_period", sizeof(s1)); - CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_period, s1); - - _len = strlcpy(s1, "input_turbo_duty_cycle", sizeof(s1)); - CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_duty_cycle, s1); } + /* Turbo fire settings */ + CONFIG_GET_BOOL_BASE(conf, settings, bools.input_turbo_enable, "input_turbo_enable"); + CONFIG_GET_BOOL_BASE(conf, settings, bools.input_turbo_allow_dpad, "input_turbo_allow_dpad"); + CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_mode, "input_turbo_mode"); + CONFIG_GET_INT_BASE(conf, settings, ints.input_turbo_bind, "input_turbo_bind"); + CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_button, "input_turbo_button"); + CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_period, "input_turbo_period"); + CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_duty_cycle, "input_turbo_duty_cycle"); + input_remapping_update_port_map(); /* Whenever a remap file is loaded, subsequent @@ -6282,30 +6283,17 @@ bool input_remapping_save_file(const char *path) _len = strlcpy(s1, "input_remap_port_p", sizeof(s1)); strlcpy(s1 + _len, formatted_number, sizeof(s1) - _len); config_set_int(conf, s1, settings->uints.input_remap_ports[i]); - - /* Turbo fire settings */ - _len = strlcpy(s1, "input_turbo_enable", sizeof(s1)); - config_set_string(conf, s1, settings->bools.input_turbo_enable ? "true" : "false"); - - _len = strlcpy(s1, "input_turbo_allow_dpad", sizeof(s1)); - config_set_string(conf, s1, settings->bools.input_turbo_allow_dpad ? "true" : "false"); - - _len = strlcpy(s1, "input_turbo_mode", sizeof(s1)); - config_set_int(conf, s1, settings->uints.input_turbo_mode); - - _len = strlcpy(s1, "input_turbo_bind", sizeof(s1)); - config_set_int(conf, s1, settings->ints.input_turbo_bind); - - _len = strlcpy(s1, "input_turbo_button", sizeof(s1)); - config_set_int(conf, s1, settings->uints.input_turbo_button); - - _len = strlcpy(s1, "input_turbo_period", sizeof(s1)); - config_set_int(conf, s1, settings->uints.input_turbo_period); - - _len = strlcpy(s1, "input_turbo_duty_cycle", sizeof(s1)); - config_set_int(conf, s1, settings->uints.input_turbo_duty_cycle); } + /* Turbo fire settings */ + config_set_string(conf, "input_turbo_enable", settings->bools.input_turbo_enable ? "true" : "false"); + config_set_string(conf, "input_turbo_allow_dpad", settings->bools.input_turbo_allow_dpad ? "true" : "false"); + config_set_int(conf, "input_turbo_mode", settings->uints.input_turbo_mode); + config_set_int(conf, "input_turbo_bind", settings->ints.input_turbo_bind); + config_set_int(conf, "input_turbo_button", settings->uints.input_turbo_button); + config_set_int(conf, "input_turbo_period", settings->uints.input_turbo_period); + config_set_int(conf, "input_turbo_duty_cycle", settings->uints.input_turbo_duty_cycle); + ret = config_file_write(conf, path, true); config_file_free(conf); From 4ba004a1e818d4078f79fc3208b9dbc04bfbe525 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Fri, 23 May 2025 16:06:53 +0300 Subject: [PATCH 113/175] Add 'Show Favorites First' visibility option (#17933) --- config.def.h | 1 + configuration.c | 1 + configuration.h | 1 + intl/msg_hash_lbl.h | 4 ++ intl/msg_hash_us.h | 8 ++++ menu/cbs/menu_cbs_sublabel.c | 4 ++ menu/drivers/ozone.c | 26 ++++++++-- menu/drivers/xmb.c | 25 ++++++++-- menu/menu_displaylist.c | 93 ++++++++++++++++++++++++++---------- menu/menu_setting.c | 15 ++++++ msg_hash.h | 1 + 11 files changed, 145 insertions(+), 34 deletions(-) diff --git a/config.def.h b/config.def.h index dda01137e7..141123765d 100644 --- a/config.def.h +++ b/config.def.h @@ -795,6 +795,7 @@ #define DEFAULT_CONTENT_SHOW_SETTINGS true #define DEFAULT_CONTENT_SHOW_HISTORY true #define DEFAULT_CONTENT_SHOW_FAVORITES true +#define DEFAULT_CONTENT_SHOW_FAVORITES_FIRST false #ifdef HAVE_IMAGEVIEWER #define DEFAULT_CONTENT_SHOW_IMAGES true #endif diff --git a/configuration.c b/configuration.c index 34ef4ceb84..d7215b10e2 100644 --- a/configuration.c +++ b/configuration.c @@ -2022,6 +2022,7 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("content_show_settings", &settings->bools.menu_content_show_settings, true, DEFAULT_CONTENT_SHOW_SETTINGS, false); SETTING_BOOL("content_show_favorites", &settings->bools.menu_content_show_favorites, true, DEFAULT_CONTENT_SHOW_FAVORITES, false); + SETTING_BOOL("content_show_favorites_first", &settings->bools.menu_content_show_favorites_first, true, DEFAULT_CONTENT_SHOW_FAVORITES_FIRST, false); #ifdef HAVE_IMAGEVIEWER SETTING_BOOL("content_show_images", &settings->bools.menu_content_show_images, true, DEFAULT_CONTENT_SHOW_IMAGES, false); #endif diff --git a/configuration.h b/configuration.h index c1d8cd67ee..3b0daa3655 100644 --- a/configuration.h +++ b/configuration.h @@ -820,6 +820,7 @@ typedef struct settings bool menu_xmb_vertical_thumbnails; bool menu_content_show_settings; bool menu_content_show_favorites; + bool menu_content_show_favorites_first; bool menu_content_show_images; bool menu_content_show_music; bool menu_content_show_video; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 5f081b6651..6fa47a6a88 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -4856,6 +4856,10 @@ MSG_HASH( MENU_ENUM_LABEL_CONTENT_SHOW_FAVORITES, "content_show_favorites" ) +MSG_HASH( + MENU_ENUM_LABEL_CONTENT_SHOW_FAVORITES_FIRST, + "content_show_favorites_first" + ) MSG_HASH( MENU_ENUM_LABEL_CONTENT_SHOW_IMAGES, "content_show_images" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index c233e8cfe8..3f63fb2cc4 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -6456,6 +6456,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, "Show the 'Favorites' menu. (Restart required on Ozone/XMB)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Show Favorites First" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, + "Show 'Favorites' before 'History'. (Restart required on Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Show 'Images'" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index dbac9f0523..395e2c6aa1 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -1164,6 +1164,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_enable_kiosk_mode, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_disable_kiosk_mode, MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_kiosk_mode_password, MENU_ENUM_SUBLABEL_MENU_KIOSK_MODE_PASSWORD) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_favorites_tab, MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_favorites_first, MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_images_tab, MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_show_load_core, MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CORE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_show_load_content, MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CONTENT) @@ -3055,6 +3056,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CONTENT_SHOW_FAVORITES: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_favorites_tab); break; + case MENU_ENUM_LABEL_CONTENT_SHOW_FAVORITES_FIRST: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_favorites_first); + break; case MENU_ENUM_LABEL_CONTENT_SHOW_IMAGES: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_images_tab); break; diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index bb4c099a43..a1115ba5e9 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -8913,32 +8913,50 @@ static void *ozone_init(void **userdata, bool video_is_threaded) ozone->system_tab_end = 0; ozone->tabs[ozone->system_tab_end] = OZONE_SYSTEM_TAB_MAIN; + if ( settings->bools.menu_content_show_settings && !settings->bools.kiosk_mode_enable) ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_SETTINGS; - if (settings->bools.menu_content_show_history) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_HISTORY; - if (settings->bools.menu_content_show_favorites) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_FAVORITES; + + if (settings->bools.menu_content_show_favorites_first) + { + if (settings->bools.menu_content_show_favorites) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_FAVORITES; + if (settings->bools.menu_content_show_history) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_HISTORY; + } + else + { + if (settings->bools.menu_content_show_history) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_HISTORY; + if (settings->bools.menu_content_show_favorites) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_FAVORITES; + } + #ifdef HAVE_IMAGEVIEWER if (settings->bools.menu_content_show_images) ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_IMAGES; #endif + if (settings->bools.menu_content_show_music) ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_MUSIC; + #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) if (settings->bools.menu_content_show_video) ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_VIDEO; #endif + #if 0 /* Move Netplay and Import Content to Main Menu */ #ifdef HAVE_NETWORKING if (settings->bools.menu_content_show_netplay) ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_NETPLAY; #endif + if ( settings->bools.menu_content_show_add && !settings->bools.kiosk_mode_enable) ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_ADD; #endif /* 0 */ + #if defined(HAVE_DYNAMIC) if (settings->uints.menu_content_show_contentless_cores != MENU_CONTENTLESS_CORES_DISPLAY_NONE) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 7315c901a6..43844ee3bc 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -8657,29 +8657,46 @@ static void *xmb_init(void **userdata, bool video_is_threaded) if ( settings->bools.menu_content_show_settings && !settings->bools.kiosk_mode_enable) xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_SETTINGS; - if (settings->bools.menu_content_show_history) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_HISTORY; - if (settings->bools.menu_content_show_favorites) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_FAVORITES; + + if (settings->bools.menu_content_show_favorites_first) + { + if (settings->bools.menu_content_show_favorites) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_FAVORITES; + if (settings->bools.menu_content_show_history) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_HISTORY; + } + else + { + if (settings->bools.menu_content_show_history) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_HISTORY; + if (settings->bools.menu_content_show_favorites) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_FAVORITES; + } + #ifdef HAVE_IMAGEVIEWER if (settings->bools.menu_content_show_images) xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_IMAGES; #endif + if (settings->bools.menu_content_show_music) xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_MUSIC; + #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) if (settings->bools.menu_content_show_video) xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_VIDEO; #endif + #if 0 /* Move Netplay and Import Content to Main Menu */ #ifdef HAVE_NETWORKING if (settings->bools.menu_content_show_netplay) xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_NETPLAY; #endif + if ( settings->bools.menu_content_show_add && !settings->bools.kiosk_mode_enable) xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_ADD; #endif /* 0 */ + #if defined(HAVE_DYNAMIC) if ( settings->uints.menu_content_show_contentless_cores != MENU_CONTENTLESS_CORES_DISPLAY_NONE) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index d191f2a0c7..69206589ff 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -4317,21 +4317,42 @@ static unsigned menu_displaylist_parse_playlists( if (show_history) { - if (settings->bools.menu_content_show_history) - if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY), - msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), - MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, - MENU_SETTING_ACTION, 0, 0, NULL)) - count++; + if (settings->bools.menu_content_show_favorites_first) + { + if (settings->bools.menu_content_show_favorites) + if (menu_entries_append(info_list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), + MENU_ENUM_LABEL_GOTO_FAVORITES, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; - if (settings->bools.menu_content_show_favorites) - if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), - msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), - MENU_ENUM_LABEL_GOTO_FAVORITES, - MENU_SETTING_ACTION, 0, 0, NULL)) - count++; + if (settings->bools.menu_content_show_history) + if (menu_entries_append(info_list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY), + msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), + MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + } + else + { + if (settings->bools.menu_content_show_history) + if (menu_entries_append(info_list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY), + msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), + MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + + if (settings->bools.menu_content_show_favorites) + if (menu_entries_append(info_list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), + MENU_ENUM_LABEL_GOTO_FAVORITES, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + } } if (settings->bools.menu_content_show_images) @@ -10088,6 +10109,7 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_CONTENT_SHOW_PLAYLIST_TABS, PARSE_ONLY_BOOL, true }, {MENU_ENUM_LABEL_CONTENT_SHOW_HISTORY, PARSE_ONLY_BOOL, true }, {MENU_ENUM_LABEL_CONTENT_SHOW_FAVORITES, PARSE_ONLY_BOOL, true }, + {MENU_ENUM_LABEL_CONTENT_SHOW_FAVORITES_FIRST, PARSE_ONLY_BOOL, true }, {MENU_ENUM_LABEL_CONTENT_SHOW_IMAGES, PARSE_ONLY_BOOL, true }, {MENU_ENUM_LABEL_CONTENT_SHOW_MUSIC, PARSE_ONLY_BOOL, true }, {MENU_ENUM_LABEL_CONTENT_SHOW_VIDEO, PARSE_ONLY_BOOL, true }, @@ -15135,19 +15157,38 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, || (string_is_equal(menu_ident, "glui") && !settings->bools.menu_materialui_show_nav_bar)) { - if (settings->bools.menu_content_show_history) - if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(info->list, - MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, - PARSE_ACTION, false) == 0) - count++; + if (settings->bools.menu_content_show_favorites_first) + { + if (settings->bools.menu_content_show_favorites) + if (menu_entries_append(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), + MENU_ENUM_LABEL_GOTO_FAVORITES, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; - if (settings->bools.menu_content_show_favorites) - if (menu_entries_append(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), - msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), - MENU_ENUM_LABEL_GOTO_FAVORITES, - MENU_SETTING_ACTION, 0, 0, NULL)) - count++; + if (settings->bools.menu_content_show_history) + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(info->list, + MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, + PARSE_ACTION, false) == 0) + count++; + } + else + { + if (settings->bools.menu_content_show_history) + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(info->list, + MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, + PARSE_ACTION, false) == 0) + count++; + + if (settings->bools.menu_content_show_favorites) + if (menu_entries_append(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), + MENU_ENUM_LABEL_GOTO_FAVORITES, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + } } #ifdef HAVE_CDROM diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 462120b67a..0fef269c98 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -19254,6 +19254,21 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE); + CONFIG_BOOL( + list, list_info, + &settings->bools.menu_content_show_favorites_first, + MENU_ENUM_LABEL_CONTENT_SHOW_FAVORITES_FIRST, + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + DEFAULT_CONTENT_SHOW_FAVORITES_FIRST, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + #ifdef HAVE_IMAGEVIEWER CONFIG_BOOL( list, list_info, diff --git a/msg_hash.h b/msg_hash.h index 7a8a3c7e2e..e0b19bca35 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1598,6 +1598,7 @@ enum msg_hash_enums MENU_LABEL(CONTENT_SHOW_SETTINGS), MENU_LABEL(CONTENT_SHOW_SETTINGS_PASSWORD), MENU_LABEL(CONTENT_SHOW_FAVORITES), + MENU_LABEL(CONTENT_SHOW_FAVORITES_FIRST), MENU_LABEL(CONTENT_SHOW_IMAGES), MENU_LABEL(CONTENT_SHOW_MUSIC), MENU_LABEL(CONTENT_SHOW_VIDEO), From d5699457ca1eee6476785ad153bab8819d2d6d38 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 24 May 2025 00:15:33 +0000 Subject: [PATCH 114/175] Fetch translations from Crowdin --- intl/msg_hash_de.h | 8 ++++++++ intl/msg_hash_es.h | 8 ++++++++ intl/msg_hash_fi.h | 12 ++++++++++++ intl/msg_hash_it.h | 8 ++++++++ intl/msg_hash_pl.h | 4 ++++ intl/msg_hash_tr.h | 8 ++++++++ intl/progress.h | 12 ++++++------ 7 files changed, 54 insertions(+), 6 deletions(-) diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index ce8675fe4e..027351979a 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -6244,6 +6244,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, "Das „Favoriten“-Menü anzeigen. (Neustart erforderlich bei Ozone/XMB)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Favoriten zuerst anzeigen" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, + "„Favoriten“ vor „Verlauf“ anzeigen. (Für Ozone/XMB Neustart erforderlich)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "\"Bilder\" anzeigen" diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index 1a8d01b87a..e1061f89af 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -6360,6 +6360,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, "Muestra el menú Favoritos (es necesario reiniciar en Ozone/XMB)." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Mostrar Favoritos en primer lugar" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, + "Muestra el menú de favoritos antes que el historial (es necesario reiniciar en Ozone/XMB)." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Mostrar Imágenes" diff --git a/intl/msg_hash_fi.h b/intl/msg_hash_fi.h index a3b0dac063..33031c8fef 100644 --- a/intl/msg_hash_fi.h +++ b/intl/msg_hash_fi.h @@ -4226,6 +4226,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "Avaa tiedostoselain viimeksi käytetyssä sijainnissa, kun lataat sisältöä aloitushakemistosta. Huom: sijainti palautetaan oletusarvoon RetroArchin uudelleenkäynnistyessä." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Ehdota aina ytimiä" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Ehdota saatavilla olevia ytimiä silloinkin, kun ydin on jo ladattu." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Käytä sisäänrakennettua mediasoitinta" @@ -5392,6 +5400,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Näytä \"Suosikit\"" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Näytä suosikit ensin" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Näytä \"Kuvat\"" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index c66e6d67f9..9da626b605 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -6260,6 +6260,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, "Mostra il menu 'Preferiti'. (Riavvio richiesto su Ozone/XMB)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Mostra Prima I Preferiti" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, + "Mostra 'Preferiti' prima della 'Cronologia'. (Restart richiesto su Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Mostra 'Immagini'" diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index 5294e3f1eb..fa699feacf 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -5488,6 +5488,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, "Pokaż menu 'Ulubione'. (Wymagany restart w Ozone/XMB)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Pokaż zakładkę Ulubione" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Pokaż 'Obrazy'" diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index cab4c1b3af..96249e51b0 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -6364,6 +6364,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, "'Sık Kullanılanlar' menüsünü gösterin. (Ozon/XMB'de Yeniden Başlatılmalı)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Sık Kullanılanları Öncelikli Göster" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, + "'Geçmiş' bölümünden önce 'Sık Kullanılanları' göster. (Ozone/XMB yeniden başlatılmalı)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "'Resimler' Göster" diff --git a/intl/progress.h b/intl/progress.h index c90da2eec4..5313a50c75 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -1,5 +1,5 @@ /* Arabic */ -#define LANGUAGE_PROGRESS_ARABIC_TRANSLATED 45 +#define LANGUAGE_PROGRESS_ARABIC_TRANSLATED 44 #define LANGUAGE_PROGRESS_ARABIC_APPROVED 0 /* Asturian */ @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -59,8 +59,8 @@ #define LANGUAGE_PROGRESS_FINNISH_APPROVED 45 /* French */ -#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 100 -#define LANGUAGE_PROGRESS_FRENCH_APPROVED 100 +#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_FRENCH_APPROVED 99 /* Galician */ #define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 99 @@ -91,7 +91,7 @@ #define LANGUAGE_PROGRESS_JAPANESE_APPROVED 0 /* Korean */ -#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_KOREAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_KOREAN_APPROVED 0 /* Dutch */ @@ -143,7 +143,7 @@ #define LANGUAGE_PROGRESS_TATAR_APPROVED 0 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ From dd45f8cb0c3d7be20eeaa96d81dcce7eca33f9c7 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Sat, 24 May 2025 22:18:49 +0300 Subject: [PATCH 115/175] Rewind logging cleanup --- intl/msg_hash_us.h | 4 ++++ msg_hash.h | 1 + state_manager.c | 16 ++++++++++------ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 3f63fb2cc4..0928caf862 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -15018,6 +15018,10 @@ MSG_HASH( MSG_REWINDING, "Rewinding." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Buffer capacity insufficient." + ) MSG_HASH( MSG_REWIND_UNSUPPORTED, "Rewind unavailable because this core lacks serialized save state support." diff --git a/msg_hash.h b/msg_hash.h index e0b19bca35..1e43e8ed8a 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -418,6 +418,7 @@ enum msg_hash_enums MSG_DECOMPRESSION_FAILED, MSG_DISK_EJECTED, MSG_DISK_CLOSED, + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, MSG_REWIND_UNSUPPORTED, MSG_REWIND_INIT, MSG_REWIND_INIT_FAILED, diff --git a/state_manager.c b/state_manager.c index 2ac5d729e8..f5c6c19283 100644 --- a/state_manager.c +++ b/state_manager.c @@ -515,7 +515,8 @@ static void state_manager_push_do(state_manager_t *state) size_t headpos, tailpos, remaining; if (state->capacity < sizeof(size_t) + state->maxcompsize) { - RARCH_ERR("State capacity insufficient\n"); + RARCH_ERR("[Rewind]: %s.\n", + msg_hash_to_str(MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT)); return; } @@ -609,13 +610,15 @@ void state_manager_event_init( if (!core_info_current_supports_rewind()) { - RARCH_ERR("%s\n", msg_hash_to_str(MSG_REWIND_UNSUPPORTED)); + RARCH_ERR("[Rewind]: %s.\n", + msg_hash_to_str(MSG_REWIND_UNSUPPORTED)); return; } if (audio_driver_has_callback()) { - RARCH_ERR("%s.\n", msg_hash_to_str(MSG_REWIND_INIT_FAILED_THREADED_AUDIO)); + RARCH_ERR("[Rewind]: %s.\n", + msg_hash_to_str(MSG_REWIND_INIT_FAILED_THREADED_AUDIO)); return; } @@ -623,12 +626,12 @@ void state_manager_event_init( if (!rewind_st->size) { - RARCH_ERR("%s.\n", + RARCH_ERR("[Rewind]: %s.\n", msg_hash_to_str(MSG_REWIND_INIT_FAILED)); return; } - RARCH_LOG("%s: %u MB\n", + RARCH_LOG("[Rewind]: %s: %u MB\n", msg_hash_to_str(MSG_REWIND_INIT), (unsigned)(rewind_buffer_size / 1000000)); @@ -636,7 +639,8 @@ void state_manager_event_init( rewind_buffer_size); if (!rewind_st->state) - RARCH_WARN("%s.\n", msg_hash_to_str(MSG_REWIND_INIT_FAILED)); + RARCH_WARN("[Rewind]: %s.\n", + msg_hash_to_str(MSG_REWIND_INIT_FAILED)); state_manager_push_where(rewind_st->state, &state); From 1956b6e01f4350225cf40e93b081740b7ffa2e8b Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 25 May 2025 00:18:18 +0000 Subject: [PATCH 116/175] Fetch translations from Crowdin --- intl/msg_hash_ca.h | 8 ++++++++ intl/msg_hash_es.h | 4 ++++ intl/msg_hash_fr.h | 8 ++++++++ intl/msg_hash_pl.h | 4 ++++ intl/msg_hash_ru.h | 12 ++++++++++++ intl/msg_hash_tr.h | 4 ++++ intl/progress.h | 2 +- 7 files changed, 41 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 7d9ad1467b..1715834cfc 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -6344,6 +6344,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, "Mostra el menú 'Preferits'. (Es requereix reiniciar per Ozone/XMB)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Mostra primer els preferits" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, + "Mostra els preferits abans que l'historial. (Es requereix reiniciar per Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Mostrar Imatges" diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index e1061f89af..d7f067a42c 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -14234,6 +14234,10 @@ MSG_HASH( MSG_REWINDING, "Rebobinando." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Capacidad de búfer insuficiente." + ) MSG_HASH( MSG_REWIND_UNSUPPORTED, "El rebobinado no está disponible porque este núcleo no tiene soporte para guardados rápidos serializados." diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 8ef9c7f6a7..943492fcf6 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -6320,6 +6320,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, "Afficher le menu 'Favoris'. (Redémarrage requis sur Ozone/XMB)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Afficher les favoris en premier" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, + "Afficher les 'Favoris' avant 'Historique'. (Redémarrage requis sur Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Afficher 'Images'" diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index fa699feacf..c2954ae54c 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -12594,6 +12594,10 @@ MSG_HASH( MSG_REWINDING, "Przewijanie." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Niewystarczająca pojemność bufora." + ) MSG_HASH( MSG_REWIND_INIT, "Inicjowanie bufora przewijania z rozmiarem" diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 99c50f01b1..924b1c0911 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -6392,6 +6392,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, "Показывать меню 'Избранное' (требуется перезапуск для Ozone/XMB)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Показывать сначала 'Избранное'" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, + "Показывать вкладку 'Избранное' перед 'Историей запуска' (требуется перезапуск для Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Показывать 'Изображения'" @@ -14266,6 +14274,10 @@ MSG_HASH( MSG_REWINDING, "Перемотка." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Недостаточная ёмкость буфера." + ) MSG_HASH( MSG_REWIND_UNSUPPORTED, "Обратная перемотка недоступна из-за отсутствия в ядре сериализованной поддержки быстрых сохранений." diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 96249e51b0..420c1d8744 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -14322,6 +14322,10 @@ MSG_HASH( MSG_REWINDING, "Geri sarılıyor." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Arabellek kapasitesi yetersiz." + ) MSG_HASH( MSG_REWIND_UNSUPPORTED, "Bu çekirdekte serileştirilmiş durum kaydı desteği bulunmadığından geri sarma kullanılamıyor." diff --git a/intl/progress.h b/intl/progress.h index 5313a50c75..fbb236ca61 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -31,7 +31,7 @@ #define LANGUAGE_PROGRESS_DANISH_APPROVED 0 /* German */ -#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_GERMAN_APPROVED 13 /* Greek */ From 3f2021249b6d218028aaa5adddc473fd44cec55a Mon Sep 17 00:00:00 2001 From: sonninnos Date: Sun, 25 May 2025 15:49:26 +0300 Subject: [PATCH 117/175] Deprecated msg hash cleanups --- configuration.c | 4 --- input/input_defines.h | 3 -- intl/msg_hash_ar.h | 57 ------------------------------ intl/msg_hash_ast.h | 8 ----- intl/msg_hash_be.h | 65 ---------------------------------- intl/msg_hash_ca.h | 65 ---------------------------------- intl/msg_hash_chs.h | 65 ---------------------------------- intl/msg_hash_cht.h | 65 ---------------------------------- intl/msg_hash_cs.h | 65 ---------------------------------- intl/msg_hash_de.h | 65 ---------------------------------- intl/msg_hash_el.h | 30 ---------------- intl/msg_hash_es.h | 65 ---------------------------------- intl/msg_hash_fi.h | 57 ------------------------------ intl/msg_hash_fr.h | 65 ---------------------------------- intl/msg_hash_gl.h | 65 ---------------------------------- intl/msg_hash_he.h | 9 ----- intl/msg_hash_hu.h | 65 ---------------------------------- intl/msg_hash_id.h | 25 -------------- intl/msg_hash_it.h | 65 ---------------------------------- intl/msg_hash_ja.h | 65 ---------------------------------- intl/msg_hash_ko.h | 65 ---------------------------------- intl/msg_hash_lbl.h | 24 ++----------- intl/msg_hash_nl.h | 33 ------------------ intl/msg_hash_no.h | 12 ------- intl/msg_hash_pl.h | 65 ---------------------------------- intl/msg_hash_pt_br.h | 61 -------------------------------- intl/msg_hash_pt_pt.h | 16 --------- intl/msg_hash_ru.h | 65 ---------------------------------- intl/msg_hash_sk.h | 30 ---------------- intl/msg_hash_sv.h | 65 ---------------------------------- intl/msg_hash_tr.h | 65 ---------------------------------- intl/msg_hash_uk.h | 65 ---------------------------------- intl/msg_hash_us.h | 67 +----------------------------------- intl/msg_hash_val.h | 8 ----- intl/msg_hash_vn.h | 4 --- menu/cbs/menu_cbs_sublabel.c | 4 --- msg_hash.h | 25 -------------- retroarch.c | 4 --- 38 files changed, 3 insertions(+), 1648 deletions(-) diff --git a/configuration.c b/configuration.c index d7215b10e2..101ab9ddac 100644 --- a/configuration.c +++ b/configuration.c @@ -408,10 +408,6 @@ const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = { DECLARE_META_BIND(2, overlay_next, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT), DECLARE_META_BIND(2, osk_toggle, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK), -#if 0 - /* Deprecated */ - DECLARE_META_BIND(2, send_debug_info, RARCH_SEND_DEBUG_INFO, MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO), -#endif }; #if defined(HAVE_METAL) diff --git a/input/input_defines.h b/input/input_defines.h index cb47fe4d6b..ea18b5e11a 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -191,9 +191,6 @@ enum RARCH_BIND_LIST_END, - /* Deprecated */ - RARCH_SEND_DEBUG_INFO, - RARCH_BIND_LIST_END_NULL }; diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index a7381565cd..aa9f6265a6 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -2933,15 +2933,6 @@ MSG_HASH( "تبديل جلسة الشبكة الحالية بين وضع 'تشغيل' و 'نظرة'." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "إرسال معلومات التصحيح" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "يرسل معلومات تشخيصية حول جهازك وتكوين RetroArch إلى خوادمنا للتحليل." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -7760,10 +7751,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "نسبة الجوانب التلقائية" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "الاسم المستعار (الشبكة): %s" @@ -7776,10 +7763,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "نظام BGM" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "نسبة مخصصة" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "دعم التسجيل" @@ -7800,14 +7783,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "اختر المطابقة لعرضها." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "نسبة الجاذبية" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "حدد من قائمة التشغيل" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "عرض قائمة %u مباريات" @@ -7876,14 +7851,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT, "تحميل المحتوى" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "إرسال معلومات التصحيح" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "يرسل معلومات تشخيصية حول جهازك وتكوين RetroArch إلى خوادمنا للتحليل." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "إعدادات قاعدة البيانات" @@ -8097,30 +8064,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "اضغط على اليمين خمس مرات لحذف جميع الغش." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "فشل في حفظ معلومات التصحيح." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "فشل في إرسال معلومات التصحيح إلى الخادم." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "جارٍ إرسال معلومات التصحيح..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "تم إرسال معلومات التصحيح إلى الخادم بنجاح. رقم التعريف الخاص بك هو %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "اضغط مرتين أخريين لتقديم معلومات تشخيصية لفريق RetroArch." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "اضغط مرة أخرى لتقديم معلومات تشخيصية لفريق RetroArch." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "مستوى صوت مزيج الصوت العالمي" diff --git a/intl/msg_hash_ast.h b/intl/msg_hash_ast.h index 0483850f19..df8669be5b 100644 --- a/intl/msg_hash_ast.h +++ b/intl/msg_hash_ast.h @@ -3877,14 +3877,6 @@ MSG_HASH( /* FIXME Should be MSG_ */ MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED, "El xuegu en llinia aníciase cuando se carga conteníu." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Hebo un error al guardar la información de depuración." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Hebo un error al unviar la información de depuración al sirvidor." - ) MSG_HASH( MSG_NETPLAY_YOU_HAVE_LEFT_THE_GAME, "Colesti de la partida" diff --git a/intl/msg_hash_be.h b/intl/msg_hash_be.h index 687df9f6b2..c411a4f50f 100644 --- a/intl/msg_hash_be.h +++ b/intl/msg_hash_be.h @@ -4037,15 +4037,6 @@ MSG_HASH( "Пераключэнне паміж згасаючымі і статычнымі паведамленнямі чата." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Адпраўка адладачных звестак" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Адпраўляе дыягнастычныя звесткі пра вашую прыладу ды канфігурацыю RetroArch на нашы серверы для аналізу." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6317,14 +6308,6 @@ MSG_HASH( "Паказваць меню нядаўняй гісторыі. (Патрабуецца перазапуск на Ozone/XMB)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Паказ 'Імпартаваць змесціва'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Паказваць меню 'Імпартаваць змесціва'. (Патрабуецца перазапуск на Ozone/XMB)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Паказ 'Імпартаваць змесціва'" ) @@ -12696,10 +12679,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Аўтасуадносіны бакоў" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Мянушка (LAN): %s" @@ -12712,10 +12691,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Фонавы гук сістэмы" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Ручная ўстаноўка" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Падтрымка запісу" @@ -12736,14 +12711,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Выбар супадзення для прагляду." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Фарсіраваць прапорцыі" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Выбраць з плэйліста" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Прагляд спісу %u супадзенняў" @@ -12820,14 +12787,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Што ёсць ядро?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Адпраўка адладачных звестак" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Адпраўляе інфармацыю аб прыладзе і канфігурацыі RetroArch на нашы серверы для аналізу." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Налады базы даных" @@ -13109,30 +13068,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Націсніце направа пяць разоў для выдалення ўсіх чыт-кодаў." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Не атрымалася захаваць адладачныя звесткі." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Не атрымалася адаслаць адладачныя звесткі на сервер." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Адпраўка адладачных звестак..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Звесткі для адладкі паспяхова адпраўлены на сервер. Ваш ID-нумар: %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Націсніце яшчэ два разы для адпраўкі звестак камандзе RetroArch." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Націсніце яшчэ раз для адпраўкі звестак камандзе RetroArch." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Агульны ўзровень гучнасці гукавога мікшэра" diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 1715834cfc..bb153afeca 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -4109,15 +4109,6 @@ MSG_HASH( "Canvia entre els missatges de xat estàtics o esvaïts." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Envia informació de depuració" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Envia informació de diagnòstic sobre el vostre dispositiu i la configuració de RetroArch als nostres servidors per a ser analitzada." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6393,14 +6384,6 @@ MSG_HASH( "Mostra l'historial d'elements recents (Es requereix reiniciar per Ozone/XMB)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Mostra «Importa contingut»" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Mostra el menú 'Importar contingut'. (Es requereix reiniciar per Ozone/XMB)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostra «Importa contingut»" ) @@ -12648,10 +12631,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Relació d’aspecte automàtica" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Sobrenom (LAN): %s" @@ -12664,10 +12643,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Sistema BGM" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Relació personalitzada" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Compatibilitat amb l'enregistrament" @@ -12688,14 +12663,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Selecciona la coincidència que vols veure." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Força la relació d’aspecte" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Selecciona des d'una llista de reproducció" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Mostra la llista de coincidències" @@ -12772,14 +12739,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Què és un nucli?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Envia informació de depuració" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Envia informació de diagnòstic sobre el vostre dispositiu i la configuració de RetroArch als nostres servidors per a ser analitzada." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Configuració de la base de dades" @@ -13061,30 +13020,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Premeu dreta cinc vegades per esborrar tots els trucs." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "No s’ha pogut desar la informació de depuració." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "No s’ha pogut enviar la informació de depuració al servidor." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "S’està enviant la informació de depuració..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "S’ha enviat la informació de depuració al servidor correctament. El vostre número d’ID és %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Premeu dues vegades més per enviar informació de diagnòstic a l’equip del RetroArch." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Premeu una vegada més per enviar informació de diagnòstic a l’equip del RetroArch." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Volum del mesclador d’àudio global" diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 6c35cc71b8..a649226529 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -3889,15 +3889,6 @@ MSG_HASH( "在淡出和静态网络播放聊天消息之间切换。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "发送调试信息" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "发送设备诊断信息和全能模拟器配置到我们的服务器进行分析。" - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6113,14 +6104,6 @@ MSG_HASH( "显示「历史」菜单。(在 Ozone/XMB 中需要重启)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "显示「导入」页" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "显示「导入」菜单。(在 Ozone/XMB 中需要重启)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "显示「导入」" ) @@ -12376,10 +12359,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "自动选择宽高比" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "昵称 (局域网):%s" @@ -12392,10 +12371,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "启用系统背景音乐" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "自定义比率" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "录制支持" @@ -12416,14 +12391,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "选择要查看的比赛。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "保持宽高比" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "从列表中选择" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "查看匹配的 %u 个列表" @@ -12500,14 +12467,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "什么是核心?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "发送调试信息" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "发送设备诊断信息和全能模拟器配置到我们的服务器进行分析。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "数据库设置" @@ -12789,30 +12748,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "按右键五次删除所有金手指。" ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "保存调试信息失败。" - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "向服务器发送调试信息失败。" - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "正在发送调试信息..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "成功发送调试信息到服务器。您的 ID 是 %u。" - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "再按两次,将诊断信息提交给全能模拟器团队。" - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "再按一次,将诊断信息提交给全能模拟器团队。" - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "全局混音器音量" diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 85cc9d359e..352241b9c6 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -3869,15 +3869,6 @@ MSG_HASH( "連線遊戲時淡化對話訊息的開關。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "傳送除錯資訊" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "將有關您的裝置和設定相關的診斷信息, 發送到我們的服務器進行分析。" - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -5973,14 +5964,6 @@ MSG_HASH( "顯示「歷史」列表。 (Ozone和XMB主題需要重新啟動)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "顯示「匯入遊戲」" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "顯示「匯入遊戲」選項。 (Ozone和XMB主題需要重新啟動)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "顯示「匯入遊戲」" ) @@ -12428,10 +12411,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "自動寬高比" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "(區域網路) 暱稱: %s" @@ -12444,10 +12423,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "系統背景音樂" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "自訂比例" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "錄製支援" @@ -12468,14 +12443,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "選擇要查看的搜尋結果。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "強制寬高比" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "從列表中選擇" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "查看 %u個 搜尋結果列表" @@ -12552,14 +12519,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "什麼是核心?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "傳送除錯資訊" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "將有關您的裝置與設定相關的診斷信息, 傳送到我們的服務器進行分析。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "資料庫設定" @@ -12841,30 +12800,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "按[右鍵]五次刪除全部金手指。" ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "無法儲存除錯資訊。" - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "無法將除錯資訊傳送到服務器。" - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "傳送除錯資訊中..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "已成功將除錯資訊傳送到服務器, 您的ID號碼是「%u」。" - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "再按兩次, 將診斷訊息提交給RetroArch團隊。" - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "再按一次, 將診斷訊息提交給RetroArch團隊。" - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "混音器音訊通道音量" diff --git a/intl/msg_hash_cs.h b/intl/msg_hash_cs.h index 829ed9d1f1..8be34fbfd5 100644 --- a/intl/msg_hash_cs.h +++ b/intl/msg_hash_cs.h @@ -4025,15 +4025,6 @@ MSG_HASH( "Přepínání mezi blednoucími a statickými zprávami chatu při hraní po síti." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Odeslání infa o ladění" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Odešle diagnostické informace o vašem zařízení a konfiguraci aplikace RetroArch na naše servery k analýze." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6301,14 +6292,6 @@ MSG_HASH( "Zobrazení menu nedávné historie. (V systému Ozone/XMB je nutný restart)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Zobrazit 'Importovat obsah'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Zobrazení menu „Importovat obsah“. (V systému Ozone/XMB je nutný restart)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Zobrazit 'Importovat obsah'" ) @@ -12596,10 +12579,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Automatický poměr stran" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Přezdívka (LAN): %s" @@ -12612,10 +12591,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Systém BGM" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Vlastní poměr" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Podpora záznamu" @@ -12636,14 +12611,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Vyberte shody k zobrazení." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Vynutit poměr stran" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Vybrat z playlistu" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Zobrazit seznam %u shod" @@ -12716,14 +12683,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Co je jádro?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Odeslat informace o ladění" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Odešle diagnostické informace o vašem zařízení a konfiguraci RetroArch na naše servery k analýze." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Nastavení databáze" @@ -13005,30 +12964,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Pětkrát stiskněte pravé tlačítko a smažte všechny cheaty." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Nepodařilo se uložit informace o ladění." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Nepodařilo se odeslat ladící informace na server." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Odesílání informací o ladění..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Informace o ladění byly úspěšně odeslány na server. Číslo Vašeho ID je %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Pro odeslání diagnostických informací týmu RetroArch stiskněte ještě dvakrát." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Pro odeslání diagnostických informací týmu RetroArch stiskněte ještě jednou." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Globální hlasitost směšovače zvuku" diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 027351979a..6d0938b2c3 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -4017,15 +4017,6 @@ MSG_HASH( "Zwischen verblassenden und statischen Netzwerkspiel-Chatnachrichten umschalten." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Debugging-Informationen senden" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Sendet Diagnoseinformationen über das Gerät und die RetroArch-Konfiguration zur Analyse an unsere Server." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6293,14 +6284,6 @@ MSG_HASH( "Das „Verlauf“-Menü anzeigen. (Neustart erforderlich bei Ozone/XMB)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "\"Inhalte importieren\" anzeigen" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Das „Inhalte importieren“-Menü anzeigen. (Neustart erforderlich bei Ozone/XMB)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "\"Inhalte importieren\" anzeigen" ) @@ -12412,10 +12395,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Automatisches Bildseitenverhältnis" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Spitzname (LAN): %s" @@ -12424,10 +12403,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Aktiviere System-BGM" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Benutzerdefiniertes Verhältnis" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Aktiviere Aufnahmefunktion" @@ -12448,14 +12423,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Treffer auswählen, der angezeigt werden soll." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Seitenverhältnis erzwingen" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Wähle aus Wiedergabenliste" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Liste von %u Treffern ansehen" @@ -12532,14 +12499,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Was ist ein Core?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Debugging-Informationen senden" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Sendet Diagnoseinformationen über das Gerät und die RetroArch-Konfiguration zur Analyse an unsere Server." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Datenbanken" @@ -12813,30 +12772,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Drücke fünf Mal rechts, um alle Cheats zu löschen." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Speichern der Debugging-Informationen fehlgeschlagen." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Senden der Debugging-Informationen an den Server fehlgeschlagen." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Debugging-Informationen werden gesendet..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Debugging-Informationen erfolgreich an den Server gesendet. Deine ID-Nummer ist %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Drücke noch zweimal, um Diagnoseinformationen an das RetroArch-Team zu senden." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Drücke noch einmal, um Diagnoseinformationen an das RetroArch-Team zu senden." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Globale Lautstärke des Audio-Mixers" diff --git a/intl/msg_hash_el.h b/intl/msg_hash_el.h index ee3051bff8..12326a5df4 100644 --- a/intl/msg_hash_el.h +++ b/intl/msg_hash_el.h @@ -2396,16 +2396,6 @@ MSG_HASH( "Υπηρεσία Τεχνητής Νοημοσύνης" ) - -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Αποστολή Πληροφοριων Εκσφαλματωσης (Debuging)" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Στέλνει διαγνωστικές πληροφορίες σχετικά με τη συσκευή σας και τις ρυθμίσεις του RetroArch στους διακομιστές μας για ανάλυση." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -4992,10 +4982,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Αυτόματη Αναλογία Οθόνης" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_STATUS, "Κατάσταση" @@ -5004,10 +4990,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "System BGM Enable" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Προτιμώμενη Αναλογία" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Ενεργοποίηση Εγγραφής" @@ -5020,10 +5002,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, "Αποθήκευση Εγγραφών στο Ευρετήριο Εξαγωγής" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Εξαναγκασμένη αναλογία απεικόνισης" - ) MSG_HASH( /* FIXME Still exists in a comment about being removed */ MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY, "Αδιαφάνεια Υποσέλιδου" @@ -5064,14 +5042,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT, "Φόρτωση Περιεχομένου" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Αποστολή Πληροφοριων Εκσφαλματωσης (Debuging)" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Στέλνει διαγνωστικές πληροφορίες σχετικά με τη συσκευή σας και τις ρυθμίσεις του RetroArch στους διακομιστές μας για ανάλυση." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Ρυθμίσεις Βάσης Δεδομένων" diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index d7f067a42c..77ea9db2de 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -4117,15 +4117,6 @@ MSG_HASH( "Oculta los mensajes de chat del juego en red con o sin una animación de fundido." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Enviar datos de depuración" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Envía información de diagnóstico sobre tu dispositivo y tu configuración de RetroArch a nuestros servidores para su posterior análisis." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6409,14 +6400,6 @@ MSG_HASH( "Muestra el historial de elementos recientes (es necesario reiniciar en Ozone/XMB)." ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Mostrar Importar contenido" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Muestra el menú Importar contenido (es necesario reiniciar en Ozone/XMB)." - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostrar Importar contenido" ) @@ -12740,10 +12723,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Relación de aspecto automática" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Apodo (LAN): %s" @@ -12756,10 +12735,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Música del sistema" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Relación personalizada" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Soporte para grabación" @@ -12780,14 +12755,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Selecciona la coincidencia que quieres ver." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Forzar relación de aspecto" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Seleccionar de una lista de reproducción" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Ver lista de %u coincidencias" @@ -12864,14 +12831,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "¿Qué es un núcleo?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Enviar información de depuración" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Envía información de diagnóstico sobre tu dispositivo y tu configuración de RetroArch a nuestros servidores para su posterior análisis." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Ajustes de bases de datos" @@ -13153,30 +13112,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Pulsa derecha cinco veces para eliminar todos los trucos." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Error al guardar la información de depuración." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Error al enviar la información de depuración al servidor." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Enviando información de depuración..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Información enviada al servidor. Tu identificador es %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Pulsa el botón otras dos veces más para enviar la información de diagnóstico al equipo de RetroArch." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Vuelve a pulsar el botón una última vez para enviar la información de diagnóstico al equipo de RetroArch." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Volumen del mezclador de audio global" diff --git a/intl/msg_hash_fi.h b/intl/msg_hash_fi.h index 33031c8fef..3f0a40862c 100644 --- a/intl/msg_hash_fi.h +++ b/intl/msg_hash_fi.h @@ -3565,15 +3565,6 @@ MSG_HASH( "Vaihda häivytettävän ja staattisten verkkochat-viestien välillä." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Lähetä vianjäljitystietoa" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Lähettää laitteestasi ja RetroArch-kokoonpanostasi diagnostiikkatietoja palvelimillemme analysoitavaksi." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -5425,10 +5416,6 @@ MSG_HASH( "Näytä \"Historia\"" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Näytä \"Tuo sisältöä\"" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Näytä \"Tuo sisältöä\"" ) @@ -11396,10 +11383,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Automaattinen kuvasuhde" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Nimimerkki (LAN): %s" @@ -11412,10 +11395,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Järjestelmän taustamusiikki" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Mukautettu suhde" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Nauhoitustuki" @@ -11436,14 +11415,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Valitse tarkasteltava vastaavuus." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Pakota kuvasuhde" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Valitse soittolistalta" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Näytä luettelo %u vastaavuuksista" @@ -11520,10 +11491,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Mikä on ydin?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Lähetä vianjäljitystiedot" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Tietokannan asetukset" @@ -11801,30 +11768,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Poista kaikki huijaukset painamalla oikealle viisi kertaa." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Vianjäljitystietojen tallennus epäonnistui." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Vianjäljitystietojen lähettäminen palvelimeen epäonnistui." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Lähetetään vianjäljitystietoa..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Vianjäljitystiedot lähettiin palvelimelle onnistuneesti. ID-numerosi on %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Paina vielä kaksi kertaa lähettääksesi diagnostiikkatiedot RetroArchin tiimille." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Paina vielä kerran lähettääksesi diagnostiikkatiedot RetroArchin tiimille." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Globaalin mikserin äänenvoimakkuus" diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 943492fcf6..fbdcdbaa31 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -4077,15 +4077,6 @@ MSG_HASH( "Basculer entre les messages en fondu et statiques pour le jeu en réseau." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Envoyer les informations de diagnostic" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Envoie les informations de diagnostic pour votre appareil et la configuration de RetroArch à nos serveurs pour analyse." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6369,14 +6360,6 @@ MSG_HASH( "Afficher le menu de l'historique récent. (Redémarrage requis sur Ozone/XMB)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Afficher 'Importer du contenu'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Afficher le menu 'Importer du contenu'. (Redémarrage requis sur Ozone/XMB)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Afficher 'Importer du contenu'" ) @@ -12704,10 +12687,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Rapport d'aspect automatique" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Pseudo (LAN) : %s" @@ -12720,10 +12699,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Musique de fond système" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Rapport d'aspect personnalisé" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Prise en charge de l'enregistrement" @@ -12744,14 +12719,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Sélectionner la correspondance à afficher." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Forcer le rapport d'aspect" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Sélectionner depuis une liste de lecture" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Voir la liste des %u correspondances" @@ -12828,14 +12795,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Qu'est-ce qu'un cœur ?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Envoyer des informations de diagnostic" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Envoyer les informations de diagnostic pour votre appareil et la configuration de RetroArch à nos serveurs pour analyse." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Réglages de la base de données" @@ -13113,30 +13072,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Appuyez cinq fois sur Droite pour supprimer tous les cheats." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Échec d'enregistrement des informations de diagnostic." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Échec d'envoi des informations de diagnostic au serveur." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Envoi des informations de diagnostic..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Les informations de diagnostic ont été envoyées au serveur avec succès. Votre numéro d'identification est %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Appuyez deux fois de plus pour soumettre les informations de diagnostic à l'équipe de RetroArch." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Appuyez une fois de plus pour soumettre les informations de diagnostic à l'équipe de RetroArch." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Volume du mixeur audio global" diff --git a/intl/msg_hash_gl.h b/intl/msg_hash_gl.h index d8712a8939..805a00e566 100644 --- a/intl/msg_hash_gl.h +++ b/intl/msg_hash_gl.h @@ -4049,15 +4049,6 @@ MSG_HASH( "Alterna entre mensaxes de chat de netplay esvaecidas e estáticas." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Enviar información de depuración" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Envía información de diagnóstico sobre o teu dispositivo e a configuración de RetroArch aos nosos servidores para a súa análise." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6277,14 +6268,6 @@ MSG_HASH( "Mostra o menú do historial recente. (Requírese reiniciar en Ozone/XMB)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Mostrar \"Importar contido\"" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Mostra o menú \"Importar contido\". (Requírese reiniciar en Ozone/XMB)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostrar \"Importar contido\"" ) @@ -12548,10 +12531,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Relación de aspecto automática" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Alcume (LAN): %s" @@ -12564,10 +12543,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Sistema BGM" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Relación personalizada" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Compatibilidade con gravación" @@ -12588,14 +12563,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Seleccione a coincidencia para ver." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Relación de aspecto de forza" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Selecciona dunha lista de reprodución" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Ver a lista de %u coincidencias" @@ -12672,14 +12639,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Que é un núcleo?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Enviar información de depuración" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Envía información de diagnóstico sobre o teu dispositivo e a configuración de RetroArch aos nosos servidores para a súa análise." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Configuración de base de datos" @@ -12961,30 +12920,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Preme á dereita cinco veces para eliminar todos os trucos." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Produciuse un erro ao gardar a información de depuración." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Produciuse un erro ao enviar a información de depuración ao servidor." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Enviando información de depuración..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Enviouse a información de depuración ao servidor correctamente. O teu número de identificación é %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Preme dúas veces máis para enviar información de diagnóstico ao equipo de RetroArch." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Preme unha vez máis para enviar información de diagnóstico ao equipo de RetroArch." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Volume global do mesturador de audio" diff --git a/intl/msg_hash_he.h b/intl/msg_hash_he.h index 271d246771..dbec0429d1 100644 --- a/intl/msg_hash_he.h +++ b/intl/msg_hash_he.h @@ -1405,11 +1405,6 @@ MSG_HASH( ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "שלח נתוני ניפוי תקלות" - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -1820,10 +1815,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP, "עזרה" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "שלח נתוני ניפוי תקלות" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_DESCRIPTION, "תיאור" diff --git a/intl/msg_hash_hu.h b/intl/msg_hash_hu.h index 881b9bc1b3..6cfa772a37 100644 --- a/intl/msg_hash_hu.h +++ b/intl/msg_hash_hu.h @@ -4109,15 +4109,6 @@ MSG_HASH( "Váltás az elhalványuló és a statikus Netplay csevegő üzenetek közt." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Hibakeresési információk küldése" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Diagnosztikai információk küldése az eszközről és a RetroArch beállításairól a kiszolgálóinknak, elemzés céljából." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6381,14 +6372,6 @@ MSG_HASH( "Az \"Előzmények\" menü jelenjen meg. (Ozone / XMB esetén újraindítás szükséges.)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "\"Tartalom importálása\" látható" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "A \"Tartalom importálása\" menü jelenjen meg. (Ozone / XMB esetén újraindítás szükséges.)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "\"Tartalom importálása\" látható" ) @@ -12472,10 +12455,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Automatikus képarány" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Becenév (LAN): %s" @@ -12488,10 +12467,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Rendszer háttérhang" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Egyedi arány" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Felvétel támogatása" @@ -12512,14 +12487,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "A kiválasztott találat megtekintése." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Fix képarány" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Kiválasztás játéklistáról" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "A %u találatból álló lista megtekintése" @@ -12596,14 +12563,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Mi az a mag?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Hibakeresési információk küldése" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Diagnosztikai információk küldése az eszközről és a RetroArch beállításairól a kiszolgálóinknak, elemzés céljából." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Adatbázis beállításai" @@ -12885,30 +12844,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Nyomja meg a jobbra gombot ötször minden csalás törléséhez." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Hibakeresési információk mentése sikertelen." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Hibakeresési információk küldése a kiszolgálónak sikertelen." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Hibakeresési információk küldése..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Hibakeresési információk sikeresen beküldve a kiszolgálónak. Az azonosítószám %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Nyomd meg még kétszer, hogy elküldd a diagnosztikai információt a RetroArch csapatnak." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Nyomd meg még egyszer, hogy elküldd a diagnosztikai információt a RetroArch csapatnak." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Globális hangkeverő hangereje" diff --git a/intl/msg_hash_id.h b/intl/msg_hash_id.h index 16e0c97e95..37c8b29369 100644 --- a/intl/msg_hash_id.h +++ b/intl/msg_hash_id.h @@ -2625,11 +2625,6 @@ MSG_HASH( "Main Netplay/Mode Menonton (Mati/Nyala)" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Kirim Info Awakutu" - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -4048,10 +4043,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP, "Bantuan" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Kirim Info Awakutu" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_LAN_SCAN_SETTINGS, "Pindai jejaring setempat" @@ -4113,22 +4104,6 @@ MSG_HASH( /* Notifications */ -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Gagal menyimpan info awakutu." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Gagal mengirim info awakutu ke server." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Mengirim info awakutu..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Info awakutu berhasil dikirim. Nomor ID Anda %u." - ) MSG_HASH( MSG_NATIVE, "Lokal" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 9da626b605..abd351b30f 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -4033,15 +4033,6 @@ MSG_HASH( "Commuta tra dissolvenza e messaggi statici di chat di netplay." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Invia informazioni di debug" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Invia ai nostri server informazioni diagnostiche relative al tuo dispositivo e alla configurazione di RetroArch per un'analisi." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6309,14 +6300,6 @@ MSG_HASH( "Mostra il menu cronologia recente. (Riavvio richiesto su Ozone/XMB)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Mostra 'Importa Contenuto'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Mostra il menu 'Importa contenuti'. (Riavvio richiesto su Ozone/XMB)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostra 'Importa Contenuto'" ) @@ -12520,10 +12503,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Rapporto d'aspetto Automatico" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Nome Utente (LAN): %s" @@ -12536,10 +12515,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Abilita Sistema BGM" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Rapporto Personalizzato" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Abilita Registrazione" @@ -12560,14 +12535,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Seleziona la corrispondenza da visualizzare." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Forza Rapporto d'aspetto" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Seleziona da Playlist" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Visualizza la lista delle %u partite" @@ -12644,14 +12611,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Cos'è un Core?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Invia Informazioni Di Debug" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Invia informazioni diagnostiche sul tuo dispositivo e la configurazione di RetroArch ai nostri server per l'analisi." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Impostazioni del Database" @@ -12933,30 +12892,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Premi a destra cinque volte per eliminare tutti i trucchi." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Impossibile salvare le informazioni di debug." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Impossibile inviare informazioni di debug al server." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Invio informazioni di debug..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Informazioni di debug inviate al server con successo. Il tuo numero ID è %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Premi altre due volte per inviare informazioni diagnostiche al team di RetroArch." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Premi ancora una volta per inviare informazioni diagnostiche al team di RetroArch." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Volume globale del mixer audio" diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index af333b5698..cf7069f672 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -3889,15 +3889,6 @@ MSG_HASH( "ネットプレイチャットメッセージのフェードと固定を切り替えます。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "デバッグ情報の送信" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "お使いのデバイスと RetroArch の設定に関する診断情報を、分析のためにサーバーに送信します。" - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6105,14 +6096,6 @@ MSG_HASH( "[履歴] メニューを表示します。 (Ozone/XMB で再起動が必要)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "[コンテンツをインポート] を表示" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "[コンテンツをインポート] メニューを表示します。 (Ozone/XMB で再起動が必要)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "[コンテンツをインポート] を表示" ) @@ -12308,10 +12291,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "自動アスペクト比" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "ニックネーム (LAN): %s" @@ -12324,10 +12303,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "システム BGM" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "カスタム比" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "録画対応" @@ -12348,14 +12323,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "表示する一致を選択します。" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "強制アスペクト比" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "プレイリストから選択" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "%u 一致リストを表示" @@ -12432,14 +12399,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "コアとは?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "デバッグ情報の送信" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "お使いのデバイスと RetroArch の設定に関する診断情報を、分析のためにサーバーに送信します。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "データベース設定" @@ -12721,30 +12680,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "すべてのチートを削除するには右を 5 回押してください。" ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "デバッグ情報の保存に失敗しました。" - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "デバッグ情報をサーバーに送信できませんでした。" - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "デバッグ情報を送信中..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "デバッグ情報をサーバーに正常に送信しました。ID 番号は %u です。" - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "もう 2 回押すと、診断情報を RetroArch チームに送信します." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "もう一度押すと、診断情報を RetroArch チームに送信します。" - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "グローバルミキサーオーディオ音量" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 567b28d501..899e096b31 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -4149,15 +4149,6 @@ MSG_HASH( "채팅 메시지를 서서히 사라지게 할 것인지 정적으로 표시할 것인지 선택합니다." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "디버그 정보 보내기" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "분석을 위해 장치 및 RetroArch 구성에 대한 진단 정보를 서버로 보냅니다." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6445,14 +6436,6 @@ MSG_HASH( "최근 실행 메뉴를 표시합니다. (Ozone/XMB 사용시 재시작 필요)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "'콘텐츠 가져오기' 표시" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "'콘텐츠 가져오기' 메뉴를 표시합니다. (Ozone/XMB 사용시 재시작 필요)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "'콘텐츠 가져오기' 표시" ) @@ -12828,10 +12811,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "자동 화면비" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "사용자 (랜): %s" @@ -12844,10 +12823,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "시스템 BGM 사용" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "사용자 비율" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "녹화 사용" @@ -12868,14 +12843,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "확인할 일치 항목을 선택하십시오." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "강제 화면비율" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "실행목록에서 선택" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "%u 일치 목록 확인" @@ -12952,14 +12919,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "코어란 무엇인가?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "디버그 정보 전송" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "분석을 위해 장치 및 RetroArch 구성에 대한 진단 정보를 서버로 보냅니다." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "데이터베이스 설정" @@ -13241,30 +13200,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "모든 치트를 삭제하려면 오른쪽을 다섯 번 입력하십시오." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "디버그 정보 저장 실패." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "디버그 정보를 서버에 전송하는데 실패했습니다." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "디버그 정보 전송 중..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "디버그 정보를 성공적으로 서버에 보냈습니다. ID 번호는 %u 입니다." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "분석 정보를 RetroArch 팀에게 보내려면 두 번 더 눌러주십시오." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "분석 정보를 RetroArch 팀에게 보내려면 한 번 더 눌러주십시오." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "전역 오디오 믹서 볼륨" diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 6fa47a6a88..a9da32453f 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -933,10 +933,6 @@ MSG_HASH( MENU_ENUM_LABEL_CUSTOM_BIND_ALL, "custom_bind_all" ) -MSG_HASH( - MENU_ENUM_LABEL_CUSTOM_RATIO, - "custom_ratio" - ) MSG_HASH( MENU_ENUM_LABEL_DATABASE_MANAGER, "database_manager" @@ -4162,10 +4158,6 @@ MSG_HASH( MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO, "video_aspect_ratio" ) -MSG_HASH( - MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_AUTO, - "video_aspect_ratio_auto" - ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, "aspect_ratio_index" @@ -4414,10 +4406,6 @@ MSG_HASH( MENU_ENUM_LABEL_VIDEO_FONT_SIZE, "video_font_size" ) -MSG_HASH( - MENU_ENUM_LABEL_VIDEO_FORCE_ASPECT, - "video_force_aspect" - ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_FORCE_SRGB_DISABLE, "video_force_srgb_disable" @@ -4832,10 +4820,6 @@ MSG_HASH( MENU_ENUM_LABEL_CONTENT_SHOW_HISTORY, "content_show_history" ) -MSG_HASH( - MENU_ENUM_LABEL_CONTENT_SHOW_ADD, - "content_show_add" - ) MSG_HASH( MENU_ENUM_LABEL_CONTENT_SHOW_ADD_ENTRY, "content_show_add_entry" @@ -6212,10 +6196,6 @@ MSG_HASH( MENU_ENUM_LABEL_PLAYLIST_ALLOW_NON_PNG, "playlist_allow_non_png" ) -MSG_HASH( - MENU_ENUM_LABEL_HELP_SEND_DEBUG_INFO, - "help_send_debug_info" - ) MSG_HASH( MENU_ENUM_LABEL_VIBRATE_ON_KEYPRESS, "vibrate_on_keypress" @@ -6629,8 +6609,8 @@ MSG_HASH( "input_turbo_duty_cycle" ) MSG_HASH( - MENU_ENUM_LABEL_INPUT_ALLOW_TURBO_DPAD, - "input_allow_turbo_dpad" + MENU_ENUM_LABEL_INPUT_TURBO_ALLOW_DPAD, + "input_turbo_allow_dpad" ) MSG_HASH( MENU_ENUM_LABEL_MENU_VIEWS_SETTINGS, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 18afad2d66..e1fadb34fd 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -3225,15 +3225,6 @@ MSG_HASH( "Schakelen tussen vervagende en statische net-play-chatberichten." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Stuur Foutopsporings-info (Debug Info)" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Stuurt diagnostische informatie over uw apparaat en RetroArch-configuratie naar onze servers voor analyse." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -4777,10 +4768,6 @@ MSG_HASH( "Toon 'Geschiedenis'" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Toon 'Inhoud importeren'" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Toon 'Inhoud importeren'" ) @@ -6052,18 +6039,10 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Automatische Beeldverhouding" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Systeem BGM Activeren" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Handmatige Beeldverhouding" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Opname Activeren" @@ -6076,10 +6055,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, "Gebruik Uitvoer Map" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Forceer beeldverhouding" - ) MSG_HASH( /* FIXME Still exists in a comment about being removed */ MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY, "Voettekst Zichtbaarheid" @@ -6108,14 +6083,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT, "Hoe Laad je Content?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Stuur Foutopsporings-info (Debug Info)" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Stuurt diagnostische informatie over uw apparaat en RetroArch-configuratie naar onze servers voor analyse." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Database Instellingen" diff --git a/intl/msg_hash_no.h b/intl/msg_hash_no.h index ed66a1c5fa..73be0725c3 100644 --- a/intl/msg_hash_no.h +++ b/intl/msg_hash_no.h @@ -2785,10 +2785,6 @@ MSG_HASH( "Vis 'Historie'" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Vis 'Importert innhold'" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Vis 'Importert innhold'" ) @@ -4764,14 +4760,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Tving størrelsesforhold" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Velg fra en spilleliste" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE, "Nettspill" diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index c2954ae54c..5f9e8780cd 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -3617,15 +3617,6 @@ MSG_HASH( "Przełącz pomiędzy zanikającymi i statycznymi wiadomościami czatu sieciowego." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Wyślij informacje debugowania" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Wysyła informacje diagnostyczne o Twoim urządzeniu i konfiguracji RetroArch do naszych serwerów w celu analizy." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -5529,14 +5520,6 @@ MSG_HASH( "Pokaż 'Historia'" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Pokaż 'Importuj zawartość'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Pokaż menu 'Importuj zawartość'. (Wymagany restart na Ozone/XMB)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Pokaż 'Importuj zawartość'" ) @@ -11168,10 +11151,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Auto. Współczynnik proporcji" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Pseudonim (LAN): %s" @@ -11180,10 +11159,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Włącz System BGM" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Niestandardowy współczynnik" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Włącz nagrywanie" @@ -11204,14 +11179,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Wybierz dopasowanie do wyświetlenia." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Wymuś współczynnik proporcji" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Wybierz z playlisty" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Zobacz listę %u dopasowań" @@ -11288,14 +11255,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Co to jest rdzeń?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Wyślij informacje o debugowaniu" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Wysyła informacje diagnostyczne o twoim urządzeniu i konfiguracji RetroArch na nasze serwery w celu analizy." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Ustawienia bazy danych" @@ -11569,30 +11528,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Naciśnij pięć razy w prawo, aby usunąć wszystkie cheat-y." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Nie udało się zapisać informacji debugowania." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Nie udało się wysłać informacji o debugowaniu na serwer." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Wysyłanie informacji o debugowaniu..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Wysłano informacje o debugowaniu na serwer. Twój numer identyfikacyjny to %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Naciśnij jeszcze dwa razy, aby przesłać informacje diagnostyczne do zespołu RetroArch." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Naciśnij jeszcze raz, aby przesłać informacje diagnostyczne do zespołu RetroArch." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Globalna objętość miksera audio" diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 9891c1462c..3c42465672 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -3733,15 +3733,6 @@ MSG_HASH( "Ativa ou desativa o desvanecimento das mensagens do bate-papo da Netplay." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Enviar informações de depuração" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Envia informações de diagnóstico sobre o seu dispositivo e a configuração do RetroArch aos nossos servidores para análise." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -5565,10 +5556,6 @@ MSG_HASH( "Mostrar \"Histórico\"" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Mostrar \"Importar conteúdo\"" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostrar \"Importar conteúdo\"" ) @@ -11296,10 +11283,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Proporção de tela automática" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Apelido (REDE): %s" @@ -11312,10 +11295,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Habilitar música em segundo plano do sistema" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Proporção personalizada" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Habilitar gravação" @@ -11336,14 +11315,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Selecionar a coincidência para visualizar." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Forçar proporção de tela" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Selecionar de uma lista de reprodução" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Ver lista de %u coincidências" @@ -11416,14 +11387,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "O que é um núcleo?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Enviar informação de depuração" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Envia informações de diagnóstico sobre o seu dispositivo e a configuração do RetroArch aos nossos servidores para análise." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Configurações do banco de dados" @@ -11697,30 +11660,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Pressione direita cinco vezes para excluir todas as trapaças." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Falha ao salvar informações de depuração." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Falha ao enviar informações de depuração para o servidor." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Enviando informações de depuração..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Enviado informações de depuração para o servidor com sucesso. Seu ID é o número %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Pressione mais duas vezes para enviar informações de diagnóstico para a equipe do RetroArch." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Pressione mais uma vez para enviar informações de diagnóstico para a equipe do RetroArch." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Volume global do mixer de áudio" diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index d6bb9ff58a..b8fdd43160 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -4776,10 +4776,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Proporção automática do ecrã" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_STATUS, "Estado" @@ -4788,10 +4784,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Ativar sistema BGM" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Rácio personalizado" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Permitir gravação de vídeo" @@ -4804,14 +4796,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, "Guardar gravações de vídeo na pasta de saída" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Forçar proporção de imagem no ecrã" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Selecionar da Lista de Reprodução" - ) MSG_HASH( /* FIXME Still exists in a comment about being removed */ MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY, "Opacidade do rodapé" diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 924b1c0911..fa5bd98a9a 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -4137,15 +4137,6 @@ MSG_HASH( "Переключение между затухающими и статичными сообщениями чата." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Отправка сведений для отладки" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Отправить отладочную информацию об устройстве и конфигурации RetroArch на наши серверы для анализа." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6441,14 +6432,6 @@ MSG_HASH( "Показывать меню 'История запуска' (требуется перезапуск для Ozone/XMB)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Показывать 'Импорт контента'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Показывать меню 'Импорт контента' (требуется перезапуск для Ozone/XMB)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Показывать 'Импорт контента'" ) @@ -12776,10 +12759,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Автосоотношение сторон" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Никнейм (LAN): %s" @@ -12792,10 +12771,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Фоновый звук системы" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Ручная установка" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Поддержка записи" @@ -12816,14 +12791,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Выбор совпадения для просмотра." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Форсировать пропорции" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Выбрать из плейлиста" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Просмотр списка %u совпадений" @@ -12896,14 +12863,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Что такое ядро?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Отправить сведения для отладки" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Отправляет информацию об устройстве и конфигурации RetroArch на наши серверы для анализа." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Настройки баз данных" @@ -13185,30 +13144,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Нажмите вправо пять раз для удаления всех чит-кодов." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Не удалось сохранить сведения для отладки." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Не удалось отправить на сервер сведения для отладки." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Отправка отладочной информации..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Сведения для отладки успешно отправлены на сервер. Ваш ID-номер: %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Нажмите ещё два раза для отправки сведений команде RetroArch." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Нажмите ещё раз для отправки сведений команде RetroArch." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Общий уровень громкости звукового микшера" diff --git a/intl/msg_hash_sk.h b/intl/msg_hash_sk.h index eba8422df0..ef2891ca9d 100644 --- a/intl/msg_hash_sk.h +++ b/intl/msg_hash_sk.h @@ -2632,16 +2632,6 @@ MSG_HASH( "Služba AI" ) - -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Odoslať ladiace informácie" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Odoslať diagnostické informácie o zariadení a nastaveniach RetroArch na naše serveri na analýzu." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -3341,10 +3331,6 @@ MSG_HASH( "Zobraziť 'História'" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Zobraziť 'Importovať obsah'" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Zobraziť 'Importovať obsah'" ) @@ -6140,14 +6126,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_STATUS, "Stav" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Vlastný pomer" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Vynútiť pomer strán" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_DELETE_OPTION, "Vymazať túto zhodu" @@ -6176,14 +6154,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Čo je jadro?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Odoslať ladiace informácie" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Odoslať diagnostické informácie o zariadení a nastaveniach RetroArch na naše serveri na analýzu." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Nastavenia databázy" diff --git a/intl/msg_hash_sv.h b/intl/msg_hash_sv.h index 23f698d8ca..9eceef4b04 100644 --- a/intl/msg_hash_sv.h +++ b/intl/msg_hash_sv.h @@ -3817,15 +3817,6 @@ MSG_HASH( "Växlar mellan tonande eller statiska Netplay chattmeddelanden." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Skicka Felsökningsinfo" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Skickar diagnostisk information om din enhet och RetroArch konfiguration till våra servrar för analys." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -5833,14 +5824,6 @@ MSG_HASH( "Visa 'Historik'" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Visa 'Importera Innehåll'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Visa menyn ”Importera innehåll”. (Omstart krävs på Ozone/XMB)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Visa 'Importera Innehåll'" ) @@ -11332,18 +11315,10 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Auto Bildformat" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Nicknamn (LAN): %s" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Anpassad frekvens" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Inspelning-stöd" @@ -11360,14 +11335,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_MATCH_IDX, "Visa träff #" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Tvinga bildformat" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Välj från en spellista" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Visa listan över %u träffar" @@ -11432,14 +11399,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Vad är en kärna?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Skicka Felsökningsinfo" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Skickar diagnostisk information om din enhet och RetroArch konfiguration till våra servrar för analys." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Databasinställningar" @@ -11689,30 +11648,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Tryck höger 5 gånger för att radera alla fusk." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Spara felsökningsinformation misslyckad." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Skicka felsökningsinformation misslyckad." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Skickar felsökningsinformation..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Skicka felsökningsinformation lyckad. Ditt ID-nummer är %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Tryck två gånger till för att skicka diagnostikinformation till RetroArch-teamet." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Tryck en gång till för att skicka diagnostikinformation till RetroArch-teamet." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Global ljudmixervolym" diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 420c1d8744..884d5635c2 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -4117,15 +4117,6 @@ MSG_HASH( "Oda ve statik netplay sohbet mesajları arasında geçiş yapın." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Hata Ayıklama Bilgisi Gönder" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Cihazınız ve RetroArch yapılandırması hakkındaki teşhis bilgilerini analiz için sunucularımıza gönderir." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6413,14 +6404,6 @@ MSG_HASH( "Geçmiş menüsünü gösterin. (Ozon/XMB'de Yeniden Başlatılmalı)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "'İçeriği İçe Aktar' Göster" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "'İçeriği İçe Aktar' menüsünü gösterin. (Ozon/XMB'de Yeniden Başlatılmalı)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "'İçeriği İçe Aktar' Göster" ) @@ -12824,10 +12807,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Otomatik En Boy Oranı" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Rumuz (LAN): %s" @@ -12840,10 +12819,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Sistem BGM" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Özel Oran" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Kayıt Desteği" @@ -12864,14 +12839,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Görüntülenecek eşleşmeyi seçin." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "En Boy Oranını Zorla" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Bir oynatma listesinden seç" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "%u Eşleşmelerinin Listesini Görüntüle" @@ -12944,14 +12911,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Çekirdek Nedir?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Hata Ayıklama Bilgisi Gönder" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Cihazınız ve RetroArch yapılandırması hakkındaki teşhis bilgilerini analiz için sunucularımıza gönderir." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Veritabanı Ayarları" @@ -13233,30 +13192,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Tüm hileleri silmek için beş kez sağa basın." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Hata ayıklama bilgisi kaydedilemedi." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Hata ayıklama bilgisi sunucuya gönderilemedi." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Hata ayıklama bilgisi gönderiliyor..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Hata ayıklama bilgisi sunucuya başarıyla gönderildi. Kimlik numaranız %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "RetroArch ekibine tanılama bilgileri göndermek için iki kez daha basın." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "RetroArch ekibine tanılama bilgileri göndermek için bir kez daha basın." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Global ses karıştırıcı sesi" diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index e0009bdfbc..27894d902b 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -4129,15 +4129,6 @@ MSG_HASH( "Перемикання між згасаючими та статичними повідомленнями чату netplay." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Відправити зневаджувальну інформацію" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Надсилає діагностичну інформацію про ваш пристрій і конфігурацію RetroArch на наші сервери для аналізу." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6381,14 +6372,6 @@ MSG_HASH( "Показати останнє меню історії. (Для перезапуску, потрібен Ozone/XMB)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Показати 'Зміст імпорту'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Показати меню 'Зміст імпорту'. (Перезапустити необхідні в Ozone/XMB)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Показати 'Зміст імпорту'" ) @@ -12820,10 +12803,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Авто співвідношення сторін" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Псевдонім (LAN): %s" @@ -12836,10 +12815,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Фонова музика системи" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Користувацьке співвідношення" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Підтримка запису" @@ -12860,14 +12835,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Виберіть матч для перегляду." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Примусове співвідношення сторін" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Вибір зі списку відтворення" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "Переглянути список матчів %u" @@ -12944,14 +12911,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "Що таке ядро?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Відправити зневаджувальну інформацію" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Відправляє діагностичну інформацію про ваш пристрій та конфігурацію RetroArch для аналізу наших серверів." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Налаштування бази даних" @@ -13233,30 +13192,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Натисніть праворуч п'ять разів, щоб видалити всі чіти." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Не вдалося зберегти інформацію для налагодження." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Не вдалося надіслати дані для налагодження на сервер." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Надсилання зневаджувальної інформації..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Інформація про налагодження успішно надіслана на сервер. Ваш ідентифікаційний номер %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Натисніть ще два рази для передачі діагностичної інформації в команду RetroArch." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Натисніть ще раз для передачі діагностичної інформації в команду RetroArch." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Загальна гучність мікшера звуку" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 1262269a5a..95a7489ad8 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -4181,15 +4181,6 @@ MSG_HASH( "Toggle between fading and static netplay chat messages." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, - "Send Debug Info" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, - "Sends diagnostic info about your device and RetroArch configuration to our servers for analysis." - ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -6505,20 +6496,12 @@ MSG_HASH( "Show the recent history menu. (Restart required on Ozone/XMB)" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Show 'Import Content'" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Show the 'Import Content' menu. (Restart required on Ozone/XMB)" - ) -MSG_HASH( /* FIXME can now be replaced with MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD */ MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Show 'Import Content'" ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Show an 'Import Content' entry inside the main menu or playlists submenu." + "Show the 'Import Content' entry inside the main menu or playlists submenu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, @@ -13508,10 +13491,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Auto Aspect Ratio" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, "Nickname (LAN): %s" @@ -13524,10 +13503,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "System BGM" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Custom Ratio" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Recording Support" @@ -13548,14 +13523,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, "Select the match to view." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Force Aspect Ratio" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Select from a playlist" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, "View the List of %u Matches" @@ -13644,14 +13611,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, "What Is a Core?" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, - "Send Debug Info" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, - "Sends diagnostic info about your device and RetroArch configuration to our servers for analysis." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANAGEMENT, "Database Settings" @@ -13933,30 +13892,6 @@ MSG_HASH( MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, "Press right five times to delete all cheats." ) -MSG_HASH( - MSG_FAILED_TO_SAVE_DEBUG_INFO, - "Failed to save debug info." - ) -MSG_HASH( - MSG_FAILED_TO_SEND_DEBUG_INFO, - "Failed to send debug info to server." - ) -MSG_HASH( - MSG_SENDING_DEBUG_INFO, - "Sending debug info..." - ) -MSG_HASH( - MSG_SENT_DEBUG_INFO, - "Sent debug info to server successfully. Your ID number is %u." - ) -MSG_HASH( - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - "Press two more times to submit diagnostic info to the RetroArch team." - ) -MSG_HASH( - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - "Press one more time to submit diagnostic info to the RetroArch team." - ) MSG_HASH( MSG_AUDIO_MIXER_VOLUME, "Global audio mixer volume" diff --git a/intl/msg_hash_val.h b/intl/msg_hash_val.h index 8aa487d045..9ba4482ea7 100644 --- a/intl/msg_hash_val.h +++ b/intl/msg_hash_val.h @@ -3148,14 +3148,6 @@ MSG_HASH( /* Unused (Only Exist in Translation Files) */ -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Relació d'aspecte automàtic" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Forçar la relació d'aspecte" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE, "Joc en línia" diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index a4ab0f5401..8cc3d4a64e 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -2400,10 +2400,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Enable Recording" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, - "Select from Playlst" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE, "Kích hoạt Netplay" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 395e2c6aa1..771b645cd2 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -1196,7 +1196,6 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_netplay_tab, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_settings_tab, MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_settings_tab_enable_password, MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_history_tab, MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY) -DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_import_content_tab, MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_import_content_entry, MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_playlists_tab, MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLISTS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_playlist_tabs, MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS) @@ -2835,9 +2834,6 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_rgui_show_start_screen); break; - case MENU_ENUM_LABEL_CONTENT_SHOW_ADD: - BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_import_content_tab); - break; case MENU_ENUM_LABEL_CONTENT_SHOW_ADD_ENTRY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_import_content_entry); break; diff --git a/msg_hash.h b/msg_hash.h index 3fe60f7422..95b4b85a7a 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -921,15 +921,7 @@ enum msg_hash_enums MENU_LABEL(INPUT_TURBO_PERIOD), MENU_LABEL(INPUT_TURBO_DUTY_CYCLE), MENU_ENUM_LABEL_VALUE_TURBO_DUTY_CYCLE_HALF, - MENU_LABEL(INPUT_TURBO_DEFAULT_BUTTON), /* Deprecated */ - MENU_LABEL(INPUT_ALLOW_TURBO_DPAD), /* Deprecated */ - MENU_LABEL(INPUT_DUTY_CYCLE), /* Deprecated */ -/* MENU_ENUM_LABEL_INPUT_PLAYER1_JOYPAD_INDEX, - MENU_ENUM_LABEL_INPUT_PLAYER2_JOYPAD_INDEX, - MENU_ENUM_LABEL_INPUT_PLAYER3_JOYPAD_INDEX, - MENU_ENUM_LABEL_INPUT_PLAYER4_JOYPAD_INDEX, - MENU_ENUM_LABEL_INPUT_PLAYER5_JOYPAD_INDEX,*/ MENU_ENUM_LABEL_INPUT_BIND_DEVICE_TYPE, MENU_ENUM_LABEL_INPUT_BIND_DEVICE_INDEX, @@ -1174,7 +1166,6 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, /* Hidden */ MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, - MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, /* Deprecated */ MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX, MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_TYPE, @@ -1275,7 +1266,6 @@ enum msg_hash_enums MENU_ENUM_SUBLABEL_INPUT_META_OVERLAY_NEXT, /* Hidden */ MENU_ENUM_SUBLABEL_INPUT_META_OSK, - MENU_ENUM_SUBLABEL_INPUT_META_SEND_DEBUG_INFO, /* Deprecated */ MENU_ENUM_LABEL_INPUT_DESCRIPTION, MENU_ENUM_LABEL_INPUT_DESCRIPTION_KBD, @@ -1605,7 +1595,6 @@ enum msg_hash_enums MENU_LABEL(CONTENT_SHOW_VIDEO), MENU_LABEL(CONTENT_SHOW_NETPLAY), MENU_LABEL(CONTENT_SHOW_HISTORY), - MENU_LABEL(CONTENT_SHOW_ADD), /* Deprecated */ MENU_LABEL(CONTENT_SHOW_ADD_ENTRY), MENU_LABEL(CONTENT_SHOW_PLAYLISTS), MENU_LABEL(CONTENT_SHOW_PLAYLIST_TABS), @@ -3176,7 +3165,6 @@ enum msg_hash_enums MENU_ENUM_LABEL_MESSAGE, MENU_ENUM_LABEL_INFO_SCREEN, - MENU_LABEL(CUSTOM_RATIO), MENU_LABEL(HELP), MENU_ENUM_LABEL_VALUE_CLEAR_SETTING, MENU_ENUM_LABEL_VALUE_SCAN_ENTRY, @@ -3408,8 +3396,6 @@ enum msg_hash_enums MENU_LABEL(VIDEO_VIEWPORT_BIAS_PORTRAIT_X), MENU_LABEL(VIDEO_VIEWPORT_BIAS_PORTRAIT_Y), #endif - MENU_LABEL(VIDEO_FORCE_ASPECT), - MENU_LABEL(VIDEO_ASPECT_RATIO_AUTO), MENU_LABEL(VIDEO_ASPECT_RATIO_INDEX), MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_CONFIG, MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_SQUARE_PIXEL, @@ -3819,7 +3805,6 @@ enum msg_hash_enums MENU_LABEL(NOTIFICATION_SHOW_WHEN_MENU_IS_ALIVE), MENU_LABEL(SELECT_FILE), - MENU_LABEL(SELECT_FROM_PLAYLIST), MENU_ENUM_LABEL_VALUE_FILTER, MENU_ENUM_LABEL_VALUE_SCALE, @@ -4211,16 +4196,6 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_TIME_UNIT_YEARS_PLURAL, MENU_ENUM_LABEL_VALUE_TIME_UNIT_AGO, - MENU_LABEL(HELP_SEND_DEBUG_INFO), - MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO_DESC, - - MSG_FAILED_TO_SAVE_DEBUG_INFO, - MSG_FAILED_TO_SEND_DEBUG_INFO, - MSG_SENDING_DEBUG_INFO, - MSG_SENT_DEBUG_INFO, - MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, - MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, - MENU_LABEL(VIBRATE_ON_KEYPRESS), MENU_LABEL(ENABLE_DEVICE_VIBRATION), MENU_LABEL(VIDEO_GPU_INDEX), diff --git a/retroarch.c b/retroarch.c index 65f455c8fd..7ad0991ecd 100644 --- a/retroarch.c +++ b/retroarch.c @@ -5494,10 +5494,6 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_NONE: return false; - /* Deprecated */ - case CMD_EVENT_SEND_DEBUG_INFO: - break; - /* Do nothing about the special negative value */ case CMD_SPECIAL: break; From e5d86c0ffbf97af738f7912f535942dc44e56bcd Mon Sep 17 00:00:00 2001 From: sonninnos Date: Sun, 25 May 2025 15:54:48 +0300 Subject: [PATCH 118/175] One more missing deprecation cleanup --- command.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/command.h b/command.h index 6f614fabd7..154b35b083 100644 --- a/command.h +++ b/command.h @@ -273,8 +273,6 @@ enum event_command /* Reinitializes microphone driver. */ CMD_EVENT_MICROPHONE_REINIT, #endif - /* Deprecated */ - CMD_EVENT_SEND_DEBUG_INFO, /* Add a playlist entry to another playlist. */ CMD_EVENT_ADD_TO_PLAYLIST }; From 990cc9b0b216071615dde4bfdfc9c1d9c79f4051 Mon Sep 17 00:00:00 2001 From: LibretroAdmin <105389611+LibretroAdmin@users.noreply.github.com> Date: Sun, 25 May 2025 15:31:46 +0200 Subject: [PATCH 119/175] Update audio_driver.c - small cleanup for code readability Makes it apparent that these variables are rewind-specific --- audio/audio_driver.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/audio/audio_driver.c b/audio/audio_driver.c index f6448633d6..69e3e4ed3a 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -588,7 +588,6 @@ bool audio_driver_init_internal(void *settings_data, bool audio_cb_inited) unsigned new_rate = 0; float *out_samples_buf = NULL; settings_t *settings = (settings_t*)settings_data; - size_t max_bufsamples = AUDIO_CHUNK_SIZE_NONBLOCKING * 2; bool audio_enable = settings->bools.audio_enable; bool audio_sync = settings->bools.audio_sync; bool audio_rate_control = settings->bools.audio_rate_control; @@ -597,15 +596,23 @@ bool audio_driver_init_internal(void *settings_data, bool audio_cb_inited) unsigned runloop_audio_latency = runloop_state_get_ptr()->audio_latency; unsigned audio_latency = (runloop_audio_latency > setting_audio_latency) ? runloop_audio_latency : setting_audio_latency; -#ifdef HAVE_REWIND - int16_t *rewind_buf = NULL; -#endif /* Accommodate rewind since at some point we might have two full buffers. */ size_t outsamples_max = AUDIO_CHUNK_SIZE_NONBLOCKING * 2 * AUDIO_MAX_RATIO * slowmotion_ratio; int16_t *out_conv_buf = (int16_t*)memalign_alloc(64, outsamples_max * sizeof(int16_t)); size_t audio_buf_length = AUDIO_CHUNK_SIZE_NONBLOCKING * 2 * sizeof(float); float *audio_buf = (float*)memalign_alloc(64, audio_buf_length); bool verbosity_enabled = verbosity_is_enabled(); +#ifdef HAVE_REWIND + int16_t *rewind_buf = NULL; + size_t max_buffer_samples = AUDIO_CHUNK_SIZE_NONBLOCKING * 2; + /* Needs to be able to hold full content of a full max_buffer_samples + * in addition to its own. */ + if (!(rewind_buf = (int16_t*)memalign_alloc(64, max_buffer_samples * sizeof(int16_t)))) + goto error; + + audio_driver_st.rewind_buf = rewind_buf; + audio_driver_st.rewind_size = max_buffer_samples; +#endif convert_s16_to_float_init_simd(); convert_float_to_s16_init_simd(); @@ -623,23 +630,13 @@ bool audio_driver_init_internal(void *settings_data, bool audio_cb_inited) audio_driver_st.chunk_nonblock_size = AUDIO_CHUNK_SIZE_NONBLOCKING; audio_driver_st.chunk_size = audio_driver_st.chunk_block_size; -#ifdef HAVE_REWIND - /* Needs to be able to hold full content of a full max_bufsamples - * in addition to its own. */ - if (!(rewind_buf = (int16_t*)memalign_alloc(64, max_bufsamples * sizeof(int16_t)))) - goto error; - - audio_driver_st.rewind_buf = rewind_buf; - audio_driver_st.rewind_size = max_bufsamples; -#endif - if (!audio_enable) { audio_driver_st.flags &= ~AUDIO_FLAG_ACTIVE; return false; } - else - audio_driver_st.flags |= AUDIO_FLAG_ACTIVE; + + audio_driver_st.flags |= AUDIO_FLAG_ACTIVE; if (!(audio_driver_find_driver(settings->arrays.audio_driver, "audio driver", verbosity_enabled))) From a4f73c622d092983cada80b66ee476ed6e03284c Mon Sep 17 00:00:00 2001 From: LibretroAdmin <105389611+LibretroAdmin@users.noreply.github.com> Date: Sun, 25 May 2025 15:36:42 +0200 Subject: [PATCH 120/175] Update audio_driver.c --- audio/audio_driver.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 69e3e4ed3a..3dceab0bb6 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -596,15 +596,15 @@ bool audio_driver_init_internal(void *settings_data, bool audio_cb_inited) unsigned runloop_audio_latency = runloop_state_get_ptr()->audio_latency; unsigned audio_latency = (runloop_audio_latency > setting_audio_latency) ? runloop_audio_latency : setting_audio_latency; + size_t max_buffer_samples = AUDIO_CHUNK_SIZE_NONBLOCKING * 2; /* Accommodate rewind since at some point we might have two full buffers. */ - size_t outsamples_max = AUDIO_CHUNK_SIZE_NONBLOCKING * 2 * AUDIO_MAX_RATIO * slowmotion_ratio; + size_t outsamples_max = max_buffer_samples * AUDIO_MAX_RATIO * slowmotion_ratio; int16_t *out_conv_buf = (int16_t*)memalign_alloc(64, outsamples_max * sizeof(int16_t)); - size_t audio_buf_length = AUDIO_CHUNK_SIZE_NONBLOCKING * 2 * sizeof(float); + size_t audio_buf_length = max_buffer_samples * sizeof(float); float *audio_buf = (float*)memalign_alloc(64, audio_buf_length); bool verbosity_enabled = verbosity_is_enabled(); #ifdef HAVE_REWIND int16_t *rewind_buf = NULL; - size_t max_buffer_samples = AUDIO_CHUNK_SIZE_NONBLOCKING * 2; /* Needs to be able to hold full content of a full max_buffer_samples * in addition to its own. */ if (!(rewind_buf = (int16_t*)memalign_alloc(64, max_buffer_samples * sizeof(int16_t)))) @@ -620,7 +620,7 @@ bool audio_driver_init_internal(void *settings_data, bool audio_cb_inited) if (!out_conv_buf || !audio_buf) goto error; - memset(audio_buf, 0, AUDIO_CHUNK_SIZE_NONBLOCKING * 2 * sizeof(float)); + memset(audio_buf, 0, max_buffer_samples * sizeof(float)); audio_driver_st.input_data = audio_buf; audio_driver_st.input_data_length = audio_buf_length; From 65f76bd514ae26074ec5843799a4e85236eba440 Mon Sep 17 00:00:00 2001 From: LibretroAdmin <105389611+LibretroAdmin@users.noreply.github.com> Date: Sun, 25 May 2025 15:41:17 +0200 Subject: [PATCH 121/175] Update audio_driver.c --- audio/audio_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 3dceab0bb6..88048cc0f9 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -620,7 +620,7 @@ bool audio_driver_init_internal(void *settings_data, bool audio_cb_inited) if (!out_conv_buf || !audio_buf) goto error; - memset(audio_buf, 0, max_buffer_samples * sizeof(float)); + memset(audio_buf, 0, audio_buf_length); audio_driver_st.input_data = audio_buf; audio_driver_st.input_data_length = audio_buf_length; From 86308ef670c53c6b433b689165b15ae894d6d15f Mon Sep 17 00:00:00 2001 From: BinBashBanana <51469593+BinBashBanana@users.noreply.github.com> Date: Sun, 25 May 2025 12:42:41 -0700 Subject: [PATCH 122/175] RWebAudio scheduling adjustments --- emscripten/library_rwebaudio.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/emscripten/library_rwebaudio.js b/emscripten/library_rwebaudio.js index 1599a50549..d97bfead0b 100644 --- a/emscripten/library_rwebaudio.js +++ b/emscripten/library_rwebaudio.js @@ -4,9 +4,10 @@ var LibraryRWebAudio = { $RWA: { /* add 10 ms of silence on start, seems to prevent underrun on start/unpausing (terrible crackling in firefox) */ MIN_START_OFFSET_SEC: 0.01, - /* firefox needs more latency (transparent to audio driver) */ - EXTRA_LATENCY_FIREFOX_SEC: 0.01, - PLATFORM_EMSCRIPTEN_BROWSER_FIREFOX: 2, + /* firefox and safari need more latency (transparent to audio driver) */ + EXTRA_LATENCY_SEC_NONCHROME: 0.01, + EXTRA_LATENCY_SEC_CHROME: 0, + PLATFORM_EMSCRIPTEN_BROWSER_CHROMIUM: 1, context: null, contextRunning: false, nonblock: false, @@ -44,7 +45,7 @@ var LibraryRWebAudio = { RWA.virtualBufferFrames = Math.round(RWA.latency * RWA.context.sampleRate / 1000); RWA.context.addEventListener("statechange", RWebAudioStateChangeCB); RWebAudioStateChangeCB(); - RWA.extraLatencySec = (_platform_emscripten_get_browser() == RWA.PLATFORM_EMSCRIPTEN_BROWSER_FIREFOX) ? RWA.EXTRA_LATENCY_FIREFOX_SEC : 0; + RWA.extraLatencySec = (_platform_emscripten_get_browser() == RWA.PLATFORM_EMSCRIPTEN_BROWSER_CHROMIUM) ? RWA.EXTRA_LATENCY_SEC_CHROME : RWA.EXTRA_LATENCY_SEC_NONCHROME; return 1; }, @@ -66,7 +67,8 @@ var LibraryRWebAudio = { bufferSource.connect(RWA.context.destination); var currentTime = RWebAudioGetCurrentTime(); - var startTime = RWA.endTime > currentTime ? RWA.endTime : currentTime + RWA.MIN_START_OFFSET_SEC; + /* when empty, start rounded up to nearest 1 ms, add MIN_START_OFFSET_SEC */ + var startTime = RWA.endTime > currentTime ? RWA.endTime : Math.ceil(currentTime * 1000) / 1000 + RWA.MIN_START_OFFSET_SEC; RWA.endTime = startTime + buffer.duration; bufferSource.start(startTime + RWA.extraLatencySec); From 0514f203eb3b170c5920c9e6027c6f743106e26a Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 26 May 2025 00:17:13 +0000 Subject: [PATCH 123/175] Fetch translations from Crowdin --- intl/msg_hash_ar.h | 4 ---- intl/msg_hash_ast.h | 1 - intl/msg_hash_be.h | 8 -------- intl/msg_hash_bg.h | 1 - intl/msg_hash_ca.h | 14 +++++++++++++- intl/msg_hash_chs.h | 8 -------- intl/msg_hash_cht.h | 8 -------- intl/msg_hash_cs.h | 8 -------- intl/msg_hash_cy.h | 5 ----- intl/msg_hash_da.h | 5 ----- intl/msg_hash_de.h | 12 ++++-------- intl/msg_hash_el.h | 5 +---- intl/msg_hash_en.h | 1 - intl/msg_hash_eo.h | 1 - intl/msg_hash_es.h | 10 +++++++++- intl/msg_hash_fa.h | 5 ----- intl/msg_hash_fi.h | 8 -------- intl/msg_hash_fr.h | 16 ++++++++++++++-- intl/msg_hash_gl.h | 8 -------- intl/msg_hash_hr.h | 1 - intl/msg_hash_hu.h | 8 -------- intl/msg_hash_id.h | 4 ---- intl/msg_hash_it.h | 12 ++++++++++-- intl/msg_hash_ja.h | 8 -------- intl/msg_hash_ko.h | 8 -------- intl/msg_hash_mt.h | 1 - intl/msg_hash_nl.h | 4 ---- intl/msg_hash_no.h | 9 --------- intl/msg_hash_oc.h | 1 - intl/msg_hash_or.h | 1 - intl/msg_hash_pl.h | 12 ++++++++---- intl/msg_hash_pt_br.h | 20 ++++++++++++-------- intl/msg_hash_pt_pt.h | 5 ----- intl/msg_hash_ro.h | 1 - intl/msg_hash_ru.h | 12 ++++++++++-- intl/msg_hash_si.h | 1 - intl/msg_hash_sk.h | 9 +-------- intl/msg_hash_sr.h | 5 ----- intl/msg_hash_sv.h | 8 -------- intl/msg_hash_tr.h | 10 +++++++++- intl/msg_hash_tt.h | 1 - intl/msg_hash_uk.h | 8 -------- intl/msg_hash_val.h | 5 ----- intl/msg_hash_vn.h | 5 ----- intl/progress.h | 14 +++++++------- 45 files changed, 98 insertions(+), 203 deletions(-) diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index aa9f6265a6..98b9ab38d7 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -567,10 +567,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "قفل النواة المثبتة" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "منع تعديل النواة المثبتة حاليا. يمكن استخدامها لتجنب التحديثات غير المرغوب فيها عندما يتطلب المحتوى إصدار أساسي محدد (على سبيل المثال مجموعة رومات الآركيد)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "استبعاد من قائمة 'نوى بلا محتوى'" diff --git a/intl/msg_hash_ast.h b/intl/msg_hash_ast.h index df8669be5b..8dd4afce76 100644 --- a/intl/msg_hash_ast.h +++ b/intl/msg_hash_ast.h @@ -1481,7 +1481,6 @@ MSG_HASH( ) - /* Settings > Input > Port # Controls */ MSG_HASH( diff --git a/intl/msg_hash_be.h b/intl/msg_hash_be.h index c411a4f50f..19b637dca2 100644 --- a/intl/msg_hash_be.h +++ b/intl/msg_hash_be.h @@ -567,10 +567,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Блакаванне ўсталяванага ядра" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Забараняе змену ўсталяванага ядра. Выключае непажаданыя абнаўленні, калі кантэнту патрабуецца пэўная версія ядра (напрыклад для аркадных набораў ROM)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Выключыць з меню 'Аўтаномныя ядры'" @@ -6311,10 +6307,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Паказ 'Імпартаваць змесціва'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Паказваць опцыю 'Імпарт кантэнту' у галоўным меню ці на ўкладцы плэйлістоў." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Галоўнае меню" diff --git a/intl/msg_hash_bg.h b/intl/msg_hash_bg.h index 18a25905e0..b818da3f19 100644 --- a/intl/msg_hash_bg.h +++ b/intl/msg_hash_bg.h @@ -1037,7 +1037,6 @@ MSG_HASH( - /* Settings > Input > Port # Controls */ MSG_HASH( diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index bb153afeca..2eb72b57c4 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -565,7 +565,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LOCK, - "Evita la modificació del nucli instal·lat actualment. Es podria utilitzar per a evitar actualitzacions no desitjades quan el contingut requereix una versió específica del nucli (p. ex., conjunts de ROM d'arcade)." + "Evita la modificació del nucli instal·lat actualment. Es podria utilitzar per a evitar actualitzacions no desitjades quan el contingut requereix una versió específica del nucli (p. ex., conjunts de ROM d'arcade) o les modificacions que faci el nucli." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, @@ -9015,6 +9015,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_STATE, "Desa un estat a la posició actualment seleccionada." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SAVE_STATE, + "Desa un estat a la ranura seleccionada. Nota: Els estats desats no es poden compartir i no funcionaran amb altres versions del nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Carrega estat" @@ -9023,6 +9027,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_STATE, "Carrega un estat desat des de la posició actual." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LOAD_STATE, + "Carrega un estat desat des de la ranura seleccionada. Nota: No funcionarà si l'estat es va desar amb una versió anterior del nucli." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Desfer càrrega ràpida" @@ -14077,6 +14085,10 @@ MSG_HASH( MSG_REWINDING, "Retrocedint." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Capacitat de memòria intermèdia insuficient." + ) MSG_HASH( MSG_REWIND_UNSUPPORTED, "No està disponible el rebobinat perquè aquest nucli no té suport d'estat desats serialitzats." diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index a649226529..cc9f9c78f6 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -567,10 +567,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "锁定已安装核心" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "防止修改当前安装的核心。当内容需要特定核心版本时可能会被用来避免不必要的更新 (例如街机的 ROM 集只适用于特定版本的核心)。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "从「无内容核心」菜单中排除" @@ -6107,10 +6103,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "显示「导入」" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "在主菜单或游戏列表中显示「导入」。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "主菜单" diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 352241b9c6..ba27874bff 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -551,10 +551,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "鎖定核心" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "防止修改目前使用的核心, 遊戲僅限此核心版本才可執行時, 可用於避免不必要的更新。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "在「應用核心」選項中不顯示" @@ -5967,10 +5963,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "顯示「匯入遊戲」" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "在主選單或列表選單中顯示「匯入遊戲」選項。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "主選單" diff --git a/intl/msg_hash_cs.h b/intl/msg_hash_cs.h index 8be34fbfd5..43ed335cd5 100644 --- a/intl/msg_hash_cs.h +++ b/intl/msg_hash_cs.h @@ -551,10 +551,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Zamknout nainstalované jádro" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Zabránit úpravě aktuálně nainstalovaného jádra. Lze použít k zamezení nechtěných aktualizací, pokud obsah vyžaduje určitou verzi jádra (např. sady Arcade ROM)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Vyloučit z menu 'Jádra bez obsahu'" @@ -6295,10 +6291,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Zobrazit 'Importovat obsah'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Zobrazení položky 'Importovat obsah' v hlavní nabídce nebo v podnabídce seznamů skladeb." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Hlavní menu" diff --git a/intl/msg_hash_cy.h b/intl/msg_hash_cy.h index d6fef867f8..a08e503611 100644 --- a/intl/msg_hash_cy.h +++ b/intl/msg_hash_cy.h @@ -443,10 +443,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Cloi Craidd wedi'i osod" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Atal addasu'r craidd sydd wedi'i osod ar hyn o bryd. Gellir ei ddefnyddio i osgoi diweddariadau diangen pan fydd angen fersiwn graidd benodol ar y cynnwys (e.e. setiau Arcade ROM)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_DELETE, "Dileu Craidd" @@ -1105,7 +1101,6 @@ MSG_HASH( ) - /* Settings > Input > Port # Controls */ diff --git a/intl/msg_hash_da.h b/intl/msg_hash_da.h index d90fd019cb..99176540bc 100644 --- a/intl/msg_hash_da.h +++ b/intl/msg_hash_da.h @@ -435,10 +435,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Lås installeret kerne" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Forhindre ændring af den aktuelt installerede kerne. Kan bruges til at undgå uønskede opdateringer, når indhold kræver en bestemt kerneversion (f.eks Arcade ROM sæt)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_DELETE, "Slet kerne" @@ -1045,7 +1041,6 @@ MSG_HASH( ) - /* Settings > Input > Port # Controls */ diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 6d0938b2c3..cd80f2c8bf 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -551,10 +551,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Installierten Core sperren" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Änderungen am aktuell installierten Core verhindern. Kann verwendet werden, um unerwünschte Updates zu vermeiden, wenn Inhalte eine bestimmte Core-Version benötigen (z. B. Arcade-ROM-Sets)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Von „Inhaltslose Cores“ ausschließen" @@ -6287,10 +6283,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "\"Inhalte importieren\" anzeigen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "\"Inhalte importieren\"-Eintrag im Hauptmenü oder im Wiedergabelisten-Untermenü anzeigen." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Hauptmenü" @@ -13837,6 +13829,10 @@ MSG_HASH( MSG_REWINDING, "Zurückspulen." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Die Pufferkapazität reicht nicht aus." + ) MSG_HASH( MSG_REWIND_UNSUPPORTED, "Zurückspringen nicht verfügbar, da dieser Core keine serialisierte Savestate-Unterstützung bietet." diff --git a/intl/msg_hash_el.h b/intl/msg_hash_el.h index 12326a5df4..73619b3953 100644 --- a/intl/msg_hash_el.h +++ b/intl/msg_hash_el.h @@ -551,10 +551,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Κλείδωμα Εγκατεστημένου Πυρήνα" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Αποτροπή τροποποιήσεων του τρέχοντος εγκατεστημένου πυρήνα. Μπορεί να χρησιμοποιηθεί για αποφυγή ανεπιθύμητων ενημερώσεων όταν το περιεχόμενο απαιτεί συγκεκριμένη έκδοση πυρήνα (π.χ. Παιχνίδια Arcade)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Εξαίρεση από το μενού 'Πυρήνες χωρίς περιεχόμενο'" @@ -2396,6 +2392,7 @@ MSG_HASH( "Υπηρεσία Τεχνητής Νοημοσύνης" ) + /* Settings > Input > Port # Controls */ MSG_HASH( diff --git a/intl/msg_hash_en.h b/intl/msg_hash_en.h index 0d104e2f9d..abd01f92a3 100644 --- a/intl/msg_hash_en.h +++ b/intl/msg_hash_en.h @@ -645,7 +645,6 @@ MSG_HASH( "Toggle between fading and static net-play chat messages." ) - /* Settings > Input > Port # Controls */ MSG_HASH( diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index dbcc30e4b1..3d0dc822fc 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -569,7 +569,6 @@ MSG_HASH( - /* Settings > Input > Port # Controls */ diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index 77ea9db2de..090efa08b6 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -565,7 +565,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LOCK, - "Impide que se modifique el núcleo instalado. Esta opción puede servir para evitar actualizaciones no deseadas en el caso de que un contenido requiera una versión específica del núcleo (p. ej.: sets de ROMs arcade)." + "Impide que se modifique el núcleo instalado. Esta opción puede servir para evitar actualizaciones no deseadas en el caso de que un contenido requiera una versión específica del núcleo (p. ej.: sets de ROMs arcade) o cambios en el formato de guardados rápidos del propio núcleo." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, @@ -9027,6 +9027,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_STATE, "Genera un guardado rápido en la posición seleccionada." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SAVE_STATE, + "Crea un guardado rápido en la posición seleccionada. Nota: los guardados rápidos no suelen ser intercambiables y podrían dejar de funcionar con otras versiones de este núcleo." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Carga rápida" @@ -9035,6 +9039,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_STATE, "Carga un guardado rápido de la posición seleccionada." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LOAD_STATE, + "Carga un guardado rápido de la posición seleccionada. Nota: podría no funcionar si se ha guardado con otra versión de este núcleo." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Deshacer carga rápida" diff --git a/intl/msg_hash_fa.h b/intl/msg_hash_fa.h index 407180ce8e..f5cd0ef5c4 100644 --- a/intl/msg_hash_fa.h +++ b/intl/msg_hash_fa.h @@ -539,10 +539,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "قفل کردن هستهٔ نصب‌شده" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "از ایجاد تغییر در هستهٔ نصب‌شدهٔ فعلی جلوگیری کنید. ممکن است برای جلوگیری از به‌روزرسانی‌های ناخواسته در زمانی که محتوا به نسخهٔ خاصی از هسته نیاز داشته باشد مفید باشد (مثلاً ROM های آرکید)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "از گزینگان «هسته‌های بدون محتوا» حذف کن" @@ -2441,7 +2437,6 @@ MSG_HASH( ) - /* Settings > Input > Port # Controls */ MSG_HASH( diff --git a/intl/msg_hash_fi.h b/intl/msg_hash_fi.h index 3f0a40862c..287991ca33 100644 --- a/intl/msg_hash_fi.h +++ b/intl/msg_hash_fi.h @@ -563,10 +563,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Lukitse asennettu ydin" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Estää muutokset nykyiseen asennettuun ytimeen. Voi käyttää epätoivoivottujen päivitysten estämiseen, kun sisältö vaatii tietyn ydinversion (esim. Kolikkopelien ROM-setit)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Poista \"Sisällöttömät ytimet\" valikosta" @@ -5419,10 +5415,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Näytä \"Tuo sisältöä\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Näytä \"Tuo sisältöä\"-tietue päävalikossa tai soittolistojen alavalikossa." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Päävalikko" diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index fbdcdbaa31..4389c4df0c 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -561,7 +561,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LOCK, - "Empêche la modification du cœur actuellement installé. Peut être utilisé pour éviter les mises à jour indésirables lorsque le contenu nécessite une version spécifique (les sets de ROMs d'arcade par exemple)." + "Empêcher la modification du cœur actuellement installé. Peut être utilisé pour éviter les mises à jour indésirables lorsque le contenu nécessite une version spécifique (les sets de ROMs d'arcade par exemple) ou les modifications du format des sauvegardes instantanées du cœur." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, @@ -6365,7 +6365,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Afficher une entrée 'Importer du contenu' dans le menu principal ou le sous-menu des listes de lecture." + "Afficher l'entrée 'Importer du contenu' dans le menu principal ou le sous-menu des listes de lecture." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, @@ -8979,6 +8979,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_STATE, "Effectue une sauvegarde instantanée dans l'emplacement actuellement sélectionné." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SAVE_STATE, + "Enregistrer une sauvegarde instantanée dans l'emplacement actuellement sélectionné. Remarque : les sauvegardes instantanées ne sont généralement pas portables et peuvent ne pas fonctionner avec d'autres versions de ce cœur." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Charger une sauvegarde instantanée" @@ -8987,6 +8991,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_STATE, "Charge une sauvegarde instantanée depuis l'emplacement actuellement sélectionné." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LOAD_STATE, + "Charger une sauvegarde instantanée à partir de l'emplacement actuellement sélectionné. Remarque : peut ne pas fonctionner si la sauvegarde instantanée a été créée avec une autre version du cœur." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Annuler le chargement de sauvegarde instantanée" @@ -14129,6 +14137,10 @@ MSG_HASH( MSG_REWINDING, "Rembobinage." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Capacité de mémoire tampon insuffisante." + ) MSG_HASH( MSG_REWIND_UNSUPPORTED, "Rembobinage indisponible car ce cœur ne prend pas en charge la sauvegarde instantanée sérialisée." diff --git a/intl/msg_hash_gl.h b/intl/msg_hash_gl.h index 805a00e566..5576d85fc1 100644 --- a/intl/msg_hash_gl.h +++ b/intl/msg_hash_gl.h @@ -567,10 +567,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Bloquear o núcleo instalado" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Coutar a modificación do núcleo actualmente instalado. Pode ser empregado para evitar anovacións non desexadas cando o contido precisa ter instalada unha versión específica do núcleo (p. ex. conxuntos de ROMs arcade)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Excluir do menú 'Nucleos sen contido'" @@ -6271,10 +6267,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostrar \"Importar contido\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Mostra unha entrada \"Importar contido\" dentro do menú principal ou do submenú das listas de reprodución." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Menú principal" diff --git a/intl/msg_hash_hr.h b/intl/msg_hash_hr.h index b5fc267ee3..513028fbb9 100644 --- a/intl/msg_hash_hr.h +++ b/intl/msg_hash_hr.h @@ -1085,7 +1085,6 @@ MSG_HASH( - /* Settings > Input > Port # Controls */ diff --git a/intl/msg_hash_hu.h b/intl/msg_hash_hu.h index 6cfa772a37..e503fcc950 100644 --- a/intl/msg_hash_hu.h +++ b/intl/msg_hash_hu.h @@ -555,10 +555,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Telepített mag zárolása" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "A jelenleg telepített mag módosításának megakadályozása. Használható a nemkívánatos frissítések elkerülésére (pl. Arcade ROM készletek)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Kihagyás a \"Tartalmat nem igénylő magok\" menüből" @@ -6375,10 +6371,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "\"Tartalom importálása\" látható" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "A \"Tartalom importálása\" lehetőség jelenjen meg a főmenüben vagy a játéklisták almenüjében." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Főmenü" diff --git a/intl/msg_hash_id.h b/intl/msg_hash_id.h index 37c8b29369..ee9d5b8058 100644 --- a/intl/msg_hash_id.h +++ b/intl/msg_hash_id.h @@ -515,10 +515,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Kunci Core Terpasang" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Mencegah modifikasi 'core' yang saat ini terpasang. Bermanfaat untuk mencegah 'core' tidak asal diperbarui jika isi permainan perlu versi 'core' tertentu agar tetap berjalan (seperti ROM Arcade)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_DELETE, "Hapus Core" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index abd351b30f..bf9471836a 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -557,7 +557,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LOCK, - "Impedisci la modifica del core attualmente installato. Può essere usato per evitare aggiornamenti indesiderati quando il contenuto richiede una specifica versione del core (ad es. i ROM set degli Arcade)." + "Evitare la modifica del nucleo attualmente installato. Può essere usato per evitare aggiornamenti indesiderati quando il contenuto richiede una specifica versione core (e.. Arcade ROM sets) o le modifiche del formato di salvataggio del core stesso." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, @@ -6305,7 +6305,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Mostra una voce 'Importa contenuto' nel menu principale o nel sottomenu delle playlist." + "Mostra la voce 'Importa contenuto' nel menu principale o nel sottomenu delle playlist." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, @@ -8895,6 +8895,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_STATE, "Salva uno stato nello slot selezionato" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SAVE_STATE, + "Salva uno stato nello slot attualmente selezionato. Nota: gli stati di salvataggio non sono in genere portatili e potrebbero non funzionare con altre versioni di questo nucleo." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Carica Stato" @@ -8903,6 +8907,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_STATE, "Carica un salvataggio dallo slot attualmente selezionato" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LOAD_STATE, + "Carica uno stato salvato dallo slot attualmente selezionato. Nota: potrebbe non funzionare se lo stato è stato salvato con un'altra versione del nucleo." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Annulla carica stato" diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index cf7069f672..c31e6ec971 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -559,10 +559,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "インストール済みコアをロック" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "現在インストールされているコアの変更を防止します。コンテンツが特定のコアバージョン (例: アーケード ROM セット) を必要とする場合に、望ましくない更新を回避するために使用されることがあります。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "[コンテンツレスコア] メニューから除外" @@ -6099,10 +6095,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "[コンテンツをインポート] を表示" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "メインメニューとプレイリストのサブメニューに [コンテンツをインポート] メニューを表示します。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "メインメニュー" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 899e096b31..b2aec2b6ab 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -567,10 +567,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "설치된 코어 잠금" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "현재 설치된 코어의 수정을 방지합니다. 콘텐츠에 특정 버전의 코어가 필요한 경우 원치 않는 업데이트를 방지하는 데 사용할 수 있습니다(예: 아케이드 롬셋)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "'단독 실행 코어' 메뉴에서 제외" @@ -6439,10 +6435,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "'콘텐츠 가져오기' 표시" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "메인 메뉴 또는 실행목록 하위메뉴 상에 콘텐츠 가져오기 항목을 표시합니다." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "메인 메뉴" diff --git a/intl/msg_hash_mt.h b/intl/msg_hash_mt.h index ec36df9ebe..84bceae0bd 100644 --- a/intl/msg_hash_mt.h +++ b/intl/msg_hash_mt.h @@ -153,7 +153,6 @@ - /* Settings > Input > Port # Controls */ diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index e1fadb34fd..901685dd27 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -503,10 +503,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Geïnstalleerde Core Vergrendelen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Voorkom wijziging van de huidige geïnstalleerde core. Kan worden gebruikt om ongewenste updates te voorkomen wanneer inhoud een specifieke core-versie vereist (bijv. Arcade ROM-sets)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Uitsluiten van 'inhoudloze Cores' menu" diff --git a/intl/msg_hash_no.h b/intl/msg_hash_no.h index 73be0725c3..6a4f7d0dce 100644 --- a/intl/msg_hash_no.h +++ b/intl/msg_hash_no.h @@ -543,10 +543,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Lås Installert Kjerne" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Forhindre modifisering av nåværende installerte kjerne. Kan brukes for å unngå uønskede oppdateringer når innholdet krever en spesifikk kjerneversjon (f.eks. Arkade ROM-sett)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Ekskluder fra \"Innholdsløse kjerner\" menyen" @@ -2301,7 +2297,6 @@ MSG_HASH( "Nettspill spiller chat" ) - /* Settings > Input > Port # Controls */ MSG_HASH( @@ -2788,10 +2783,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Vis 'Importert innhold'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Vis et \"Importer innhold\" element i hovedmenyen eller spillelister undermenyen." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Hovedmeny" diff --git a/intl/msg_hash_oc.h b/intl/msg_hash_oc.h index 4dd9c0f1b9..daa312834f 100644 --- a/intl/msg_hash_oc.h +++ b/intl/msg_hash_oc.h @@ -321,7 +321,6 @@ MSG_HASH( - /* Settings > Input > Port # Controls */ diff --git a/intl/msg_hash_or.h b/intl/msg_hash_or.h index ccacdd3197..aca7894b08 100644 --- a/intl/msg_hash_or.h +++ b/intl/msg_hash_or.h @@ -449,7 +449,6 @@ MSG_HASH( - /* Settings > Input > Port # Controls */ diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index 5f9e8780cd..ae599eb62d 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -559,10 +559,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Zablokuj zainstalowany rdzeń" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Zapobiegaj modyfikacjom aktualnie zainstalowanego rdzenia. Może być użyty w celu uniknięcia niechcianych aktualizacji, gdy zawartość wymaga określonej wersji głównej (np. zestawy ROM Arcade)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Wyklucz z menu 'Rdzenie bez zawartości'" @@ -7855,6 +7851,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_STATE, "Zapisz stan w aktualnie wybranym gnieździe." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SAVE_STATE, + "Zapisz stan w aktualnie wybranym slocie. Uwaga: Zapisywanie stanów nie jest zazwyczaj przenośne i może nie działać z innymi wersjami tego rdzenia." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Wczytaj zapis" @@ -7863,6 +7863,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_STATE, "Załaduj zapisany stan z aktualnie wybranego gniazda." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LOAD_STATE, + "Załaduj zapisany stan z aktualnie wybranego miejsca. Uwaga: może nie działać, jeśli stan został zapisany w innej wersji rdzenia." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Cofnij załadowanie stanu" diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 3c42465672..f18565ea78 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -551,10 +551,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Bloquear núcleo instalado" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Impede a alteração atual do núcleo instalado. Pode ser usado para evitar atualizações indesejadas quando o conteúdo necessitar de uma versão específica do núcleo (ex: conjuntos de ROMs de Arcade)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Excluir do menu \"Núcleos sem conteúdo\"" @@ -5527,6 +5523,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, "Exibe o menu \"Favoritos\". (requer reinício em Ozone/XMB)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Mostrar Favoritos Primeiro" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, + "Mostrar ‘Favoritos’ antes de ‘Histórico’. (Reinicialização necessária no Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Mostrar 'Imagens'" @@ -5559,10 +5563,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostrar \"Importar conteúdo\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Mostre a entrada \"Importar conteúdo\" dentro do menu principal ou do submenu das listas de reprodução." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Menu principal" @@ -12645,6 +12645,10 @@ MSG_HASH( MSG_REWINDING, "Rebobinando." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Capacidade do buffer insuficiente." + ) MSG_HASH( MSG_REWIND_UNSUPPORTED, "Rebobinamento indisponível, porque o núcleo não tem suporte de serialização ao jogo salvo." diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index b8fdd43160..91aecf3cfd 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -547,10 +547,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Bloquear núcleo instalado" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Previne que o núcleo atualmente instalado seja modificado. Pode ser usado para evitar atualizações indesejadas quando o conteúdo requer uma versão específica do núcleo (por exemplo, conjuntos de ROM Arcade)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Excluir do menu 'Núcleos sem conteúdo'" @@ -2629,7 +2625,6 @@ MSG_HASH( "Envia uma mensagem de chat para a sessão atual de netplay." ) - /* Settings > Input > Port # Controls */ MSG_HASH( diff --git a/intl/msg_hash_ro.h b/intl/msg_hash_ro.h index ec36df9ebe..84bceae0bd 100644 --- a/intl/msg_hash_ro.h +++ b/intl/msg_hash_ro.h @@ -153,7 +153,6 @@ - /* Settings > Input > Port # Controls */ diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index fa5bd98a9a..ceefe1ab89 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -569,7 +569,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LOCK, - "Запрещает изменение установленного ядра. Исключает нежелательные обновления, когда контенту требуется определенная версия ядра (например для аркадных ромсетов)." + "Запрещает изменение установленного ядра. Исключает нежелательные обновления в случаях, когда контенту требуется определённая версия ядра (напр., для аркадных ромсетов) или при изменении формата сохранений." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, @@ -6437,7 +6437,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Показывать опцию 'Импорт контента' в главном меню или на вкладке плейлистов." + "Показывать 'Импорт контента' в главном меню или в подменю плейлистов." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, @@ -9063,6 +9063,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_STATE, "Сохранить состояние в текущий выбранный слот." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SAVE_STATE, + "Сохранить состояние в текущий выбранный слот. Как правило, быстрые сохранения могут не работать при переносе и с другими версиями ядра." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Загрузить" @@ -9071,6 +9075,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_STATE, "Загрузить состояние из текущего выбранного слота." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LOAD_STATE, + "Загрузить состояние из текущего выбранного слота. Может не работать при попытке загрузить сохранение с другой версии ядра." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Отменить загрузку" diff --git a/intl/msg_hash_si.h b/intl/msg_hash_si.h index 3763addca7..3b817b26e7 100644 --- a/intl/msg_hash_si.h +++ b/intl/msg_hash_si.h @@ -217,7 +217,6 @@ MSG_HASH( - /* Settings > Input > Port # Controls */ diff --git a/intl/msg_hash_sk.h b/intl/msg_hash_sk.h index ef2891ca9d..a2f742c501 100644 --- a/intl/msg_hash_sk.h +++ b/intl/msg_hash_sk.h @@ -519,10 +519,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Uzamknúť Nainštalované Jadro" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Zabráňte úprave aktuálne nainštalovaného jadra. Môže sa použiť na zabránenie nechceným aktualizáciám, keď obsah vyžaduje špecifickú verziu jadra (napr. Sady Arcade ROM)." - ) MSG_HASH( MENU_ENUM_SUBLABEL_CORE_SET_STANDALONE_EXEMPT, "Zabrániť zobrazeniu tohto jadra na karte/ponuke 'Jadrá bez obsahu'. Platí iba v prípade, že je režim zobrazenia nastavený na 'Vlastný'." @@ -2632,6 +2628,7 @@ MSG_HASH( "Služba AI" ) + /* Settings > Input > Port # Controls */ MSG_HASH( @@ -3334,10 +3331,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Zobraziť 'Importovať obsah'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Zobraziť položku 'Importovať obsah' v hlavnej ponuke alebo ponuke hracích zoznamov." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Hlavné Menu" diff --git a/intl/msg_hash_sr.h b/intl/msg_hash_sr.h index a3c96f3129..6a3215fd7d 100644 --- a/intl/msg_hash_sr.h +++ b/intl/msg_hash_sr.h @@ -491,10 +491,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Zaključaj instalirano jezgro" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Spreči modifikaciju trenutno instaliranog jezgra. Može koristiti da se izbegnu nepoželjna ažuriranja kada sadržaj zahteva specifičnu verziju jezgra (npr. ROM-kompleti za arkadne mašine)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Izuzmi iz menija „Jezgra bez sadržaja”" @@ -1929,7 +1925,6 @@ MSG_HASH( ) - /* Settings > Input > Port # Controls */ diff --git a/intl/msg_hash_sv.h b/intl/msg_hash_sv.h index 9eceef4b04..6762de1125 100644 --- a/intl/msg_hash_sv.h +++ b/intl/msg_hash_sv.h @@ -551,10 +551,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Lås installerad kärna" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Förhindra modifiering av den installerade kärnan. Kan användas för att undvika oönskade uppdateringar när Innehåll kräver en specifik Kärnversion (t.ex. Arcade ROM-sets)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Uteslut från 'Innehållslösa kärnor'-menyn" @@ -5827,10 +5823,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Visa 'Importera Innehåll'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Visa en 'Importera innehåll' -post i huvudmenyn eller undermenyn för spellistor." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Huvudmeny" diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 884d5635c2..b3959bc9a9 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -561,7 +561,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LOCK, - "Kurulu olan çekirdeğin değiştirilmesini önle. İçerik belirli bir çekirdek sürüm gerektirdiğinde istenmeyen güncellemeleri önlemek için kullanılabilir (örn. Arcade ROM setleri)." + "Kurulu olan çekirdeğin değiştirilmesini önle. İçerik belirli bir çekirdek sürüm gerektirdiğinde istenmeyen güncellemeleri önlemek için kullanılabilir (örn. Arcade ROM setleri). veya çekirdeğin kendi durum kayıt biçimi değişir." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, @@ -9035,6 +9035,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_STATE, "Seçili yuvaya durumu kaydedin." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SAVE_STATE, + "Şu anda seçili yuvaya bir durum kaydedin. Not: durum kayıtları genellikle taşınabilir değildir ve bu çekirdeğin diğer sürümleriyle çalışmayabilir." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Durum Yükle" @@ -9043,6 +9047,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_STATE, "Seçili yuvadan kaydedilmiş durum yükleyin." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LOAD_STATE, + "Şu anda seçili yuvadan kaydedilmiş bir durumu yükleyin. Not: durum çekirdeğin başka bir sürümüyle kaydedilmişse çalışmayabilir." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Yüklü Durumu Geri Al" diff --git a/intl/msg_hash_tt.h b/intl/msg_hash_tt.h index 94b59a67f7..0e57f7e734 100644 --- a/intl/msg_hash_tt.h +++ b/intl/msg_hash_tt.h @@ -273,7 +273,6 @@ MSG_HASH( - /* Settings > Input > Port # Controls */ diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index 27894d902b..de51eca54d 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -567,10 +567,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Блокувати встановлене ядро" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Заборонити внесення змін до встановленого ядра. Корисне для блокування оновлень, якщо вміст вимагає специфічної версії ядра для роботи (наприклад набори аркадних ROM)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Виключити з меню 'Автономні ядра'" @@ -6375,10 +6371,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Показати 'Зміст імпорту'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Відобразити запис \"Контент імпорту\" у головному меню або підменю списків відтворення." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Головне меню" diff --git a/intl/msg_hash_val.h b/intl/msg_hash_val.h index 9ba4482ea7..81646fe370 100644 --- a/intl/msg_hash_val.h +++ b/intl/msg_hash_val.h @@ -519,10 +519,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Bloquejar el nucli instal·lat" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Preven qualsevol modificació sobre el nucli actual instal·lat. Esta opció pot fer-se servir per evitar actualitzacions no desitjades si un contingut requerix d'una versió específica d'un nucli (p.ex. conjunts de ROMs d'arcade)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Exclou del menú 'Nuclis sense continguts'" @@ -2261,7 +2257,6 @@ MSG_HASH( ) - /* Settings > Input > Port # Controls */ MSG_HASH( diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 8cc3d4a64e..53a2a3e097 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -543,10 +543,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Khoá Lõi Đã Cài Đặt" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CORE_LOCK, - "Ngăn chặn việc sửa đổi lõi hiện được cài đặt. Có thể được sử dụng để tránh cập nhật không mong muốn khi nội dung yêu cầu phiên bản cốt lõi cụ thể (ví dụ: bộ ROM Arcade)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_DELETE, "Xóa Core" @@ -1561,7 +1557,6 @@ MSG_HASH( ) - /* Settings > Input > Port # Controls */ diff --git a/intl/progress.h b/intl/progress.h index fbb236ca61..0e95437216 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,7 +15,7 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ @@ -39,7 +39,7 @@ #define LANGUAGE_PROGRESS_GREEK_APPROVED 0 /* English, United Kingdom */ -#define LANGUAGE_PROGRESS_ENGLISH_UNITED_KINGDOM_TRANSLATED 98 +#define LANGUAGE_PROGRESS_ENGLISH_UNITED_KINGDOM_TRANSLATED 97 #define LANGUAGE_PROGRESS_ENGLISH_UNITED_KINGDOM_APPROVED 0 /* Esperanto */ @@ -48,19 +48,19 @@ /* Spanish */ #define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 100 -#define LANGUAGE_PROGRESS_SPANISH_APPROVED 91 +#define LANGUAGE_PROGRESS_SPANISH_APPROVED 90 /* Persian */ #define LANGUAGE_PROGRESS_PERSIAN_TRANSLATED 11 #define LANGUAGE_PROGRESS_PERSIAN_APPROVED 0 /* Finnish */ -#define LANGUAGE_PROGRESS_FINNISH_TRANSLATED 75 +#define LANGUAGE_PROGRESS_FINNISH_TRANSLATED 74 #define LANGUAGE_PROGRESS_FINNISH_APPROVED 45 /* French */ -#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 99 -#define LANGUAGE_PROGRESS_FRENCH_APPROVED 99 +#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_FRENCH_APPROVED 100 /* Galician */ #define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 99 @@ -120,7 +120,7 @@ /* Russian */ #define LANGUAGE_PROGRESS_RUSSIAN_TRANSLATED 99 -#define LANGUAGE_PROGRESS_RUSSIAN_APPROVED 12 +#define LANGUAGE_PROGRESS_RUSSIAN_APPROVED 13 /* Slovak */ #define LANGUAGE_PROGRESS_SLOVAK_TRANSLATED 21 From d8cd500316323187661ceac42da7762611182741 Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Mon, 26 May 2025 00:29:06 -0400 Subject: [PATCH 124/175] macOS: Prompt for local network access --- pkg/apple/OSX/Info_Metal.plist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/apple/OSX/Info_Metal.plist b/pkg/apple/OSX/Info_Metal.plist index 6c59acfcb7..73046ce6d5 100644 --- a/pkg/apple/OSX/Info_Metal.plist +++ b/pkg/apple/OSX/Info_Metal.plist @@ -66,6 +66,8 @@ NSHumanReadableCopyright Copyright © 2024 RetroArch. All rights reserved. + NSLocalNetworkUsageDescription + Local Netplay requires local network NSLocationWhenInUseUsageDescription Some cores can use location. NSMainNibFile From 158ad0c4bc682e10b68fa455a2dc967703d770c6 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Mon, 26 May 2025 16:51:25 +0300 Subject: [PATCH 125/175] Enable savestate thumbnails by default for x64 (#17944) --- config.def.h | 5 +++++ menu/menu_setting.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index 2673a97897..4a1df48330 100644 --- a/config.def.h +++ b/config.def.h @@ -1401,7 +1401,12 @@ #define DEFAULT_SAVESTATE_AUTO_SAVE false #define DEFAULT_SAVESTATE_AUTO_LOAD false +/* Take screenshots for save states */ +#if defined(__x86_64__) +#define DEFAULT_SAVESTATE_THUMBNAIL_ENABLE true +#else #define DEFAULT_SAVESTATE_THUMBNAIL_ENABLE false +#endif /* When creating save (srm) files, compress * written data */ diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 0fef269c98..3c9c042025 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -11345,7 +11345,7 @@ static bool setting_append_list( bool_entries[listing].target = &settings->bools.savestate_thumbnail_enable; bool_entries[listing].name_enum_idx = MENU_ENUM_LABEL_SAVESTATE_THUMBNAIL_ENABLE; bool_entries[listing].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SAVESTATE_THUMBNAIL_ENABLE; - bool_entries[listing].flags = SD_FLAG_ADVANCED; + bool_entries[listing].flags = SD_FLAG_NONE; if (DEFAULT_SAVESTATE_THUMBNAIL_ENABLE) bool_entries[listing].flags |= SD_FLAG_DEFAULT_VALUE; listing++; From d2a824c1a7010e508e754e84b9e428fe8f04012e Mon Sep 17 00:00:00 2001 From: sonninnos Date: Mon, 26 May 2025 17:42:18 +0300 Subject: [PATCH 126/175] Playlists settings menu reorganizing --- menu/menu_displaylist.c | 24 ++++++++-------- menu/menu_setting.c | 61 ++++++++++++++++++++--------------------- 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 69206589ff..1d1f98a4a1 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -7214,14 +7214,20 @@ unsigned menu_displaylist_build_list( bool truncate_playlist = settings->bools.ozone_truncate_playlist_name; menu_displaylist_build_info_selective_t build_list[] = { +#ifdef HAVE_NETWORKING + {MENU_ENUM_LABEL_NETWORK_ON_DEMAND_THUMBNAILS, PARSE_ONLY_BOOL, true}, +#endif + {MENU_ENUM_LABEL_PLAYLIST_USE_FILENAME, PARSE_ONLY_BOOL, true}, + {MENU_ENUM_LABEL_PLAYLIST_ALLOW_NON_PNG, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_HISTORY_LIST_ENABLE, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_CONTENT_HISTORY_SIZE, PARSE_ONLY_UINT, false}, {MENU_ENUM_LABEL_CONTENT_FAVORITES_SIZE, PARSE_ONLY_INT, true}, + {MENU_ENUM_LABEL_OZONE_TRUNCATE_PLAYLIST_NAME, PARSE_ONLY_BOOL, true}, + {MENU_ENUM_LABEL_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME, PARSE_ONLY_BOOL, false}, + {MENU_ENUM_LABEL_PLAYLIST_SORT_ALPHABETICAL, PARSE_ONLY_BOOL, true}, + {MENU_ENUM_LABEL_PLAYLIST_PORTABLE_PATHS, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_PLAYLIST_ENTRY_RENAME, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_PLAYLIST_ENTRY_REMOVE, PARSE_ONLY_UINT, true}, - {MENU_ENUM_LABEL_PLAYLIST_SORT_ALPHABETICAL, PARSE_ONLY_BOOL, true}, - {MENU_ENUM_LABEL_PLAYLIST_USE_OLD_FORMAT, PARSE_ONLY_BOOL, true}, - {MENU_ENUM_LABEL_PLAYLIST_COMPRESSION, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_PLAYLIST_SHOW_INLINE_CORE_NAME, PARSE_ONLY_UINT, true}, {MENU_ENUM_LABEL_PLAYLIST_SHOW_HISTORY_ICONS, PARSE_ONLY_UINT, true}, {MENU_ENUM_LABEL_PLAYLIST_SHOW_ENTRY_IDX, PARSE_ONLY_BOOL, true}, @@ -7231,16 +7237,10 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_PLAYLIST_FUZZY_ARCHIVE_MATCH, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_SCAN_WITHOUT_CORE_MATCH, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_SCAN_SERIAL_AND_CRC, PARSE_ONLY_BOOL, true}, - {MENU_ENUM_LABEL_OZONE_TRUNCATE_PLAYLIST_NAME, PARSE_ONLY_BOOL, true}, - {MENU_ENUM_LABEL_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME, PARSE_ONLY_BOOL, false}, {MENU_ENUM_LABEL_CONTENT_RUNTIME_LOG, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_CONTENT_RUNTIME_LOG_AGGREGATE, PARSE_ONLY_BOOL, true}, - {MENU_ENUM_LABEL_PLAYLIST_PORTABLE_PATHS, PARSE_ONLY_BOOL, true}, - {MENU_ENUM_LABEL_PLAYLIST_USE_FILENAME, PARSE_ONLY_BOOL, true}, - {MENU_ENUM_LABEL_PLAYLIST_ALLOW_NON_PNG, PARSE_ONLY_BOOL, true}, -#ifdef HAVE_NETWORKING - {MENU_ENUM_LABEL_NETWORK_ON_DEMAND_THUMBNAILS, PARSE_ONLY_BOOL, true}, -#endif + {MENU_ENUM_LABEL_PLAYLIST_USE_OLD_FORMAT, PARSE_ONLY_BOOL, true}, + {MENU_ENUM_LABEL_PLAYLIST_COMPRESSION, PARSE_ONLY_BOOL, true}, }; for (i = 0; i < ARRAY_SIZE(build_list); i++) @@ -10821,8 +10821,10 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_AUTOSAVE_INTERVAL, PARSE_ONLY_UINT, true}, {MENU_ENUM_LABEL_BLOCK_SRAM_OVERWRITE, PARSE_ONLY_BOOL, true}, +#if defined(HAVE_ZLIB) {MENU_ENUM_LABEL_SAVE_FILE_COMPRESSION, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_SAVESTATE_FILE_COMPRESSION, PARSE_ONLY_BOOL, true}, +#endif {MENU_ENUM_LABEL_SAVESTATE_THUMBNAIL_ENABLE, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_SAVESTATE_AUTO_LOAD, PARSE_ONLY_BOOL, true}, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 3c9c042025..d523713564 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -11555,37 +11555,6 @@ static bool setting_append_list( SD_FLAG_NONE); #endif - /* TODO/FIXME: This is in the wrong group... */ - CONFIG_BOOL( - list, list_info, - &settings->bools.scan_without_core_match, - MENU_ENUM_LABEL_SCAN_WITHOUT_CORE_MATCH, - MENU_ENUM_LABEL_VALUE_SCAN_WITHOUT_CORE_MATCH, - DEFAULT_SCAN_WITHOUT_CORE_MATCH, - MENU_ENUM_LABEL_VALUE_OFF, - MENU_ENUM_LABEL_VALUE_ON, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler, - SD_FLAG_NONE); - - CONFIG_BOOL( - list, list_info, - &settings->bools.scan_serial_and_crc, - MENU_ENUM_LABEL_SCAN_SERIAL_AND_CRC, - MENU_ENUM_LABEL_VALUE_SCAN_SERIAL_AND_CRC, - DEFAULT_SCAN_SERIAL_AND_CRC, - MENU_ENUM_LABEL_VALUE_OFF, - MENU_ENUM_LABEL_VALUE_ON, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler, - SD_FLAG_NONE); - CONFIG_ACTION( list, list_info, MENU_ENUM_LABEL_CLOUD_SYNC_SETTINGS, @@ -21794,6 +21763,36 @@ static bool setting_append_list( SD_FLAG_NONE ); + CONFIG_BOOL( + list, list_info, + &settings->bools.scan_without_core_match, + MENU_ENUM_LABEL_SCAN_WITHOUT_CORE_MATCH, + MENU_ENUM_LABEL_VALUE_SCAN_WITHOUT_CORE_MATCH, + DEFAULT_SCAN_WITHOUT_CORE_MATCH, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + + CONFIG_BOOL( + list, list_info, + &settings->bools.scan_serial_and_crc, + MENU_ENUM_LABEL_SCAN_SERIAL_AND_CRC, + MENU_ENUM_LABEL_VALUE_SCAN_SERIAL_AND_CRC, + DEFAULT_SCAN_SERIAL_AND_CRC, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + CONFIG_BOOL( list, list_info, &settings->bools.playlist_portable_paths, From 1c0f945c215ec64d931208523f12a2fb8f0d93de Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Mon, 26 May 2025 23:18:16 +0300 Subject: [PATCH 127/175] Add media history playlists to playlist manager (#17945) --- menu/cbs/menu_cbs_label.c | 9 +++-- menu/cbs/menu_cbs_title.c | 9 +++-- menu/drivers/materialui.c | 21 ++++++---- menu/drivers/ozone.c | 82 ++++++++++++++++++++++----------------- menu/drivers/xmb.c | 61 +++++++++++++++++------------ menu/menu_displaylist.c | 71 ++++++++++++++++++++++++++------- 6 files changed, 166 insertions(+), 87 deletions(-) diff --git a/menu/cbs/menu_cbs_label.c b/menu/cbs/menu_cbs_label.c index 9689740da1..17844f38aa 100644 --- a/menu/cbs/menu_cbs_label.c +++ b/menu/cbs/menu_cbs_label.c @@ -65,13 +65,16 @@ static int action_bind_label_playlist_collection_entry( if (string_is_equal_noncase(path_get_extension(playlist_file), "lpl")) { - /* Handle content history */ if (string_is_equal(playlist_file, FILE_PATH_CONTENT_HISTORY)) strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HISTORY_TAB), len); - /* Handle favourites */ else if (string_is_equal(playlist_file, FILE_PATH_CONTENT_FAVORITES)) strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB), len); - /* Handle collection playlists */ + else if (string_is_equal(playlist_file, FILE_PATH_CONTENT_IMAGE_HISTORY)) + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB), len); + else if (string_is_equal(playlist_file, FILE_PATH_CONTENT_MUSIC_HISTORY)) + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB), len); + else if (string_is_equal(playlist_file, FILE_PATH_CONTENT_VIDEO_HISTORY)) + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_TAB), len); else fill_pathname(s, playlist_file, "", len); } diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index 58249e0dbb..f46e68976f 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -397,13 +397,16 @@ static int action_get_title_deferred_playlist_list(const char *path, const char if (string_is_equal_noncase(path_get_extension(playlist_file), "lpl")) { - /* Handle content history */ if (string_is_equal(playlist_file, FILE_PATH_CONTENT_HISTORY)) strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HISTORY_TAB), len); - /* Handle favourites */ else if (string_is_equal(playlist_file, FILE_PATH_CONTENT_FAVORITES)) strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB), len); - /* Handle collection playlists */ + else if (string_is_equal(playlist_file, FILE_PATH_CONTENT_IMAGE_HISTORY)) + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB), len); + else if (string_is_equal(playlist_file, FILE_PATH_CONTENT_MUSIC_HISTORY)) + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB), len); + else if (string_is_equal(playlist_file, FILE_PATH_CONTENT_VIDEO_HISTORY)) + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_TAB), len); else fill_pathname(s, playlist_file, "", len); } diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index e2727aa1fd..08d04c5ac4 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -207,10 +207,10 @@ enum MUI_TEXTURE_KEY_HOVER, MUI_TEXTURE_FOLDER, MUI_TEXTURE_PARENT_DIRECTORY, - MUI_TEXTURE_IMAGE, MUI_TEXTURE_ARCHIVE, - MUI_TEXTURE_VIDEO, + MUI_TEXTURE_IMAGE, MUI_TEXTURE_MUSIC, + MUI_TEXTURE_VIDEO, MUI_TEXTURE_QUIT, MUI_TEXTURE_HELP, MUI_TEXTURE_HISTORY, @@ -2095,10 +2095,10 @@ static const char *materialui_texture_path(unsigned id) return "parent_directory.png"; case MUI_TEXTURE_IMAGE: return "image.png"; - case MUI_TEXTURE_VIDEO: - return "video.png"; case MUI_TEXTURE_MUSIC: return "music.png"; + case MUI_TEXTURE_VIDEO: + return "video.png"; case MUI_TEXTURE_ARCHIVE: return "archive.png"; case MUI_TEXTURE_QUIT: @@ -12049,7 +12049,7 @@ static void materialui_list_insert(void *userdata, /* Playlist manager icons */ else if (string_is_equal(fullpath, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_LIST))) { - size_t path_siz = strlen(path); + size_t path_size = strlen(path); /* Set defaults */ node->icon_texture_index = MUI_TEXTURE_PLAYLIST; node->icon_type = MUI_ICON_TYPE_INTERNAL; @@ -12057,13 +12057,20 @@ static void materialui_list_insert(void *userdata, && !string_is_empty(path)) { if (string_ends_with_size(path, "_history.lpl", - path_siz, STRLEN_CONST("_history.lpl"))) + path_size, STRLEN_CONST("_history.lpl"))) { node->icon_texture_index = MUI_TEXTURE_HISTORY; node->icon_type = MUI_ICON_TYPE_INTERNAL; + + if (strstr(path, "image_history")) + node->icon_texture_index = MUI_TEXTURE_IMAGE; + else if (strstr(path, "music_history")) + node->icon_texture_index = MUI_TEXTURE_MUSIC; + else if (strstr(path, "video_history")) + node->icon_texture_index = MUI_TEXTURE_VIDEO; } else if (string_ends_with_size(path, "_favorites.lpl", - path_siz, STRLEN_CONST("_favorites.lpl"))) + path_size, STRLEN_CONST("_favorites.lpl"))) { node->icon_texture_index = MUI_TEXTURE_ADD_TO_FAVORITES; node->icon_type = MUI_ICON_TYPE_INTERNAL; diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index a1115ba5e9..6d21595d02 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -137,13 +137,13 @@ enum OZONE_SYSTEM_TAB_SETTINGS, OZONE_SYSTEM_TAB_HISTORY, OZONE_SYSTEM_TAB_FAVORITES, +#ifdef HAVE_IMAGEVIEWER + OZONE_SYSTEM_TAB_IMAGES, +#endif OZONE_SYSTEM_TAB_MUSIC, #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) OZONE_SYSTEM_TAB_VIDEO, #endif -#ifdef HAVE_IMAGEVIEWER - OZONE_SYSTEM_TAB_IMAGES, -#endif #ifdef HAVE_NETWORKING OZONE_SYSTEM_TAB_NETPLAY, #endif @@ -181,9 +181,9 @@ enum OZONE_TAB_TEXTURES OZONE_TAB_TEXTURE_SETTINGS, OZONE_TAB_TEXTURE_HISTORY, OZONE_TAB_TEXTURE_FAVORITES, + OZONE_TAB_TEXTURE_IMAGE, OZONE_TAB_TEXTURE_MUSIC, OZONE_TAB_TEXTURE_VIDEO, - OZONE_TAB_TEXTURE_IMAGE, OZONE_TAB_TEXTURE_NETWORK, OZONE_TAB_TEXTURE_SCAN_CONTENT, OZONE_TAB_TEXTURE_CONTENTLESS_CORES, @@ -198,6 +198,9 @@ enum OZONE_ENTRIES_ICONS_TEXTURE_SETTINGS, OZONE_ENTRIES_ICONS_TEXTURE_HISTORY, OZONE_ENTRIES_ICONS_TEXTURE_FAVORITES, +#ifdef HAVE_IMAGEVIEWER + OZONE_ENTRIES_ICONS_TEXTURE_IMAGES, +#endif OZONE_ENTRIES_ICONS_TEXTURE_MUSICS, #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) OZONE_ENTRIES_ICONS_TEXTURE_MOVIES, @@ -207,9 +210,6 @@ enum OZONE_ENTRIES_ICONS_TEXTURE_ROOM, OZONE_ENTRIES_ICONS_TEXTURE_ROOM_LAN, OZONE_ENTRIES_ICONS_TEXTURE_ROOM_RELAY, -#endif -#ifdef HAVE_IMAGEVIEWER - OZONE_ENTRIES_ICONS_TEXTURE_IMAGES, #endif OZONE_ENTRIES_ICONS_TEXTURE_SETTING, OZONE_ENTRIES_ICONS_TEXTURE_SUBSETTING, @@ -240,8 +240,8 @@ enum OZONE_ENTRIES_ICONS_TEXTURE_ZIP, OZONE_ENTRIES_ICONS_TEXTURE_FAVORITE, OZONE_ENTRIES_ICONS_TEXTURE_ADD_FAVORITE, - OZONE_ENTRIES_ICONS_TEXTURE_MUSIC, OZONE_ENTRIES_ICONS_TEXTURE_IMAGE, + OZONE_ENTRIES_ICONS_TEXTURE_MUSIC, OZONE_ENTRIES_ICONS_TEXTURE_MOVIE, OZONE_ENTRIES_ICONS_TEXTURE_CORE, OZONE_ENTRIES_ICONS_TEXTURE_RDB, @@ -1920,12 +1920,12 @@ static uintptr_t ozone_entries_icon_get_texture( case MENU_ENUM_LABEL_GOTO_IMAGES: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_IMAGES]; #endif + case MENU_ENUM_LABEL_GOTO_MUSIC: + return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MUSICS]; #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) case MENU_ENUM_LABEL_GOTO_VIDEO: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MOVIES]; #endif - case MENU_ENUM_LABEL_GOTO_MUSIC: - return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MUSICS]; case MENU_ENUM_LABEL_GOTO_EXPLORE: if (!string_is_equal(enum_path, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_EXPLORE))) return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CURSOR]; @@ -2313,19 +2313,19 @@ static uintptr_t ozone_entries_icon_get_texture( switch (ozone->tabs[ozone->categories_selection_ptr]) { case OZONE_SYSTEM_TAB_MAIN: - if (string_is_equal(ozone->title, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB))) - return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MUSIC]; - else if (string_is_equal(ozone->title, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB))) + if (string_is_equal(ozone->title, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB))) return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_IMAGE]; + else if (string_is_equal(ozone->title, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB))) + return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MUSIC]; else if (string_is_equal(ozone->title, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_TAB))) return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MOVIE]; break; - case OZONE_SYSTEM_TAB_MUSIC: - return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MUSIC]; #ifdef HAVE_IMAGEVIEWER case OZONE_SYSTEM_TAB_IMAGES: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_IMAGE]; #endif + case OZONE_SYSTEM_TAB_MUSIC: + return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MUSIC]; #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) case OZONE_SYSTEM_TAB_VIDEO: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MOVIE]; @@ -2339,11 +2339,11 @@ static uintptr_t ozone_entries_icon_get_texture( return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SHADER_OPTIONS]; case FILE_TYPE_CARCHIVE: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_ZIP]; - case FILE_TYPE_MUSIC: - return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MUSIC]; case FILE_TYPE_IMAGE: case FILE_TYPE_IMAGEVIEWER: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_IMAGE]; + case FILE_TYPE_MUSIC: + return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MUSIC]; case FILE_TYPE_MOVIE: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MOVIE]; case FILE_TYPE_CORE: @@ -2603,15 +2603,15 @@ static const char *ozone_entries_icon_texture_path(unsigned id) return "favorites.png"; case OZONE_ENTRIES_ICONS_TEXTURE_ADD_FAVORITE: return "add-favorite.png"; +#ifdef HAVE_IMAGEVIEWER + case OZONE_ENTRIES_ICONS_TEXTURE_IMAGES: + return "images.png"; +#endif case OZONE_ENTRIES_ICONS_TEXTURE_MUSICS: return "musics.png"; #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) case OZONE_ENTRIES_ICONS_TEXTURE_MOVIES: return "movies.png"; -#endif -#ifdef HAVE_IMAGEVIEWER - case OZONE_ENTRIES_ICONS_TEXTURE_IMAGES: - return "images.png"; #endif case OZONE_ENTRIES_ICONS_TEXTURE_SETTING: return "setting.png"; @@ -2683,12 +2683,12 @@ static const char *ozone_entries_icon_texture_path(unsigned id) return "folder.png"; case OZONE_ENTRIES_ICONS_TEXTURE_ZIP: return "zip.png"; - case OZONE_ENTRIES_ICONS_TEXTURE_MUSIC: - return "music.png"; case OZONE_ENTRIES_ICONS_TEXTURE_FAVORITE: return "favorites-content.png"; case OZONE_ENTRIES_ICONS_TEXTURE_IMAGE: return "image.png"; + case OZONE_ENTRIES_ICONS_TEXTURE_MUSIC: + return "music.png"; case OZONE_ENTRIES_ICONS_TEXTURE_MOVIE: return "movie.png"; case OZONE_ENTRIES_ICONS_TEXTURE_CORE: @@ -3291,13 +3291,13 @@ static void ozone_draw_sidebar( MENU_ENUM_LABEL_VALUE_SETTINGS_TAB, MENU_ENUM_LABEL_VALUE_HISTORY_TAB, MENU_ENUM_LABEL_VALUE_FAVORITES_TAB, +#ifdef HAVE_IMAGEVIEWER + MENU_ENUM_LABEL_VALUE_IMAGES_TAB, +#endif MENU_ENUM_LABEL_VALUE_MUSIC_TAB, #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) MENU_ENUM_LABEL_VALUE_VIDEO_TAB, #endif -#ifdef HAVE_IMAGEVIEWER - MENU_ENUM_LABEL_VALUE_IMAGES_TAB, -#endif #ifdef HAVE_NETWORKING MENU_ENUM_LABEL_VALUE_NETPLAY_TAB, #endif @@ -3312,13 +3312,13 @@ static void ozone_draw_sidebar( OZONE_TAB_TEXTURE_SETTINGS, OZONE_TAB_TEXTURE_HISTORY, OZONE_TAB_TEXTURE_FAVORITES, +#ifdef HAVE_IMAGEVIEWER + OZONE_TAB_TEXTURE_IMAGE, +#endif OZONE_TAB_TEXTURE_MUSIC, #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) OZONE_TAB_TEXTURE_VIDEO, #endif -#ifdef HAVE_IMAGEVIEWER - OZONE_TAB_TEXTURE_IMAGE, -#endif #ifdef HAVE_NETWORKING OZONE_TAB_TEXTURE_NETWORK, #endif @@ -4605,13 +4605,13 @@ static void ozone_sidebar_goto(ozone_handle_t *ozone, size_t new_selection) MENU_ENUM_LABEL_SETTINGS_TAB, MENU_ENUM_LABEL_HISTORY_TAB, MENU_ENUM_LABEL_FAVORITES_TAB, +#ifdef HAVE_IMAGEVIEWER + MENU_ENUM_LABEL_IMAGES_TAB, +#endif MENU_ENUM_LABEL_MUSIC_TAB, #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) MENU_ENUM_LABEL_VIDEO_TAB, #endif -#ifdef HAVE_IMAGEVIEWER - MENU_ENUM_LABEL_IMAGES_TAB, -#endif #ifdef HAVE_NETWORKING MENU_ENUM_LABEL_NETPLAY_TAB, #endif @@ -4626,13 +4626,13 @@ static void ozone_sidebar_goto(ozone_handle_t *ozone, size_t new_selection) MENU_SETTINGS_TAB, MENU_HISTORY_TAB, MENU_FAVORITES_TAB, +#ifdef HAVE_IMAGEVIEWER + MENU_IMAGES_TAB, +#endif MENU_MUSIC_TAB, #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) MENU_VIDEO_TAB, #endif -#ifdef HAVE_IMAGEVIEWER - MENU_IMAGES_TAB, -#endif #ifdef HAVE_NETWORKING MENU_NETPLAY_TAB, #endif @@ -5898,6 +5898,16 @@ border_iterate: texture = ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_HISTORY]; else if (string_is_equal(entry.rich_label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB))) texture = ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_FAVORITES]; +#ifdef HAVE_IMAGEVIEWER + else if (string_is_equal(entry.rich_label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB))) + texture = ozone->icons_textures[OZONE_TAB_TEXTURE_IMAGE]; +#endif + else if (string_is_equal(entry.rich_label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB))) + texture = ozone->icons_textures[OZONE_TAB_TEXTURE_MUSIC]; +#if defined(HAVE_FFMPEG) || defined(HAVE_MPV) + else if (string_is_equal(entry.rich_label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_TAB))) + texture = ozone->icons_textures[OZONE_TAB_TEXTURE_VIDEO]; +#endif else if (i < ozone->horizontal_list.size) { ozone_node_t *sidebar_node = NULL; @@ -9485,9 +9495,9 @@ static void ozone_context_reset(void *data, bool is_threaded) "settings.png", /* SETTINGS_TAB */ "history.png", /* HISTORY_TAB */ "favorites.png", /* FAVORITES_TAB */ + "image.png", /* IMAGES_TAB */ "music.png", /* MUSIC_TAB */ "video.png", /* VIDEO_TAB */ - "image.png", /* IMAGES_TAB */ "netplay.png", /* NETPLAY_TAB */ "add.png", /* ADD_TAB */ "core.png", /* CONTENTLESS_CORES_TAB */ diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 43844ee3bc..9c3fee25bb 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -1,3 +1,4 @@ + /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis * Copyright (C) 2014-2017 - Jean-André Santoni @@ -120,6 +121,9 @@ enum XMB_TEXTURE_SETTINGS, XMB_TEXTURE_HISTORY, XMB_TEXTURE_FAVORITES, +#ifdef HAVE_IMAGEVIEWER + XMB_TEXTURE_IMAGES, +#endif XMB_TEXTURE_MUSICS, #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) XMB_TEXTURE_MOVIES, @@ -130,9 +134,6 @@ enum XMB_TEXTURE_ROOM, XMB_TEXTURE_ROOM_LAN, XMB_TEXTURE_ROOM_RELAY, -#endif -#ifdef HAVE_IMAGEVIEWER - XMB_TEXTURE_IMAGES, #endif XMB_TEXTURE_SETTING, XMB_TEXTURE_SUBSETTING, @@ -163,8 +164,8 @@ enum XMB_TEXTURE_ZIP, XMB_TEXTURE_FAVORITE, XMB_TEXTURE_ADD_FAVORITE, - XMB_TEXTURE_MUSIC, XMB_TEXTURE_IMAGE, + XMB_TEXTURE_MUSIC, XMB_TEXTURE_MOVIE, XMB_TEXTURE_CORE, XMB_TEXTURE_RDB, @@ -3378,12 +3379,12 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_GOTO_IMAGES: return xmb->textures.list[XMB_TEXTURE_IMAGES]; #endif + case MENU_ENUM_LABEL_GOTO_MUSIC: + return xmb->textures.list[XMB_TEXTURE_MUSICS]; #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) case MENU_ENUM_LABEL_GOTO_VIDEO: return xmb->textures.list[XMB_TEXTURE_MOVIES]; #endif - case MENU_ENUM_LABEL_GOTO_MUSIC: - return xmb->textures.list[XMB_TEXTURE_MUSICS]; case MENU_ENUM_LABEL_GOTO_EXPLORE: if (!string_is_equal(enum_path, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_EXPLORE))) return xmb->textures.list[XMB_TEXTURE_CURSOR]; @@ -3800,21 +3801,21 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, } else { - if (string_is_equal(xmb->title_name, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB))) - return xmb->textures.list[XMB_TEXTURE_MUSIC]; - else if (string_is_equal(xmb->title_name, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB))) + if (string_is_equal(xmb->title_name, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB))) return xmb->textures.list[XMB_TEXTURE_IMAGE]; + else if (string_is_equal(xmb->title_name, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB))) + return xmb->textures.list[XMB_TEXTURE_MUSIC]; else if (string_is_equal(xmb->title_name, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_TAB))) return xmb->textures.list[XMB_TEXTURE_MOVIE]; } } break; - case XMB_SYSTEM_TAB_MUSIC: - return xmb->textures.list[XMB_TEXTURE_MUSIC]; #ifdef HAVE_IMAGEVIEWER case XMB_SYSTEM_TAB_IMAGES: return xmb->textures.list[XMB_TEXTURE_IMAGE]; #endif + case XMB_SYSTEM_TAB_MUSIC: + return xmb->textures.list[XMB_TEXTURE_MUSIC]; #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) case XMB_SYSTEM_TAB_VIDEO: return xmb->textures.list[XMB_TEXTURE_MOVIE]; @@ -3832,11 +3833,11 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, return xmb->textures.list[XMB_TEXTURE_SHADER_OPTIONS]; case FILE_TYPE_CARCHIVE: return xmb->textures.list[XMB_TEXTURE_ZIP]; - case FILE_TYPE_MUSIC: - return xmb->textures.list[XMB_TEXTURE_MUSIC]; case FILE_TYPE_IMAGE: case FILE_TYPE_IMAGEVIEWER: return xmb->textures.list[XMB_TEXTURE_IMAGE]; + case FILE_TYPE_MUSIC: + return xmb->textures.list[XMB_TEXTURE_MUSIC]; case FILE_TYPE_MOVIE: return xmb->textures.list[XMB_TEXTURE_MOVIE]; case FILE_TYPE_CORE: @@ -5145,6 +5146,16 @@ static int xmb_draw_item( texture = xmb->textures.list[XMB_TEXTURE_HISTORY]; else if (string_is_equal(entry.rich_label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB))) texture = xmb->textures.list[XMB_TEXTURE_FAVORITES]; +#ifdef HAVE_IMAGEVIEWER + else if (string_is_equal(entry.rich_label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB))) + texture = xmb->textures.list[XMB_TEXTURE_IMAGES]; +#endif + else if (string_is_equal(entry.rich_label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB))) + texture = xmb->textures.list[XMB_TEXTURE_MUSICS]; +#if defined(HAVE_FFMPEG) || defined(HAVE_MPV) + else if (string_is_equal(entry.rich_label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_TAB))) + texture = xmb->textures.list[XMB_TEXTURE_MOVIES]; +#endif else if (i < xmb->horizontal_list.size) { xmb_node_t *sidebar_node = NULL; @@ -6114,15 +6125,15 @@ static const char *xmb_texture_path(unsigned id) return "favorites.png"; case XMB_TEXTURE_ADD_FAVORITE: return "add-favorite.png"; +#ifdef HAVE_IMAGEVIEWER + case XMB_TEXTURE_IMAGES: + return "images.png"; +#endif case XMB_TEXTURE_MUSICS: return "musics.png"; #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) case XMB_TEXTURE_MOVIES: return "movies.png"; -#endif -#ifdef HAVE_IMAGEVIEWER - case XMB_TEXTURE_IMAGES: - return "images.png"; #endif case XMB_TEXTURE_SETTING: return "setting.png"; @@ -6194,12 +6205,12 @@ static const char *xmb_texture_path(unsigned id) return "folder.png"; case XMB_TEXTURE_ZIP: return "zip.png"; - case XMB_TEXTURE_MUSIC: - return "music.png"; case XMB_TEXTURE_FAVORITE: return "favorites-content.png"; case XMB_TEXTURE_IMAGE: return "image.png"; + case XMB_TEXTURE_MUSIC: + return "music.png"; case XMB_TEXTURE_MOVIE: return "movie.png"; case XMB_TEXTURE_CORE: @@ -6453,6 +6464,12 @@ static bool xmb_context_reset_textures( xmb->favorites_tab_node.alpha = xmb->categories_active_alpha; xmb->favorites_tab_node.zoom = xmb->categories_active_zoom; +#ifdef HAVE_IMAGEVIEWER + xmb->images_tab_node.icon = xmb->textures.list[XMB_TEXTURE_IMAGES]; + xmb->images_tab_node.alpha = xmb->categories_active_alpha; + xmb->images_tab_node.zoom = xmb->categories_active_zoom; +#endif + xmb->music_tab_node.icon = xmb->textures.list[XMB_TEXTURE_MUSICS]; xmb->music_tab_node.alpha = xmb->categories_active_alpha; xmb->music_tab_node.zoom = xmb->categories_active_zoom; @@ -6463,12 +6480,6 @@ static bool xmb_context_reset_textures( xmb->video_tab_node.zoom = xmb->categories_active_zoom; #endif -#ifdef HAVE_IMAGEVIEWER - xmb->images_tab_node.icon = xmb->textures.list[XMB_TEXTURE_IMAGES]; - xmb->images_tab_node.alpha = xmb->categories_active_alpha; - xmb->images_tab_node.zoom = xmb->categories_active_zoom; -#endif - xmb->add_tab_node.icon = xmb->textures.list[XMB_TEXTURE_ADD]; xmb->add_tab_node.alpha = xmb->categories_active_alpha; xmb->add_tab_node.zoom = xmb->categories_active_zoom; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 1d1f98a4a1..022406b13f 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -4826,6 +4826,37 @@ static unsigned menu_displaylist_parse_playlist_manager_list( MENU_SETTING_ACTION, 0, 0, NULL)) count++; +#ifdef HAVE_IMAGEVIEWER + /* Add image history */ + if (playlist_size(g_defaults.image_history) > 0) + if (menu_entries_append(list, + playlist_get_conf_path(g_defaults.image_history), + "", + MENU_ENUM_LABEL_PLAYLIST_MANAGER_SETTINGS, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; +#endif + + /* Add music history */ + if (playlist_size(g_defaults.music_history) > 0) + if (menu_entries_append(list, + playlist_get_conf_path(g_defaults.music_history), + "", + MENU_ENUM_LABEL_PLAYLIST_MANAGER_SETTINGS, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + +#if defined(HAVE_FFMPEG) || defined(HAVE_MPV) + /* Add video history */ + if (playlist_size(g_defaults.video_history) > 0) + if (menu_entries_append(list, + playlist_get_conf_path(g_defaults.video_history), + "", + MENU_ENUM_LABEL_PLAYLIST_MANAGER_SETTINGS, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; +#endif + return count; } @@ -4833,7 +4864,8 @@ static bool menu_displaylist_parse_playlist_manager_settings( menu_handle_t *menu, settings_t *settings, file_list_t *list, const char *playlist_path) { - bool is_content_history; + bool is_content_history = false; + bool is_media_history = false; enum msg_hash_enums right_thumbnail_label_value; enum msg_hash_enums left_thumbnail_label_value; const char *playlist_file = NULL; @@ -4863,6 +4895,16 @@ static bool menu_displaylist_parse_playlist_manager_settings( is_content_history = string_ends_with_size( playlist_path, "_history.lpl", strlen(playlist_path), STRLEN_CONST("_history.lpl")); + is_media_history = + string_ends_with_size( + playlist_path, "_image_history.lpl", strlen(playlist_path), + STRLEN_CONST("_image_history.lpl")) + || string_ends_with_size( + playlist_path, "_music_history.lpl", strlen(playlist_path), + STRLEN_CONST("_music_history.lpl")) + || string_ends_with_size( + playlist_path, "_video_history.lpl", strlen(playlist_path), + STRLEN_CONST("_video_history.lpl")); /* Label display mode */ menu_entries_append(list, @@ -4898,19 +4940,22 @@ static bool menu_displaylist_parse_playlist_manager_settings( } #endif - /* > Right thumbnail mode */ - menu_entries_append(list, - msg_hash_to_str(right_thumbnail_label_value), - msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_RIGHT_THUMBNAIL_MODE), - MENU_ENUM_LABEL_PLAYLIST_MANAGER_RIGHT_THUMBNAIL_MODE, - MENU_SETTING_PLAYLIST_MANAGER_RIGHT_THUMBNAIL_MODE, 0, 0, NULL); + if (!is_media_history) + { + /* > Right thumbnail mode */ + menu_entries_append(list, + msg_hash_to_str(right_thumbnail_label_value), + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_RIGHT_THUMBNAIL_MODE), + MENU_ENUM_LABEL_PLAYLIST_MANAGER_RIGHT_THUMBNAIL_MODE, + MENU_SETTING_PLAYLIST_MANAGER_RIGHT_THUMBNAIL_MODE, 0, 0, NULL); - /* > Left thumbnail mode */ - menu_entries_append(list, - msg_hash_to_str(left_thumbnail_label_value), - msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_LEFT_THUMBNAIL_MODE), - MENU_ENUM_LABEL_PLAYLIST_MANAGER_LEFT_THUMBNAIL_MODE, - MENU_SETTING_PLAYLIST_MANAGER_LEFT_THUMBNAIL_MODE, 0, 0, NULL); + /* > Left thumbnail mode */ + menu_entries_append(list, + msg_hash_to_str(left_thumbnail_label_value), + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_LEFT_THUMBNAIL_MODE), + MENU_ENUM_LABEL_PLAYLIST_MANAGER_LEFT_THUMBNAIL_MODE, + MENU_SETTING_PLAYLIST_MANAGER_LEFT_THUMBNAIL_MODE, 0, 0, NULL); + } /* Sorting mode * > Not relevant for history playlists */ From 3b44efe12285aa86d9940c6c8552768498aac6e5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 27 May 2025 00:16:23 +0000 Subject: [PATCH 128/175] Fetch translations from Crowdin --- intl/msg_hash_it.h | 32 ++++++++++++++++++++++++++++++++ intl/progress.h | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index bf9471836a..713a421d7d 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -3508,18 +3508,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_INFO_BUTTON, "Disabilita Pulsante Info" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_INFO_BUTTON, + "Impedisci la funzione info menu." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_SEARCH_BUTTON, "Disabilita Pulsante Ricerca" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_SEARCH_BUTTON, + "Impedisci la funzione di ricerca del menu." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, "Disabilita l'analogico sinistro nel menu" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_LEFT_ANALOG_IN_MENU, + "Impedisci il menu sinistro di ingresso analogico." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, "Disabilita l'analogico destro nel menu" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DISABLE_RIGHT_ANALOG_IN_MENU, + "Impedisci il menu l'entrata della levetta analogica destra. La levetta analogiva destra cicla le miniature nelle playlist." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu: Scambia pulsanti OK e Annulla" @@ -4829,6 +4845,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, "Aprire l'esplorazione file all'ultima posizione usata durante il caricamento del contenuto dalla cartella di avvio. Nota: la posizione sarà ripristinata a quella predefinita dopo il riavvio di RetroArch." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SUGGEST_ALWAYS, + "Suggerisci Sempre Nucleo" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SUGGEST_ALWAYS, + "Suggerisci i nuclei disponibili anche quando un nucleo è già caricato." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, "Usa Lettore Multimediale Integrato" @@ -13965,6 +13989,10 @@ MSG_HASH( MSG_REWINDING, "Riavvolgimento in corso." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Capacità di riserva insufficiente." + ) MSG_HASH( MSG_REWIND_UNSUPPORTED, "Rewind non disponibile perché questo nucleo manca il salvataggio di stato serializzato." @@ -14553,6 +14581,10 @@ MSG_HASH( MSG_CHEEVOS_UNSUPPORTED_COUNT, "%d non supportato" ) +MSG_HASH( + MSG_CHEEVOS_UNSUPPORTED_WARNING, + "Obiettivi non supportati rilevati. Si prega di provare un nucleo diverso o aggiornare RetroArch." +) MSG_HASH( MSG_CHEEVOS_RICH_PRESENCE_SPECTATING, "Osservazione %s" diff --git a/intl/progress.h b/intl/progress.h index 0e95437216..9183e807eb 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -83,7 +83,7 @@ #define LANGUAGE_PROGRESS_INDONESIAN_APPROVED 0 /* Italian */ -#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_ITALIAN_APPROVED 0 /* Japanese */ From 7d3740d4c0d7f13b3c475a58ef15c39df3acf871 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Tue, 27 May 2025 04:25:16 +0300 Subject: [PATCH 129/175] Allow Start button to quick manage media playlists (#17948) --- menu/cbs/menu_cbs_label.c | 5 ++ menu/cbs/menu_cbs_ok.c | 8 ++- menu/cbs/menu_cbs_start.c | 7 +++ menu/drivers/ozone.c | 94 +++++++++++++++++++++++++++++++---- menu/menu_displaylist.c | 50 +++++++++++-------- tasks/task_playlist_manager.c | 22 +++++++- 6 files changed, 153 insertions(+), 33 deletions(-) diff --git a/menu/cbs/menu_cbs_label.c b/menu/cbs/menu_cbs_label.c index 17844f38aa..e5a745b5f0 100644 --- a/menu/cbs/menu_cbs_label.c +++ b/menu/cbs/menu_cbs_label.c @@ -112,6 +112,11 @@ int menu_cbs_init_bind_label(menu_file_list_cbs_t *cbs, { switch (cbs->enum_idx) { + case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: + case MENU_ENUM_LABEL_GOTO_FAVORITES: + case MENU_ENUM_LABEL_GOTO_IMAGES: + case MENU_ENUM_LABEL_GOTO_MUSIC: + case MENU_ENUM_LABEL_GOTO_VIDEO: case MENU_ENUM_LABEL_PLAYLIST_COLLECTION_ENTRY: BIND_ACTION_LABEL(cbs, action_bind_label_playlist_collection_entry); break; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 74359f8ffe..c21ba3f6fd 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -8634,6 +8634,7 @@ static int action_ok_delete_playlist(const char *path, { playlist_t *playlist = playlist_get_cached(); struct menu_state *menu_st = menu_state_get_ptr(); + menu_entry_t entry; if (!playlist) return -1; @@ -8646,7 +8647,12 @@ static int action_ok_delete_playlist(const char *path, menu_st->driver_ctx->environ_cb(MENU_ENVIRON_RESET_HORIZONTAL_LIST, NULL, menu_st->userdata); - return action_cancel_pop_default(NULL, NULL, 0, 0); + MENU_ENTRY_INITIALIZE(entry); + menu_entry_get(&entry, 0, 0, NULL, false); + + /* Ozone sidebar quick manager needs 'MENU_ACTION_CANCEL' instead + * of 'action_cancel_pop_default' to return back to sidebar cleanly */ + return menu_entry_action(&entry, 0, MENU_ACTION_CANCEL); } #ifdef HAVE_NETWORKING diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index 3a07faa3b2..aee83b8cbe 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -897,6 +897,13 @@ static int menu_cbs_init_bind_start_compare_label(menu_file_list_cbs_t *cbs) case MENU_ENUM_LABEL_MENU_WALLPAPER: BIND_ACTION_START(cbs, action_start_menu_wallpaper); break; + case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: + case MENU_ENUM_LABEL_GOTO_FAVORITES: + case MENU_ENUM_LABEL_GOTO_IMAGES: + case MENU_ENUM_LABEL_GOTO_MUSIC: + case MENU_ENUM_LABEL_GOTO_VIDEO: + BIND_ACTION_START(cbs, action_ok_push_playlist_manager_settings); + break; default: return -1; } diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index 6d21595d02..25ade5cfcd 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -3273,6 +3273,28 @@ static void ozone_draw_cursor( alpha); } +const enum msg_hash_enums ozone_system_tabs_label[OZONE_SYSTEM_TAB_LAST] = { + MENU_ENUM_LABEL_MAIN_MENU, + MENU_ENUM_LABEL_SETTINGS_TAB, + MENU_ENUM_LABEL_HISTORY_TAB, + MENU_ENUM_LABEL_FAVORITES_TAB, +#ifdef HAVE_IMAGEVIEWER + MENU_ENUM_LABEL_IMAGES_TAB, +#endif + MENU_ENUM_LABEL_MUSIC_TAB, +#if defined(HAVE_FFMPEG) || defined(HAVE_MPV) + MENU_ENUM_LABEL_VIDEO_TAB, +#endif +#ifdef HAVE_NETWORKING + MENU_ENUM_LABEL_NETPLAY_TAB, +#endif + MENU_ENUM_LABEL_ADD_TAB, + MENU_ENUM_LABEL_CONTENTLESS_CORES_TAB, +#ifdef HAVE_LIBRETRODB + MENU_ENUM_LABEL_EXPLORE_TAB +#endif +}; + static void ozone_draw_sidebar( ozone_handle_t *ozone, gfx_display_t *p_disp, @@ -7678,7 +7700,11 @@ static void ozone_set_thumbnail_content(void *data, const char *s) break; default: - ozone->flags |= OZONE_FLAG_WANT_THUMBNAIL_BAR; + if ( string_ends_with(playlist_get_conf_path(pl), FILE_PATH_CONTENT_MUSIC_HISTORY) + || string_ends_with(playlist_get_conf_path(pl), FILE_PATH_CONTENT_VIDEO_HISTORY)) + ozone->flags &= ~OZONE_FLAG_WANT_THUMBNAIL_BAR; + else + ozone->flags |= OZONE_FLAG_WANT_THUMBNAIL_BAR; break; } } @@ -7931,7 +7957,21 @@ static bool ozone_manage_available(ozone_handle_t *ozone, size_t current_selecti switch (last_entry.type) { case FILE_TYPE_PLAYLIST_COLLECTION: + case FILE_TYPE_RPL_ENTRY: return true; + default: + break; + } + switch (last_entry.enum_idx) + { + case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: + case MENU_ENUM_LABEL_GOTO_FAVORITES: + case MENU_ENUM_LABEL_GOTO_IMAGES: + case MENU_ENUM_LABEL_GOTO_MUSIC: + case MENU_ENUM_LABEL_GOTO_VIDEO: + return true; + default: + break; } return false; } @@ -8131,23 +8171,59 @@ static enum menu_action ozone_parse_menu_entry_action( if (ozone->flags & OZONE_FLAG_CURSOR_IN_SIDEBAR) { char playlist_path[PATH_MAX_LENGTH]; - + ssize_t list_selection; /* If cursor is active, ensure we target * an on screen category */ size_t tab_selection = (ozone->flags & OZONE_FLAG_CURSOR_MODE) ? ozone_get_onscreen_category_selection(ozone) : ozone->categories_selection_ptr; - if (tab_selection < (size_t)(ozone->system_tab_end + 1)) + if (!ozone_manage_available(ozone, ozone->selection)) break; - new_selection = tab_selection - ozone->system_tab_end - 1; - new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; + list_selection = tab_selection - ozone->system_tab_end - 1; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; - fill_pathname_join(playlist_path, - settings->paths.directory_playlist, - ozone->horizontal_list.list[new_selection].path, - sizeof(playlist_path)); + if (list_selection < 0) + { + enum msg_hash_enums value_idx = ozone_system_tabs_label[tab_selection]; + const char *tab_title; + + switch (value_idx) + { + case MENU_ENUM_LABEL_HISTORY_TAB: + tab_title = FILE_PATH_CONTENT_HISTORY; + break; + case MENU_ENUM_LABEL_FAVORITES_TAB: + tab_title = FILE_PATH_CONTENT_FAVORITES; + break; + case MENU_ENUM_LABEL_IMAGES_TAB: + tab_title = FILE_PATH_CONTENT_IMAGE_HISTORY; + break; + case MENU_ENUM_LABEL_MUSIC_TAB: + tab_title = FILE_PATH_CONTENT_MUSIC_HISTORY; + break; + case MENU_ENUM_LABEL_VIDEO_TAB: + tab_title = FILE_PATH_CONTENT_VIDEO_HISTORY; + break; + default: + tab_title = ""; + break; + } + + if (string_is_empty(tab_title)) + break; + + fill_pathname_join(playlist_path, + "", + tab_title, + sizeof(playlist_path)); + } + else + fill_pathname_join(playlist_path, + settings->paths.directory_playlist, + ozone->horizontal_list.list[list_selection].path, + sizeof(playlist_path)); generic_action_ok_displaylist_push( playlist_path, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 022406b13f..7217d34450 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -4321,7 +4321,7 @@ static unsigned menu_displaylist_parse_playlists( { if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + FILE_PATH_CONTENT_FAVORITES, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4329,7 +4329,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_history) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY), + FILE_PATH_CONTENT_HISTORY, msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4339,7 +4339,7 @@ static unsigned menu_displaylist_parse_playlists( { if (settings->bools.menu_content_show_history) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY), + FILE_PATH_CONTENT_HISTORY, msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4347,7 +4347,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + FILE_PATH_CONTENT_FAVORITES, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4357,7 +4357,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_images) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_IMAGES), + FILE_PATH_CONTENT_IMAGE_HISTORY, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_IMAGES), MENU_ENUM_LABEL_GOTO_IMAGES, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4365,7 +4365,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_music) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_MUSIC), + FILE_PATH_CONTENT_MUSIC_HISTORY, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_MUSIC), MENU_ENUM_LABEL_GOTO_MUSIC, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4374,7 +4374,7 @@ static unsigned menu_displaylist_parse_playlists( #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) if (settings->bools.menu_content_show_video) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_VIDEO), + FILE_PATH_CONTENT_VIDEO_HISTORY, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_VIDEO), MENU_ENUM_LABEL_GOTO_VIDEO, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4971,18 +4971,20 @@ static bool menu_displaylist_parse_playlist_manager_settings( * (i.e. it is not relevant for history/favourites) */ if ( !is_content_history && !string_is_equal(playlist_file, FILE_PATH_CONTENT_FAVORITES)) + { menu_entries_append(list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_DEFAULT_CORE), msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_DEFAULT_CORE), MENU_ENUM_LABEL_PLAYLIST_MANAGER_DEFAULT_CORE, MENU_SETTING_PLAYLIST_MANAGER_DEFAULT_CORE, 0, 0, NULL); - /* Reset core associations */ - menu_entries_append(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_RESET_CORES), - msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES), - MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES, - MENU_SETTING_ACTION_PLAYLIST_MANAGER_RESET_CORES, 0, 0, NULL); + /* Reset core associations */ + menu_entries_append(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_RESET_CORES), + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES), + MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES, + MENU_SETTING_ACTION_PLAYLIST_MANAGER_RESET_CORES, 0, 0, NULL); + } /* Refresh playlist */ if (playlist_scan_refresh_enabled(playlist)) @@ -13704,15 +13706,18 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, &ret); if (count == 0) + { if (menu_entries_append(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE), MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE, MENU_INFO_MESSAGE, 0, 0, NULL)) count++; + info->flags &= ~MD_FLAG_NEED_PUSH_NO_PLAYLIST_ENTRIES; + } } - ret = 0; + ret = 0; /* Playlists themselves are sorted * > Display lists generated from playlists * must never be sorted */ @@ -13744,7 +13749,6 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, MENU_INFO_MESSAGE, 0, 0, NULL)) count++; info->flags &= ~MD_FLAG_NEED_PUSH_NO_PLAYLIST_ENTRIES; - ret = 0; } ret = 0; @@ -15208,29 +15212,33 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, { if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + FILE_PATH_CONTENT_FAVORITES, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) count++; if (settings->bools.menu_content_show_history) - if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(info->list, + if (menu_entries_append(info->list, + FILE_PATH_CONTENT_HISTORY, + msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, - PARSE_ACTION, false) == 0) + MENU_SETTING_ACTION, 0, 0, NULL)) count++; } else { if (settings->bools.menu_content_show_history) - if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(info->list, + if (menu_entries_append(info->list, + FILE_PATH_CONTENT_HISTORY, + msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, - PARSE_ACTION, false) == 0) + MENU_SETTING_ACTION, 0, 0, NULL)) count++; if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + FILE_PATH_CONTENT_FAVORITES, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) diff --git a/tasks/task_playlist_manager.c b/tasks/task_playlist_manager.c index d26933a8ed..0cfb1cfbd7 100644 --- a/tasks/task_playlist_manager.c +++ b/tasks/task_playlist_manager.c @@ -661,11 +661,29 @@ static void task_pl_manager_clean_playlist_handler(retro_task_t *task) playlist_write_file(pl_manager->playlist); /* Update progress display */ task_free_title(task); + _len = strlcpy(task_title, msg_hash_to_str(MSG_PLAYLIST_MANAGER_PLAYLIST_CLEANED), sizeof(task_title)); - strlcpy(task_title + _len, pl_manager->playlist_name, - sizeof(task_title) - _len); + + if (string_starts_with(FILE_PATH_CONTENT_FAVORITES, pl_manager->playlist_name)) + strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB), + sizeof(task_title) - _len); + else if (string_starts_with(FILE_PATH_CONTENT_HISTORY, pl_manager->playlist_name)) + strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HISTORY_TAB), + sizeof(task_title) - _len); + else if (string_starts_with(FILE_PATH_CONTENT_IMAGE_HISTORY, pl_manager->playlist_name)) + strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB), + sizeof(task_title) - _len); + else if (string_starts_with(FILE_PATH_CONTENT_MUSIC_HISTORY, pl_manager->playlist_name)) + strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB), + sizeof(task_title) - _len); + else if (string_starts_with(FILE_PATH_CONTENT_VIDEO_HISTORY, pl_manager->playlist_name)) + strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_TAB), + sizeof(task_title) - _len); + else + strlcpy(task_title + _len, pl_manager->playlist_name, + sizeof(task_title) - _len); task_set_title(task, strdup(task_title)); } From f877adb5d92fde364003b34780a727df237b5af4 Mon Sep 17 00:00:00 2001 From: libretroadmin Date: Tue, 27 May 2025 12:39:52 +0200 Subject: [PATCH 130/175] Revert "Allow Start button to quick manage media playlists (#17948)" This reverts commit 7d3740d4c0d7f13b3c475a58ef15c39df3acf871. --- menu/cbs/menu_cbs_label.c | 5 -- menu/cbs/menu_cbs_ok.c | 8 +-- menu/cbs/menu_cbs_start.c | 7 --- menu/drivers/ozone.c | 94 ++++------------------------------- menu/menu_displaylist.c | 50 ++++++++----------- tasks/task_playlist_manager.c | 22 +------- 6 files changed, 33 insertions(+), 153 deletions(-) diff --git a/menu/cbs/menu_cbs_label.c b/menu/cbs/menu_cbs_label.c index e5a745b5f0..17844f38aa 100644 --- a/menu/cbs/menu_cbs_label.c +++ b/menu/cbs/menu_cbs_label.c @@ -112,11 +112,6 @@ int menu_cbs_init_bind_label(menu_file_list_cbs_t *cbs, { switch (cbs->enum_idx) { - case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: - case MENU_ENUM_LABEL_GOTO_FAVORITES: - case MENU_ENUM_LABEL_GOTO_IMAGES: - case MENU_ENUM_LABEL_GOTO_MUSIC: - case MENU_ENUM_LABEL_GOTO_VIDEO: case MENU_ENUM_LABEL_PLAYLIST_COLLECTION_ENTRY: BIND_ACTION_LABEL(cbs, action_bind_label_playlist_collection_entry); break; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index c21ba3f6fd..74359f8ffe 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -8634,7 +8634,6 @@ static int action_ok_delete_playlist(const char *path, { playlist_t *playlist = playlist_get_cached(); struct menu_state *menu_st = menu_state_get_ptr(); - menu_entry_t entry; if (!playlist) return -1; @@ -8647,12 +8646,7 @@ static int action_ok_delete_playlist(const char *path, menu_st->driver_ctx->environ_cb(MENU_ENVIRON_RESET_HORIZONTAL_LIST, NULL, menu_st->userdata); - MENU_ENTRY_INITIALIZE(entry); - menu_entry_get(&entry, 0, 0, NULL, false); - - /* Ozone sidebar quick manager needs 'MENU_ACTION_CANCEL' instead - * of 'action_cancel_pop_default' to return back to sidebar cleanly */ - return menu_entry_action(&entry, 0, MENU_ACTION_CANCEL); + return action_cancel_pop_default(NULL, NULL, 0, 0); } #ifdef HAVE_NETWORKING diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index aee83b8cbe..3a07faa3b2 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -897,13 +897,6 @@ static int menu_cbs_init_bind_start_compare_label(menu_file_list_cbs_t *cbs) case MENU_ENUM_LABEL_MENU_WALLPAPER: BIND_ACTION_START(cbs, action_start_menu_wallpaper); break; - case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: - case MENU_ENUM_LABEL_GOTO_FAVORITES: - case MENU_ENUM_LABEL_GOTO_IMAGES: - case MENU_ENUM_LABEL_GOTO_MUSIC: - case MENU_ENUM_LABEL_GOTO_VIDEO: - BIND_ACTION_START(cbs, action_ok_push_playlist_manager_settings); - break; default: return -1; } diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index 25ade5cfcd..6d21595d02 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -3273,28 +3273,6 @@ static void ozone_draw_cursor( alpha); } -const enum msg_hash_enums ozone_system_tabs_label[OZONE_SYSTEM_TAB_LAST] = { - MENU_ENUM_LABEL_MAIN_MENU, - MENU_ENUM_LABEL_SETTINGS_TAB, - MENU_ENUM_LABEL_HISTORY_TAB, - MENU_ENUM_LABEL_FAVORITES_TAB, -#ifdef HAVE_IMAGEVIEWER - MENU_ENUM_LABEL_IMAGES_TAB, -#endif - MENU_ENUM_LABEL_MUSIC_TAB, -#if defined(HAVE_FFMPEG) || defined(HAVE_MPV) - MENU_ENUM_LABEL_VIDEO_TAB, -#endif -#ifdef HAVE_NETWORKING - MENU_ENUM_LABEL_NETPLAY_TAB, -#endif - MENU_ENUM_LABEL_ADD_TAB, - MENU_ENUM_LABEL_CONTENTLESS_CORES_TAB, -#ifdef HAVE_LIBRETRODB - MENU_ENUM_LABEL_EXPLORE_TAB -#endif -}; - static void ozone_draw_sidebar( ozone_handle_t *ozone, gfx_display_t *p_disp, @@ -7700,11 +7678,7 @@ static void ozone_set_thumbnail_content(void *data, const char *s) break; default: - if ( string_ends_with(playlist_get_conf_path(pl), FILE_PATH_CONTENT_MUSIC_HISTORY) - || string_ends_with(playlist_get_conf_path(pl), FILE_PATH_CONTENT_VIDEO_HISTORY)) - ozone->flags &= ~OZONE_FLAG_WANT_THUMBNAIL_BAR; - else - ozone->flags |= OZONE_FLAG_WANT_THUMBNAIL_BAR; + ozone->flags |= OZONE_FLAG_WANT_THUMBNAIL_BAR; break; } } @@ -7957,21 +7931,7 @@ static bool ozone_manage_available(ozone_handle_t *ozone, size_t current_selecti switch (last_entry.type) { case FILE_TYPE_PLAYLIST_COLLECTION: - case FILE_TYPE_RPL_ENTRY: return true; - default: - break; - } - switch (last_entry.enum_idx) - { - case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: - case MENU_ENUM_LABEL_GOTO_FAVORITES: - case MENU_ENUM_LABEL_GOTO_IMAGES: - case MENU_ENUM_LABEL_GOTO_MUSIC: - case MENU_ENUM_LABEL_GOTO_VIDEO: - return true; - default: - break; } return false; } @@ -8171,59 +8131,23 @@ static enum menu_action ozone_parse_menu_entry_action( if (ozone->flags & OZONE_FLAG_CURSOR_IN_SIDEBAR) { char playlist_path[PATH_MAX_LENGTH]; - ssize_t list_selection; + /* If cursor is active, ensure we target * an on screen category */ size_t tab_selection = (ozone->flags & OZONE_FLAG_CURSOR_MODE) ? ozone_get_onscreen_category_selection(ozone) : ozone->categories_selection_ptr; - if (!ozone_manage_available(ozone, ozone->selection)) + if (tab_selection < (size_t)(ozone->system_tab_end + 1)) break; - list_selection = tab_selection - ozone->system_tab_end - 1; - new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; + new_selection = tab_selection - ozone->system_tab_end - 1; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; - if (list_selection < 0) - { - enum msg_hash_enums value_idx = ozone_system_tabs_label[tab_selection]; - const char *tab_title; - - switch (value_idx) - { - case MENU_ENUM_LABEL_HISTORY_TAB: - tab_title = FILE_PATH_CONTENT_HISTORY; - break; - case MENU_ENUM_LABEL_FAVORITES_TAB: - tab_title = FILE_PATH_CONTENT_FAVORITES; - break; - case MENU_ENUM_LABEL_IMAGES_TAB: - tab_title = FILE_PATH_CONTENT_IMAGE_HISTORY; - break; - case MENU_ENUM_LABEL_MUSIC_TAB: - tab_title = FILE_PATH_CONTENT_MUSIC_HISTORY; - break; - case MENU_ENUM_LABEL_VIDEO_TAB: - tab_title = FILE_PATH_CONTENT_VIDEO_HISTORY; - break; - default: - tab_title = ""; - break; - } - - if (string_is_empty(tab_title)) - break; - - fill_pathname_join(playlist_path, - "", - tab_title, - sizeof(playlist_path)); - } - else - fill_pathname_join(playlist_path, - settings->paths.directory_playlist, - ozone->horizontal_list.list[list_selection].path, - sizeof(playlist_path)); + fill_pathname_join(playlist_path, + settings->paths.directory_playlist, + ozone->horizontal_list.list[new_selection].path, + sizeof(playlist_path)); generic_action_ok_displaylist_push( playlist_path, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 7217d34450..022406b13f 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -4321,7 +4321,7 @@ static unsigned menu_displaylist_parse_playlists( { if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info_list, - FILE_PATH_CONTENT_FAVORITES, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4329,7 +4329,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_history) if (menu_entries_append(info_list, - FILE_PATH_CONTENT_HISTORY, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY), msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4339,7 +4339,7 @@ static unsigned menu_displaylist_parse_playlists( { if (settings->bools.menu_content_show_history) if (menu_entries_append(info_list, - FILE_PATH_CONTENT_HISTORY, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY), msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4347,7 +4347,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info_list, - FILE_PATH_CONTENT_FAVORITES, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4357,7 +4357,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_images) if (menu_entries_append(info_list, - FILE_PATH_CONTENT_IMAGE_HISTORY, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_IMAGES), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_IMAGES), MENU_ENUM_LABEL_GOTO_IMAGES, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4365,7 +4365,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_music) if (menu_entries_append(info_list, - FILE_PATH_CONTENT_MUSIC_HISTORY, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_MUSIC), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_MUSIC), MENU_ENUM_LABEL_GOTO_MUSIC, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4374,7 +4374,7 @@ static unsigned menu_displaylist_parse_playlists( #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) if (settings->bools.menu_content_show_video) if (menu_entries_append(info_list, - FILE_PATH_CONTENT_VIDEO_HISTORY, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_VIDEO), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_VIDEO), MENU_ENUM_LABEL_GOTO_VIDEO, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4971,20 +4971,18 @@ static bool menu_displaylist_parse_playlist_manager_settings( * (i.e. it is not relevant for history/favourites) */ if ( !is_content_history && !string_is_equal(playlist_file, FILE_PATH_CONTENT_FAVORITES)) - { menu_entries_append(list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_DEFAULT_CORE), msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_DEFAULT_CORE), MENU_ENUM_LABEL_PLAYLIST_MANAGER_DEFAULT_CORE, MENU_SETTING_PLAYLIST_MANAGER_DEFAULT_CORE, 0, 0, NULL); - /* Reset core associations */ - menu_entries_append(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_RESET_CORES), - msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES), - MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES, - MENU_SETTING_ACTION_PLAYLIST_MANAGER_RESET_CORES, 0, 0, NULL); - } + /* Reset core associations */ + menu_entries_append(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_RESET_CORES), + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES), + MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES, + MENU_SETTING_ACTION_PLAYLIST_MANAGER_RESET_CORES, 0, 0, NULL); /* Refresh playlist */ if (playlist_scan_refresh_enabled(playlist)) @@ -13706,18 +13704,15 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, &ret); if (count == 0) - { if (menu_entries_append(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE), MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE, MENU_INFO_MESSAGE, 0, 0, NULL)) count++; - info->flags &= ~MD_FLAG_NEED_PUSH_NO_PLAYLIST_ENTRIES; - } } - ret = 0; + ret = 0; /* Playlists themselves are sorted * > Display lists generated from playlists * must never be sorted */ @@ -13749,6 +13744,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, MENU_INFO_MESSAGE, 0, 0, NULL)) count++; info->flags &= ~MD_FLAG_NEED_PUSH_NO_PLAYLIST_ENTRIES; + ret = 0; } ret = 0; @@ -15212,33 +15208,29 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, { if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info->list, - FILE_PATH_CONTENT_FAVORITES, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) count++; if (settings->bools.menu_content_show_history) - if (menu_entries_append(info->list, - FILE_PATH_CONTENT_HISTORY, - msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(info->list, MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, - MENU_SETTING_ACTION, 0, 0, NULL)) + PARSE_ACTION, false) == 0) count++; } else { if (settings->bools.menu_content_show_history) - if (menu_entries_append(info->list, - FILE_PATH_CONTENT_HISTORY, - msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(info->list, MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, - MENU_SETTING_ACTION, 0, 0, NULL)) + PARSE_ACTION, false) == 0) count++; if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info->list, - FILE_PATH_CONTENT_FAVORITES, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) diff --git a/tasks/task_playlist_manager.c b/tasks/task_playlist_manager.c index 0cfb1cfbd7..d26933a8ed 100644 --- a/tasks/task_playlist_manager.c +++ b/tasks/task_playlist_manager.c @@ -661,29 +661,11 @@ static void task_pl_manager_clean_playlist_handler(retro_task_t *task) playlist_write_file(pl_manager->playlist); /* Update progress display */ task_free_title(task); - _len = strlcpy(task_title, msg_hash_to_str(MSG_PLAYLIST_MANAGER_PLAYLIST_CLEANED), sizeof(task_title)); - - if (string_starts_with(FILE_PATH_CONTENT_FAVORITES, pl_manager->playlist_name)) - strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB), - sizeof(task_title) - _len); - else if (string_starts_with(FILE_PATH_CONTENT_HISTORY, pl_manager->playlist_name)) - strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HISTORY_TAB), - sizeof(task_title) - _len); - else if (string_starts_with(FILE_PATH_CONTENT_IMAGE_HISTORY, pl_manager->playlist_name)) - strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB), - sizeof(task_title) - _len); - else if (string_starts_with(FILE_PATH_CONTENT_MUSIC_HISTORY, pl_manager->playlist_name)) - strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB), - sizeof(task_title) - _len); - else if (string_starts_with(FILE_PATH_CONTENT_VIDEO_HISTORY, pl_manager->playlist_name)) - strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_TAB), - sizeof(task_title) - _len); - else - strlcpy(task_title + _len, pl_manager->playlist_name, - sizeof(task_title) - _len); + strlcpy(task_title + _len, pl_manager->playlist_name, + sizeof(task_title) - _len); task_set_title(task, strdup(task_title)); } From 5cb15e1cd7ab6de40cc4311eb697031be7313ddb Mon Sep 17 00:00:00 2001 From: libretroadmin Date: Tue, 27 May 2025 12:40:32 +0200 Subject: [PATCH 131/175] Reapply "Allow Start button to quick manage media playlists (#17948)" This reverts commit f877adb5d92fde364003b34780a727df237b5af4. --- menu/cbs/menu_cbs_label.c | 5 ++ menu/cbs/menu_cbs_ok.c | 8 ++- menu/cbs/menu_cbs_start.c | 7 +++ menu/drivers/ozone.c | 94 +++++++++++++++++++++++++++++++---- menu/menu_displaylist.c | 50 +++++++++++-------- tasks/task_playlist_manager.c | 22 +++++++- 6 files changed, 153 insertions(+), 33 deletions(-) diff --git a/menu/cbs/menu_cbs_label.c b/menu/cbs/menu_cbs_label.c index 17844f38aa..e5a745b5f0 100644 --- a/menu/cbs/menu_cbs_label.c +++ b/menu/cbs/menu_cbs_label.c @@ -112,6 +112,11 @@ int menu_cbs_init_bind_label(menu_file_list_cbs_t *cbs, { switch (cbs->enum_idx) { + case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: + case MENU_ENUM_LABEL_GOTO_FAVORITES: + case MENU_ENUM_LABEL_GOTO_IMAGES: + case MENU_ENUM_LABEL_GOTO_MUSIC: + case MENU_ENUM_LABEL_GOTO_VIDEO: case MENU_ENUM_LABEL_PLAYLIST_COLLECTION_ENTRY: BIND_ACTION_LABEL(cbs, action_bind_label_playlist_collection_entry); break; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 74359f8ffe..c21ba3f6fd 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -8634,6 +8634,7 @@ static int action_ok_delete_playlist(const char *path, { playlist_t *playlist = playlist_get_cached(); struct menu_state *menu_st = menu_state_get_ptr(); + menu_entry_t entry; if (!playlist) return -1; @@ -8646,7 +8647,12 @@ static int action_ok_delete_playlist(const char *path, menu_st->driver_ctx->environ_cb(MENU_ENVIRON_RESET_HORIZONTAL_LIST, NULL, menu_st->userdata); - return action_cancel_pop_default(NULL, NULL, 0, 0); + MENU_ENTRY_INITIALIZE(entry); + menu_entry_get(&entry, 0, 0, NULL, false); + + /* Ozone sidebar quick manager needs 'MENU_ACTION_CANCEL' instead + * of 'action_cancel_pop_default' to return back to sidebar cleanly */ + return menu_entry_action(&entry, 0, MENU_ACTION_CANCEL); } #ifdef HAVE_NETWORKING diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index 3a07faa3b2..aee83b8cbe 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -897,6 +897,13 @@ static int menu_cbs_init_bind_start_compare_label(menu_file_list_cbs_t *cbs) case MENU_ENUM_LABEL_MENU_WALLPAPER: BIND_ACTION_START(cbs, action_start_menu_wallpaper); break; + case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: + case MENU_ENUM_LABEL_GOTO_FAVORITES: + case MENU_ENUM_LABEL_GOTO_IMAGES: + case MENU_ENUM_LABEL_GOTO_MUSIC: + case MENU_ENUM_LABEL_GOTO_VIDEO: + BIND_ACTION_START(cbs, action_ok_push_playlist_manager_settings); + break; default: return -1; } diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index 6d21595d02..25ade5cfcd 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -3273,6 +3273,28 @@ static void ozone_draw_cursor( alpha); } +const enum msg_hash_enums ozone_system_tabs_label[OZONE_SYSTEM_TAB_LAST] = { + MENU_ENUM_LABEL_MAIN_MENU, + MENU_ENUM_LABEL_SETTINGS_TAB, + MENU_ENUM_LABEL_HISTORY_TAB, + MENU_ENUM_LABEL_FAVORITES_TAB, +#ifdef HAVE_IMAGEVIEWER + MENU_ENUM_LABEL_IMAGES_TAB, +#endif + MENU_ENUM_LABEL_MUSIC_TAB, +#if defined(HAVE_FFMPEG) || defined(HAVE_MPV) + MENU_ENUM_LABEL_VIDEO_TAB, +#endif +#ifdef HAVE_NETWORKING + MENU_ENUM_LABEL_NETPLAY_TAB, +#endif + MENU_ENUM_LABEL_ADD_TAB, + MENU_ENUM_LABEL_CONTENTLESS_CORES_TAB, +#ifdef HAVE_LIBRETRODB + MENU_ENUM_LABEL_EXPLORE_TAB +#endif +}; + static void ozone_draw_sidebar( ozone_handle_t *ozone, gfx_display_t *p_disp, @@ -7678,7 +7700,11 @@ static void ozone_set_thumbnail_content(void *data, const char *s) break; default: - ozone->flags |= OZONE_FLAG_WANT_THUMBNAIL_BAR; + if ( string_ends_with(playlist_get_conf_path(pl), FILE_PATH_CONTENT_MUSIC_HISTORY) + || string_ends_with(playlist_get_conf_path(pl), FILE_PATH_CONTENT_VIDEO_HISTORY)) + ozone->flags &= ~OZONE_FLAG_WANT_THUMBNAIL_BAR; + else + ozone->flags |= OZONE_FLAG_WANT_THUMBNAIL_BAR; break; } } @@ -7931,7 +7957,21 @@ static bool ozone_manage_available(ozone_handle_t *ozone, size_t current_selecti switch (last_entry.type) { case FILE_TYPE_PLAYLIST_COLLECTION: + case FILE_TYPE_RPL_ENTRY: return true; + default: + break; + } + switch (last_entry.enum_idx) + { + case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: + case MENU_ENUM_LABEL_GOTO_FAVORITES: + case MENU_ENUM_LABEL_GOTO_IMAGES: + case MENU_ENUM_LABEL_GOTO_MUSIC: + case MENU_ENUM_LABEL_GOTO_VIDEO: + return true; + default: + break; } return false; } @@ -8131,23 +8171,59 @@ static enum menu_action ozone_parse_menu_entry_action( if (ozone->flags & OZONE_FLAG_CURSOR_IN_SIDEBAR) { char playlist_path[PATH_MAX_LENGTH]; - + ssize_t list_selection; /* If cursor is active, ensure we target * an on screen category */ size_t tab_selection = (ozone->flags & OZONE_FLAG_CURSOR_MODE) ? ozone_get_onscreen_category_selection(ozone) : ozone->categories_selection_ptr; - if (tab_selection < (size_t)(ozone->system_tab_end + 1)) + if (!ozone_manage_available(ozone, ozone->selection)) break; - new_selection = tab_selection - ozone->system_tab_end - 1; - new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; + list_selection = tab_selection - ozone->system_tab_end - 1; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; - fill_pathname_join(playlist_path, - settings->paths.directory_playlist, - ozone->horizontal_list.list[new_selection].path, - sizeof(playlist_path)); + if (list_selection < 0) + { + enum msg_hash_enums value_idx = ozone_system_tabs_label[tab_selection]; + const char *tab_title; + + switch (value_idx) + { + case MENU_ENUM_LABEL_HISTORY_TAB: + tab_title = FILE_PATH_CONTENT_HISTORY; + break; + case MENU_ENUM_LABEL_FAVORITES_TAB: + tab_title = FILE_PATH_CONTENT_FAVORITES; + break; + case MENU_ENUM_LABEL_IMAGES_TAB: + tab_title = FILE_PATH_CONTENT_IMAGE_HISTORY; + break; + case MENU_ENUM_LABEL_MUSIC_TAB: + tab_title = FILE_PATH_CONTENT_MUSIC_HISTORY; + break; + case MENU_ENUM_LABEL_VIDEO_TAB: + tab_title = FILE_PATH_CONTENT_VIDEO_HISTORY; + break; + default: + tab_title = ""; + break; + } + + if (string_is_empty(tab_title)) + break; + + fill_pathname_join(playlist_path, + "", + tab_title, + sizeof(playlist_path)); + } + else + fill_pathname_join(playlist_path, + settings->paths.directory_playlist, + ozone->horizontal_list.list[list_selection].path, + sizeof(playlist_path)); generic_action_ok_displaylist_push( playlist_path, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 022406b13f..7217d34450 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -4321,7 +4321,7 @@ static unsigned menu_displaylist_parse_playlists( { if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + FILE_PATH_CONTENT_FAVORITES, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4329,7 +4329,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_history) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY), + FILE_PATH_CONTENT_HISTORY, msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4339,7 +4339,7 @@ static unsigned menu_displaylist_parse_playlists( { if (settings->bools.menu_content_show_history) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY), + FILE_PATH_CONTENT_HISTORY, msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4347,7 +4347,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + FILE_PATH_CONTENT_FAVORITES, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4357,7 +4357,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_images) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_IMAGES), + FILE_PATH_CONTENT_IMAGE_HISTORY, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_IMAGES), MENU_ENUM_LABEL_GOTO_IMAGES, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4365,7 +4365,7 @@ static unsigned menu_displaylist_parse_playlists( if (settings->bools.menu_content_show_music) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_MUSIC), + FILE_PATH_CONTENT_MUSIC_HISTORY, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_MUSIC), MENU_ENUM_LABEL_GOTO_MUSIC, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4374,7 +4374,7 @@ static unsigned menu_displaylist_parse_playlists( #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) if (settings->bools.menu_content_show_video) if (menu_entries_append(info_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_VIDEO), + FILE_PATH_CONTENT_VIDEO_HISTORY, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_VIDEO), MENU_ENUM_LABEL_GOTO_VIDEO, MENU_SETTING_ACTION, 0, 0, NULL)) @@ -4971,18 +4971,20 @@ static bool menu_displaylist_parse_playlist_manager_settings( * (i.e. it is not relevant for history/favourites) */ if ( !is_content_history && !string_is_equal(playlist_file, FILE_PATH_CONTENT_FAVORITES)) + { menu_entries_append(list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_DEFAULT_CORE), msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_DEFAULT_CORE), MENU_ENUM_LABEL_PLAYLIST_MANAGER_DEFAULT_CORE, MENU_SETTING_PLAYLIST_MANAGER_DEFAULT_CORE, 0, 0, NULL); - /* Reset core associations */ - menu_entries_append(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_RESET_CORES), - msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES), - MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES, - MENU_SETTING_ACTION_PLAYLIST_MANAGER_RESET_CORES, 0, 0, NULL); + /* Reset core associations */ + menu_entries_append(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_MANAGER_RESET_CORES), + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES), + MENU_ENUM_LABEL_PLAYLIST_MANAGER_RESET_CORES, + MENU_SETTING_ACTION_PLAYLIST_MANAGER_RESET_CORES, 0, 0, NULL); + } /* Refresh playlist */ if (playlist_scan_refresh_enabled(playlist)) @@ -13704,15 +13706,18 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, &ret); if (count == 0) + { if (menu_entries_append(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE), MENU_ENUM_LABEL_NO_HISTORY_AVAILABLE, MENU_INFO_MESSAGE, 0, 0, NULL)) count++; + info->flags &= ~MD_FLAG_NEED_PUSH_NO_PLAYLIST_ENTRIES; + } } - ret = 0; + ret = 0; /* Playlists themselves are sorted * > Display lists generated from playlists * must never be sorted */ @@ -13744,7 +13749,6 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, MENU_INFO_MESSAGE, 0, 0, NULL)) count++; info->flags &= ~MD_FLAG_NEED_PUSH_NO_PLAYLIST_ENTRIES; - ret = 0; } ret = 0; @@ -15208,29 +15212,33 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, { if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + FILE_PATH_CONTENT_FAVORITES, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) count++; if (settings->bools.menu_content_show_history) - if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(info->list, + if (menu_entries_append(info->list, + FILE_PATH_CONTENT_HISTORY, + msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, - PARSE_ACTION, false) == 0) + MENU_SETTING_ACTION, 0, 0, NULL)) count++; } else { if (settings->bools.menu_content_show_history) - if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(info->list, + if (menu_entries_append(info->list, + FILE_PATH_CONTENT_HISTORY, + msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY), MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, - PARSE_ACTION, false) == 0) + MENU_SETTING_ACTION, 0, 0, NULL)) count++; if (settings->bools.menu_content_show_favorites) if (menu_entries_append(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), + FILE_PATH_CONTENT_FAVORITES, msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0, NULL)) diff --git a/tasks/task_playlist_manager.c b/tasks/task_playlist_manager.c index d26933a8ed..0cfb1cfbd7 100644 --- a/tasks/task_playlist_manager.c +++ b/tasks/task_playlist_manager.c @@ -661,11 +661,29 @@ static void task_pl_manager_clean_playlist_handler(retro_task_t *task) playlist_write_file(pl_manager->playlist); /* Update progress display */ task_free_title(task); + _len = strlcpy(task_title, msg_hash_to_str(MSG_PLAYLIST_MANAGER_PLAYLIST_CLEANED), sizeof(task_title)); - strlcpy(task_title + _len, pl_manager->playlist_name, - sizeof(task_title) - _len); + + if (string_starts_with(FILE_PATH_CONTENT_FAVORITES, pl_manager->playlist_name)) + strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB), + sizeof(task_title) - _len); + else if (string_starts_with(FILE_PATH_CONTENT_HISTORY, pl_manager->playlist_name)) + strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HISTORY_TAB), + sizeof(task_title) - _len); + else if (string_starts_with(FILE_PATH_CONTENT_IMAGE_HISTORY, pl_manager->playlist_name)) + strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB), + sizeof(task_title) - _len); + else if (string_starts_with(FILE_PATH_CONTENT_MUSIC_HISTORY, pl_manager->playlist_name)) + strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB), + sizeof(task_title) - _len); + else if (string_starts_with(FILE_PATH_CONTENT_VIDEO_HISTORY, pl_manager->playlist_name)) + strlcpy(task_title + _len, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_TAB), + sizeof(task_title) - _len); + else + strlcpy(task_title + _len, pl_manager->playlist_name, + sizeof(task_title) - _len); task_set_title(task, strdup(task_title)); } From 4529d06a5ab7a6cf1bc663304718657b90b96543 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Tue, 27 May 2025 14:01:09 +0300 Subject: [PATCH 132/175] Fix menu usage when OK/Cancel has mouse binds (#17950) --- menu/menu_driver.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 2efb5771c0..9604c17b36 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -5300,7 +5300,11 @@ unsigned menu_event( memcpy(pointer_hw_state, &touchscreen_hw_state, sizeof(menu_input_pointer_hw_state_t)); if (pointer_hw_state->flags & MENU_INP_PTR_FLG_ACTIVE) + { menu_st->input_last_time_us = menu_st->current_time_us; + /* Prevent double trigger when OK/Cancel has mouse binds */ + menu_st->input_driver_flushing_input = 1; + } } /* Populate menu_input_state From 0f664c739b2a752b2815e869e00b5da7589ae560 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Tue, 27 May 2025 16:48:03 +0300 Subject: [PATCH 133/175] Ignore menu mouse startup position before moving (#17951) --- menu/menu_driver.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 9604c17b36..d9880733bf 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -1862,6 +1862,8 @@ static void menu_input_get_mouse_hw_state( rarch_joypad_info_t joypad_info; static int16_t last_x = 0; static int16_t last_y = 0; + static int16_t initial_x = 0; + static int16_t initial_y = 0; bool is_select_pressed = false; bool is_cancel_pressed = false; static bool last_select_pressed = false; @@ -1920,6 +1922,16 @@ static void menu_input_get_mouse_hw_state( hw_state->flags |= MENU_INP_PTR_FLG_ACTIVE; } + /* Start reading mouse position after moving it once */ + initial_x = (initial_x) ? initial_x : hw_state->x; + initial_y = (initial_y) ? initial_y : hw_state->y; + + if ((hw_state->x == initial_x && hw_state->y == initial_y)) + { + hw_state->flags &= ~MENU_INP_PTR_FLG_ACTIVE; + return; + } + last_x = hw_state->x; last_y = hw_state->y; From 49ee835c82c36fe3a100c8caca44ac42be509652 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Tue, 27 May 2025 18:13:16 +0300 Subject: [PATCH 134/175] Better menu mouse startup position ignore --- menu/menu_driver.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/menu/menu_driver.c b/menu/menu_driver.c index d9880733bf..716d5e5cde 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -1860,10 +1860,9 @@ static void menu_input_get_mouse_hw_state( menu_input_pointer_hw_state_t *hw_state) { rarch_joypad_info_t joypad_info; - static int16_t last_x = 0; - static int16_t last_y = 0; - static int16_t initial_x = 0; - static int16_t initial_y = 0; + static int16_t last_x = -0x7fff; + static int16_t last_y = -0x7fff; + bool ignore_position = false; bool is_select_pressed = false; bool is_cancel_pressed = false; static bool last_select_pressed = false; @@ -1923,14 +1922,8 @@ static void menu_input_get_mouse_hw_state( } /* Start reading mouse position after moving it once */ - initial_x = (initial_x) ? initial_x : hw_state->x; - initial_y = (initial_y) ? initial_y : hw_state->y; - - if ((hw_state->x == initial_x && hw_state->y == initial_y)) - { - hw_state->flags &= ~MENU_INP_PTR_FLG_ACTIVE; - return; - } + if (last_x == -0x7fff && last_y == -0x7fff) + ignore_position = true; last_x = hw_state->x; last_y = hw_state->y; @@ -2068,6 +2061,9 @@ static void menu_input_get_mouse_hw_state( hw_state->flags |= MENU_INP_PTR_FLG_ACTIVE; last_select_pressed = (hw_state->flags & MENU_INP_PTR_FLG_PRESS_SELECT) > 0; last_cancel_pressed = (hw_state->flags & MENU_INP_PTR_FLG_PRESS_CANCEL) > 0; + + if (ignore_position) + hw_state->flags &= ~MENU_INP_PTR_FLG_ACTIVE; } static void menu_input_get_touchscreen_hw_state( From 742625126340a160be4b45fe117c908e8a095c0a Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Tue, 27 May 2025 18:32:22 +0300 Subject: [PATCH 135/175] GLUI: Minor entry height adjustment (#17952) --- menu/drivers/materialui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 08d04c5ac4..a333ec7460 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -2996,7 +2996,7 @@ static void materialui_compute_entries_box_default( node->entry_height = node->text_height + mui->dip_base_unit_size / 10; - node->entry_height += mui->dip_base_unit_size / 10; + node->entry_height += mui->dip_base_unit_size / 15; node->y = sum; node->entry_width = node_entry_width; From 03be66836e03bbf0876611554c36ed4b99a9afc8 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Tue, 27 May 2025 21:08:23 +0300 Subject: [PATCH 136/175] GLUI: Even better entry height value --- menu/drivers/materialui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index a333ec7460..ba155af902 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -2996,7 +2996,7 @@ static void materialui_compute_entries_box_default( node->entry_height = node->text_height + mui->dip_base_unit_size / 10; - node->entry_height += mui->dip_base_unit_size / 15; + node->entry_height += mui->dip_base_unit_size / 13; node->y = sum; node->entry_width = node_entry_width; From b3fd3e15edcc704a9cbb33948412ea5204ed53af Mon Sep 17 00:00:00 2001 From: sonninnos Date: Tue, 27 May 2025 22:43:15 +0300 Subject: [PATCH 137/175] WinRaw: Prevent stuck mouse buttons on unfocus --- input/drivers/winraw_input.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index 0dae1e9346..8487598717 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -639,6 +639,10 @@ static void winraw_poll(void *data) for (i = 0; i < wr->mouse_cnt; ++i) { + /* Clear buttons when not focused */ + if (!winraw_focus) + g_mice[i].flags = 0; + wr->mice[i].x = g_mice[i].x; wr->mice[i].y = g_mice[i].y; wr->mice[i].dlt_x = InterlockedExchange(&g_mice[i].dlt_x, 0); From a1a50afc9e70f3eeac9328f10cbac42769e4cc10 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Tue, 27 May 2025 23:47:06 +0300 Subject: [PATCH 138/175] Dinput: Ignore first mouse click on focus --- gfx/common/win32_common.c | 28 ++++++++++++++++++++++++---- input/drivers/dinput.c | 16 +++++++++++++++- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index 3e9b3ebc19..0d44ba14a5 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -1190,16 +1190,18 @@ static LRESULT CALLBACK wnd_proc_common_internal(HWND hwnd, g_win32_flags |= WIN32_CMN_FLAG_TASKBAR_CREATED; #endif break; -#ifdef HAVE_CLIP_WINDOW case WM_SETFOCUS: +#ifdef HAVE_CLIP_WINDOW if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) win32_clip_window(true); +#endif break; case WM_KILLFOCUS: +#ifdef HAVE_CLIP_WINDOW if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) win32_clip_window(false); - break; #endif + break; case WM_DISPLAYCHANGE: /* Fix size after display mode switch when using SR */ { HMONITOR mon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); @@ -1463,16 +1465,34 @@ static LRESULT CALLBACK wnd_proc_common_dinput_internal(HWND hwnd, g_win32_flags |= WIN32_CMN_FLAG_TASKBAR_CREATED; #endif break; -#ifdef HAVE_CLIP_WINDOW case WM_SETFOCUS: +#ifdef HAVE_CLIP_WINDOW if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) win32_clip_window(true); +#endif +#if !defined(_XBOX) + { + void* input_data = (void*)(LONG_PTR)GetWindowLongPtr(main_window.hwnd, GWLP_USERDATA); + if (input_data && dinput_handle_message(input_data, + message, wparam, lparam)) + return 0; + } +#endif break; case WM_KILLFOCUS: +#ifdef HAVE_CLIP_WINDOW if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) win32_clip_window(false); - break; #endif +#if !defined(_XBOX) + { + void* input_data = (void*)(LONG_PTR)GetWindowLongPtr(main_window.hwnd, GWLP_USERDATA); + if (input_data && dinput_handle_message(input_data, + message, wparam, lparam)) + return 0; + } +#endif + break; case WM_DISPLAYCHANGE: /* Fix size after display mode switch when using SR */ { HMONITOR mon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index 9db7de4f49..e2904db885 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -83,7 +83,8 @@ enum dinput_input_flags DINP_FLAG_MOUSE_WU_BTN = (1 << 10), DINP_FLAG_MOUSE_WD_BTN = (1 << 11), DINP_FLAG_MOUSE_HWU_BTN = (1 << 12), - DINP_FLAG_MOUSE_HWD_BTN = (1 << 13) + DINP_FLAG_MOUSE_HWD_BTN = (1 << 13), + DINP_FLAG_MOUSE_IGNORE = (1 << 14) }; struct dinput_input @@ -390,6 +391,15 @@ static void dinput_poll(void *data) ScreenToClient((HWND)video_driver_window_get(), &point); di->mouse_x = point.x; di->mouse_y = point.y; + + /* Ignore application focusing mouse clicks */ + if (di->flags & DINP_FLAG_MOUSE_IGNORE) + { + if (mouse_state.rgbButtons[0] || mouse_state.rgbButtons[1]) + di->flags &= ~(DINP_FLAG_MOUSE_L_BTN | DINP_FLAG_MOUSE_R_BTN); + else if (!mouse_state.rgbButtons[0] && !mouse_state.rgbButtons[1]) + di->flags &= ~DINP_FLAG_MOUSE_IGNORE; + } } } @@ -893,6 +903,10 @@ bool dinput_handle_message(void *data, switch (message) { + case WM_SETFOCUS: + case WM_KILLFOCUS: + di->flags |= DINP_FLAG_MOUSE_IGNORE; + break; case WM_NCLBUTTONDBLCLK: di->flags |= DINP_FLAG_DBCLK_ON_TITLEBAR; break; From cfa839f5b674a0faa460bc995a287f13a06d686f Mon Sep 17 00:00:00 2001 From: sonninnos Date: Wed, 28 May 2025 01:01:11 +0300 Subject: [PATCH 139/175] Default Import Content back to playlist sidebar/tabs --- config.def.h | 2 +- configuration.h | 1 - intl/msg_hash_us.h | 24 ++++---- menu/drivers/ozone.c | 127 +++++++++++++++++++++++-------------------- menu/drivers/xmb.c | 122 ++++++++++++++++++++++------------------- menu/menu_defines.h | 4 +- menu/menu_setting.c | 18 ++++++ 7 files changed, 165 insertions(+), 133 deletions(-) diff --git a/config.def.h b/config.def.h index 4a1df48330..16ea6a698e 100644 --- a/config.def.h +++ b/config.def.h @@ -811,7 +811,7 @@ #endif #endif -#define DEFAULT_MENU_CONTENT_SHOW_ADD_ENTRY MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB +#define DEFAULT_MENU_CONTENT_SHOW_ADD_ENTRY MENU_ADD_CONTENT_ENTRY_DISPLAY_PLAYLISTS_TAB #define DEFAULT_CONTENT_SHOW_PLAYLISTS true #define DEFAULT_CONTENT_SHOW_PLAYLIST_TABS true diff --git a/configuration.h b/configuration.h index 3b0daa3655..053ea2a93a 100644 --- a/configuration.h +++ b/configuration.h @@ -826,7 +826,6 @@ typedef struct settings bool menu_content_show_video; bool menu_content_show_netplay; bool menu_content_show_history; - bool menu_content_show_add; bool menu_content_show_playlists; bool menu_content_show_playlist_tabs; bool menu_content_show_explore; diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 95a7489ad8..f48fd2e9c5 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -6429,7 +6429,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Show the 'Settings' menu. (Restart required on Ozone/XMB)" + "Show the 'Settings' menu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, @@ -6445,7 +6445,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Show the 'Favorites' menu. (Restart required on Ozone/XMB)" + "Show the 'Favorites' menu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, @@ -6453,7 +6453,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, - "Show 'Favorites' before 'History'. (Restart required on Ozone/XMB)" + "Show 'Favorites' before 'History'." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, @@ -6461,7 +6461,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Show the 'Images' menu. (Restart required on Ozone/XMB)" + "Show the 'Images' menu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, @@ -6469,7 +6469,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Show the 'Music' menu. (Restart required on Ozone/XMB)" + "Show the 'Music' menu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, @@ -6477,7 +6477,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Show the 'Videos' menu. (Restart required on Ozone/XMB)" + "Show the 'Videos' menu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, @@ -6485,7 +6485,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Show the 'Netplay' menu. (Restart required on Ozone/XMB)" + "Show the 'Netplay' menu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, @@ -6493,7 +6493,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Show the recent history menu. (Restart required on Ozone/XMB)" + "Show the recent history menu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, @@ -6501,7 +6501,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Show the 'Import Content' entry inside the main menu or playlists submenu." + "Show the 'Import Content' entry inside the Main Menu or Playlists." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, @@ -6525,7 +6525,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Show the playlist tabs. Does not affect RGUI. Navbar must be enabled in GLUI. (Restart required on Ozone/XMB)" + "Show the playlist tabs. Does not affect RGUI. Navbar must be enabled in GLUI." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, @@ -6533,7 +6533,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Show the content explorer option. (Restart required on Ozone/XMB)" + "Show the content explorer option." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, @@ -6541,7 +6541,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Specify the type of core (if any) to show in the 'Contentless Cores' menu. When set to 'Custom', individual core visibility may be toggled via the 'Manage Cores' menu. (Restart required on Ozone/XMB)" + "Specify the type of core (if any) to show in the 'Contentless Cores' menu. When set to 'Custom', individual core visibility may be toggled via the 'Manage Cores' menu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index 25ade5cfcd..4002b0eb0c 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -2182,6 +2182,8 @@ static uintptr_t ozone_entries_icon_get_texture( case MENU_ENUM_LABEL_SETTINGS_SHOW_USER: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_USER]; case MENU_ENUM_LABEL_ADD_CONTENT_LIST: + if (ozone->depth > 1) + return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_ADD]; return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_MENU_ADD]; case MENU_ENUM_LABEL_DIRECTORY_SETTINGS: case MENU_ENUM_LABEL_SETTINGS_SHOW_DIRECTORY: @@ -5120,6 +5122,68 @@ static void ozone_refresh_horizontal_list(ozone_handle_t *ozone, ozone_context_reset_horizontal_list(ozone); } +static void ozone_refresh_system_tabs_list(ozone_handle_t * ozone) +{ + settings_t *settings = config_get_ptr(); + + ozone->system_tab_end = 0; + ozone->tabs[ozone->system_tab_end] = OZONE_SYSTEM_TAB_MAIN; + + if ( settings->bools.menu_content_show_settings + && !settings->bools.kiosk_mode_enable) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_SETTINGS; + + if (settings->bools.menu_content_show_favorites_first) + { + if (settings->bools.menu_content_show_favorites) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_FAVORITES; + if (settings->bools.menu_content_show_history) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_HISTORY; + } + else + { + if (settings->bools.menu_content_show_history) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_HISTORY; + if (settings->bools.menu_content_show_favorites) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_FAVORITES; + } + +#ifdef HAVE_IMAGEVIEWER + if (settings->bools.menu_content_show_images) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_IMAGES; +#endif + + if (settings->bools.menu_content_show_music) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_MUSIC; + +#if defined(HAVE_FFMPEG) || defined(HAVE_MPV) + if (settings->bools.menu_content_show_video) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_VIDEO; +#endif + +#if 0 /* Move Netplay to Main Menu */ +#ifdef HAVE_NETWORKING + if (settings->bools.menu_content_show_netplay) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_NETPLAY; +#endif +#endif /* 0 */ + + if ( settings->uints.menu_content_show_add_entry == MENU_ADD_CONTENT_ENTRY_DISPLAY_PLAYLISTS_TAB + && !settings->bools.kiosk_mode_enable) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_ADD; + +#if defined(HAVE_DYNAMIC) + if (settings->uints.menu_content_show_contentless_cores != + MENU_CONTENTLESS_CORES_DISPLAY_NONE) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_CONTENTLESS_CORES; +#endif + +#if defined(HAVE_LIBRETRODB) + if (settings->bools.menu_content_show_explore) + ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_EXPLORE; +#endif +} + static int ozone_get_entries_padding_old_list(ozone_handle_t* ozone) { if (ozone->depth == 2) /* false = left to right */ @@ -8186,7 +8250,7 @@ static enum menu_action ozone_parse_menu_entry_action( if (list_selection < 0) { - enum msg_hash_enums value_idx = ozone_system_tabs_label[tab_selection]; + enum msg_hash_enums value_idx = ozone_system_tabs_label[ozone->tabs[tab_selection]]; const char *tab_title; switch (value_idx) @@ -8996,63 +9060,7 @@ static void *ozone_init(void **userdata, bool video_is_threaded) gfx_thumbnail_set_fade_missing(false); ozone_sidebar_update_collapse(ozone, settings->bools.ozone_collapse_sidebar, false); - - ozone->system_tab_end = 0; - ozone->tabs[ozone->system_tab_end] = OZONE_SYSTEM_TAB_MAIN; - - if ( settings->bools.menu_content_show_settings - && !settings->bools.kiosk_mode_enable) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_SETTINGS; - - if (settings->bools.menu_content_show_favorites_first) - { - if (settings->bools.menu_content_show_favorites) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_FAVORITES; - if (settings->bools.menu_content_show_history) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_HISTORY; - } - else - { - if (settings->bools.menu_content_show_history) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_HISTORY; - if (settings->bools.menu_content_show_favorites) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_FAVORITES; - } - -#ifdef HAVE_IMAGEVIEWER - if (settings->bools.menu_content_show_images) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_IMAGES; -#endif - - if (settings->bools.menu_content_show_music) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_MUSIC; - -#if defined(HAVE_FFMPEG) || defined(HAVE_MPV) - if (settings->bools.menu_content_show_video) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_VIDEO; -#endif - -#if 0 /* Move Netplay and Import Content to Main Menu */ -#ifdef HAVE_NETWORKING - if (settings->bools.menu_content_show_netplay) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_NETPLAY; -#endif - - if ( settings->bools.menu_content_show_add - && !settings->bools.kiosk_mode_enable) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_ADD; -#endif /* 0 */ - -#if defined(HAVE_DYNAMIC) - if (settings->uints.menu_content_show_contentless_cores != - MENU_CONTENTLESS_CORES_DISPLAY_NONE) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_CONTENTLESS_CORES; -#endif - -#if defined(HAVE_LIBRETRODB) - if (settings->bools.menu_content_show_explore) - ozone->tabs[++ozone->system_tab_end] = OZONE_SYSTEM_TAB_EXPLORE; -#endif + ozone_refresh_system_tabs_list(ozone); for (i = 0; i < OZONE_TAB_MAX_LENGTH; i++) ozone->tab_selection[i] = 0; @@ -12713,8 +12721,7 @@ static int ozone_environ_cb(enum menu_environ_cb type, void *data, void *userdat ozone->flags &= ~OZONE_FLAG_SHOW_CURSOR; break; case MENU_ENVIRON_RESET_HORIZONTAL_LIST: - if (!ozone) - return -1; + ozone_refresh_system_tabs_list(ozone); ozone_refresh_horizontal_list(ozone, config_get_ptr()); break; case MENU_ENVIRON_ENABLE_SCREENSAVER: diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 9c3fee25bb..f68f391702 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -2886,6 +2886,68 @@ static void xmb_refresh_horizontal_list(xmb_handle_t *xmb) xmb_context_reset_horizontal_list(xmb); } +static void xmb_refresh_system_tabs_list(xmb_handle_t *xmb) +{ + settings_t *settings = config_get_ptr(); + + xmb->system_tab_end = 0; + xmb->tabs[xmb->system_tab_end] = XMB_SYSTEM_TAB_MAIN; + + if ( settings->bools.menu_content_show_settings + && !settings->bools.kiosk_mode_enable) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_SETTINGS; + + if (settings->bools.menu_content_show_favorites_first) + { + if (settings->bools.menu_content_show_favorites) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_FAVORITES; + if (settings->bools.menu_content_show_history) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_HISTORY; + } + else + { + if (settings->bools.menu_content_show_history) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_HISTORY; + if (settings->bools.menu_content_show_favorites) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_FAVORITES; + } + +#ifdef HAVE_IMAGEVIEWER + if (settings->bools.menu_content_show_images) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_IMAGES; +#endif + + if (settings->bools.menu_content_show_music) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_MUSIC; + +#if defined(HAVE_FFMPEG) || defined(HAVE_MPV) + if (settings->bools.menu_content_show_video) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_VIDEO; +#endif + +#if 0 /* Move Netplay to Main Menu */ +#ifdef HAVE_NETWORKING + if (settings->bools.menu_content_show_netplay) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_NETPLAY; +#endif +#endif /* 0 */ + + if ( settings->uints.menu_content_show_add_entry == MENU_ADD_CONTENT_ENTRY_DISPLAY_PLAYLISTS_TAB + && !settings->bools.kiosk_mode_enable) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_ADD; + +#if defined(HAVE_DYNAMIC) + if ( settings->uints.menu_content_show_contentless_cores + != MENU_CONTENTLESS_CORES_DISPLAY_NONE) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_CONTENTLESS_CORES; +#endif + +#if defined(HAVE_LIBRETRODB) + if (settings->bools.menu_content_show_explore) + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_EXPLORE; +#endif +} + static int xmb_environ(enum menu_environ_cb type, void *data, void *userdata) { xmb_handle_t *xmb = (xmb_handle_t*)userdata; @@ -2902,6 +2964,7 @@ static int xmb_environ(enum menu_environ_cb type, void *data, void *userdata) xmb->show_mouse = false; break; case MENU_ENVIRON_RESET_HORIZONTAL_LIST: + xmb_refresh_system_tabs_list(xmb); xmb_refresh_horizontal_list(xmb); break; case MENU_ENVIRON_ENABLE_SCREENSAVER: @@ -3363,6 +3426,8 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_DOWNLOAD_CORE_CONTENT_DIRS: return xmb->textures.list[XMB_TEXTURE_FOLDER]; case MENU_ENUM_LABEL_ADD_CONTENT_LIST: + if (xmb->depth > 1) + return xmb->textures.list[XMB_TEXTURE_ADD]; return xmb->textures.list[XMB_TEXTURE_MENU_ADD]; case MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR: case MENU_ENUM_LABEL_VALUE_CONTENTLESS_CORES_TAB: @@ -8659,66 +8724,11 @@ static void *xmb_init(void **userdata, bool video_is_threaded) xmb->old_depth = 1; xmb->alpha = 1.0f; - xmb->system_tab_end = 0; - xmb->tabs[xmb->system_tab_end] = XMB_SYSTEM_TAB_MAIN; + xmb_refresh_system_tabs_list(xmb); for (i = 0; i < XMB_TAB_MAX_LENGTH; i++) xmb->tab_selection[i] = 0; - if ( settings->bools.menu_content_show_settings - && !settings->bools.kiosk_mode_enable) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_SETTINGS; - - if (settings->bools.menu_content_show_favorites_first) - { - if (settings->bools.menu_content_show_favorites) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_FAVORITES; - if (settings->bools.menu_content_show_history) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_HISTORY; - } - else - { - if (settings->bools.menu_content_show_history) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_HISTORY; - if (settings->bools.menu_content_show_favorites) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_FAVORITES; - } - -#ifdef HAVE_IMAGEVIEWER - if (settings->bools.menu_content_show_images) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_IMAGES; -#endif - - if (settings->bools.menu_content_show_music) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_MUSIC; - -#if defined(HAVE_FFMPEG) || defined(HAVE_MPV) - if (settings->bools.menu_content_show_video) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_VIDEO; -#endif - -#if 0 /* Move Netplay and Import Content to Main Menu */ -#ifdef HAVE_NETWORKING - if (settings->bools.menu_content_show_netplay) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_NETPLAY; -#endif - - if ( settings->bools.menu_content_show_add - && !settings->bools.kiosk_mode_enable) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_ADD; -#endif /* 0 */ - -#if defined(HAVE_DYNAMIC) - if ( settings->uints.menu_content_show_contentless_cores - != MENU_CONTENTLESS_CORES_DISPLAY_NONE) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_CONTENTLESS_CORES; -#endif - -#if defined(HAVE_LIBRETRODB) - if (settings->bools.menu_content_show_explore) - xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_EXPLORE; -#endif - menu_st->flags &= ~MENU_ST_FLAG_PREVENT_POPULATE; /* TODO/FIXME - we don't use framebuffer at all diff --git a/menu/menu_defines.h b/menu/menu_defines.h index 5f0d0d3c61..6c1683db6e 100644 --- a/menu/menu_defines.h +++ b/menu/menu_defines.h @@ -166,9 +166,7 @@ enum menu_timedate_date_separator_type MENU_TIMEDATE_DATE_SEPARATOR_LAST }; -/* Specifies location of the 'Scan Content' menu - * entry when using menu drivers without a - * dedicated 'Import Content' (horizontal) tab */ +/* Specifies location of the 'Import Content' menu */ enum menu_add_content_entry_display_type { MENU_ADD_CONTENT_ENTRY_DISPLAY_HIDDEN = 0, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index d523713564..8758048ed1 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -8848,6 +8848,24 @@ static void general_write_handler(rarch_setting_t *setting) } break; #endif + case MENU_ENUM_LABEL_CONTENT_SHOW_SETTINGS: + case MENU_ENUM_LABEL_CONTENT_SHOW_FAVORITES: + case MENU_ENUM_LABEL_CONTENT_SHOW_FAVORITES_FIRST: + case MENU_ENUM_LABEL_CONTENT_SHOW_HISTORY: + case MENU_ENUM_LABEL_CONTENT_SHOW_IMAGES: + case MENU_ENUM_LABEL_CONTENT_SHOW_MUSIC: + case MENU_ENUM_LABEL_CONTENT_SHOW_VIDEO: + case MENU_ENUM_LABEL_CONTENT_SHOW_ADD_ENTRY: + case MENU_ENUM_LABEL_CONTENT_SHOW_PLAYLIST_TABS: + case MENU_ENUM_LABEL_CONTENT_SHOW_EXPLORE: + case MENU_ENUM_LABEL_CONTENT_SHOW_CONTENTLESS_CORES: + { + struct menu_state *menu_st = menu_state_get_ptr(); + if (menu_st->driver_ctx->environ_cb) + menu_st->driver_ctx->environ_cb(MENU_ENVIRON_RESET_HORIZONTAL_LIST, + NULL, menu_st->userdata); + } + break; default: /* Special cases */ From 4e30df639298e14d2ab71e57182c292f3414b1c3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 28 May 2025 00:16:15 +0000 Subject: [PATCH 140/175] Fetch translations from Crowdin --- intl/msg_hash_be.h | 40 ------------------------------- intl/msg_hash_ca.h | 48 ------------------------------------- intl/msg_hash_chs.h | 36 ---------------------------- intl/msg_hash_cht.h | 36 ---------------------------- intl/msg_hash_cs.h | 40 ------------------------------- intl/msg_hash_de.h | 56 ++++++++++--------------------------------- intl/msg_hash_en.h | 4 ---- intl/msg_hash_es.h | 48 ------------------------------------- intl/msg_hash_fi.h | 8 +++++++ intl/msg_hash_fr.h | 48 ------------------------------------- intl/msg_hash_gl.h | 36 ---------------------------- intl/msg_hash_hu.h | 40 ------------------------------- intl/msg_hash_it.h | 48 ------------------------------------- intl/msg_hash_ja.h | 36 ---------------------------- intl/msg_hash_ko.h | 40 ------------------------------- intl/msg_hash_no.h | 8 ------- intl/msg_hash_pl.h | 40 ------------------------------- intl/msg_hash_pt_br.h | 20 ---------------- intl/msg_hash_ru.h | 48 ------------------------------------- intl/msg_hash_sv.h | 28 ---------------------- intl/msg_hash_tr.h | 48 ------------------------------------- intl/msg_hash_uk.h | 56 ++++++++++++++----------------------------- intl/progress.h | 22 ++++++++--------- 23 files changed, 49 insertions(+), 785 deletions(-) diff --git a/intl/msg_hash_be.h b/intl/msg_hash_be.h index 19b637dca2..8ce40ea6ce 100644 --- a/intl/msg_hash_be.h +++ b/intl/msg_hash_be.h @@ -6243,10 +6243,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Паказ 'Налады'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Паказваць меню 'Налады'. (Патрабуецца перазапуск на Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Пароль для адлюстравання ўкладкі 'Налады'" @@ -6259,50 +6255,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Паказ 'Упадабанае'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Паказваць меню 'Упадабанае'. (Патрабуецца перазапуск на Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Паказ 'Відарысы'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Паказваць меню 'Відарысы'. (Патрабуецца перазапуск на Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Паказ 'Музыка'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Паказваць меню 'Музыка'. (Патрабуецца перазапуск на Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Паказ 'Відэа'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Паказваць меню 'Відэа'. (Патрабуецца перазапуск на Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Паказ 'Сеткавая гульня'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Паказваць меню 'Сеткавая гульня'. (Патрабуецца перазапуск на Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Паказ 'Гісторыя'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Паказваць меню нядаўняй гісторыі. (Патрабуецца перазапуск на Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Паказ 'Імпартаваць змесціва'" @@ -6327,26 +6299,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Паказ картак плэй-лістоў" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Паказваць карткі плэй-лістоў. Не мае ўплыву на RGUI. Панэль навігацыі мае быць уключаная ў GLUI. (Патрабуецца перазапуск на Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Паказ 'Агляд'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Паказваць опцыю даследчыка змесціва. (Патрабуецца перазапуск на Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Паказ 'Аўтаномныя ядры'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Тыпы ядраў (пры іх наяўнасці), якія адлюстроўваюцца ў меню 'Аўтаномныя ядры'. У рэжыме 'Уручную' бачнасць кожнага ядра можна наладзіць у меню 'Кіраванне ядрамі' (патрабуецца перазапуск для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Усе" diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index 2eb72b57c4..d335dc614c 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -6315,10 +6315,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Mostra 'Opcions'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Mostra el menú 'Configuració'. (Es requereix reiniciar per Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Establir contrasenya per activar la secció 'Opcions'" @@ -6331,66 +6327,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Mostra «Favorits»" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Mostra el menú 'Preferits'. (Es requereix reiniciar per Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, "Mostra primer els preferits" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, - "Mostra els preferits abans que l'historial. (Es requereix reiniciar per Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Mostrar Imatges" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Mostra el menú 'Imatges'. (Es requereix reiniciar per Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Mostrar 'Música'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Mostra el menú 'Música' (Es requereix reiniciar a Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Mostra «Vídeos»" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Mostra el menú 'Vídeos'. (Es requereix reiniciar per Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Mostra «Joc en línia»" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Mostra el menú 'Joc en xarxa'. (Es requereix reiniciar per Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Mostra «Historial»" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Mostra l'historial d'elements recents (Es requereix reiniciar per Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostra «Importa contingut»" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Mostra una entrada d’«Importa contingut» al menú principal o al submenú de llistes de reproducció." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Menú principal" @@ -6411,26 +6375,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Mostra les pestanyes de les llistes de reproducció" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Mostra les seccions de les llistes de reproducció. No afecta RGUI. Cal activar la barra de navegació a GLUI (És necessari reiniciar a Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Mostra «Explora»" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Mostra l'opció de l'explorador de continguts (És necessari reiniciar a Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Mostra «Nuclis sense continguts»" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Especifica el tipus de nucli (si hi ha cap) per mostrar al menú «Nuclis sense continguts». En establir-ho com a «Personalitzat», la visibilitat individual dels nuclis es pot canviar mitjançant el menú «Gestiona els nuclis» (cal reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Tots" diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index cc9f9c78f6..f0795dafec 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -6039,10 +6039,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "显示「设置」页" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "显示「设置」菜单。(在 Ozone/XMB 中需要重启)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "设置开启「设置」页的密码" @@ -6055,50 +6051,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "显示「收藏」页" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "显示「收藏」菜单。(在 Ozone/XMB 中需要重启)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "显示「图片」页" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "显示「图片」菜单。(在 Ozone/XMB 中需要重启)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "显示「音乐」页" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "显示「音乐」菜单。(在 Ozone/XMB 中需要重启)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "显示「视频」页" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "显示「视频」菜单。(在 Ozone/XMB 中需要重启)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "显示「联机」页" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "显示「联机」菜单。(在 Ozone/XMB 中需要重启)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "显示「历史」页" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "显示「历史」菜单。(在 Ozone/XMB 中需要重启)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "显示「导入」" @@ -6119,18 +6091,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "显示「探索」页" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "显示探索游戏选项。(在 Ozone/XMB 中需要重启)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "显示“无内容核心”" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "指定要在“无内容核心”菜单中显示的核心类型(如果有的话)。 当设置为“自定义”时,可以通过“管理核心”菜单切换单个核心可见性(在 Ozone/XMB上需要重新启动)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "全部" diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index ba27874bff..85c907eade 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -5899,10 +5899,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "顯示「設定」" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "顯示「設定」選項, 關閉此選項請先設定密碼, 避免錯誤發生。 (Ozone和XMB主題需要重新啟動)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "輸入顯示設定選項的密碼" @@ -5915,50 +5911,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "顯示「我的最愛」" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "顯示「我的最愛」列表。 (Ozone和XMB主題需要重新啟動)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "顯示「圖片」" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "顯示「圖片」列表。 (Ozone和XMB主題需要重新啟動)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "顯示「音樂」" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "顯示「音樂」列表。 (Ozone和XMB主題需要重新啟動)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "顯示「影片」" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "顯示「影片」列表。 (Ozone和XMB主題需要重新啟動)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "顯示「連線對戰」" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "顯示「連線對戰」選項。 (Ozone和XMB主題需要重新啟動)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "顯示「歷史」" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "顯示「歷史」列表。 (Ozone和XMB主題需要重新啟動)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "顯示「匯入遊戲」" @@ -5979,18 +5951,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "顯示「搜尋」" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "顯示「搜尋」選項。 (Ozone和XMB主題需要重新啟動)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "顯示「應用核心」" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "設定「應用核心」顯示類型。 (Ozone和XMB主題需要重新啟動)\n設定<自訂>時可透過「設定/核心/管理核心」選項, 設定核心是否顯示於「應用核心」選項中。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "可執行" diff --git a/intl/msg_hash_cs.h b/intl/msg_hash_cs.h index 43ed335cd5..d9bf941d52 100644 --- a/intl/msg_hash_cs.h +++ b/intl/msg_hash_cs.h @@ -6227,10 +6227,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Zobrazit 'Nastavení'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Zobrazte menu \"Nastavení\". (U zařízení Ozone/XMB je nutný restart)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Nastavení hesla pro povolení 'Nastavení'" @@ -6243,50 +6239,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Zobrazit 'Oblíbené'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Zobrazení menu \"Oblíbené\". (V systému Ozone/XMB je nutný restart)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Zobrazit 'Obrázky'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Zobrazit menu „Obrázky“. (V systému Ozone/XMB je nutný restart)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Zobrazit 'Hudbu'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Zobrazení menu „Hudba“. (V systému Ozone/XMB je nutný restart)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Zobrazit 'Videa'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Zobrazit menu „Videa“. (V systému Ozone/XMB je nutný restart)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Zobrazit 'Netplay'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Zobrazení menu „Netplay“. (V zařízení Ozone/XMB je nutný restart)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Zobrazení 'Historie'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Zobrazení menu nedávné historie. (V systému Ozone/XMB je nutný restart)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Zobrazit 'Importovat obsah'" @@ -6311,26 +6283,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Zobrazit karty Playlistu" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Zobrazení karet seznamu skladeb. Nemá vliv na rozhraní RGUI. Navigační panel musí být povolen v rozhraní GLUI. (V systému Ozone/XMB je nutný restart)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Zobrazit 'Prozkoumat'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Zobrazit možnost průzkumníka obsahu. (V systému Ozone/XMB je nutný restart)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Zobrazit 'Jádra bez obsahu'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Zadejte typ jádra (pokud existuje), které se má zobrazit v nabídce „Bezobsažná jádra“. Pokud je nastavena hodnota „Vlastní“, lze viditelnost jednotlivých jader přepínat prostřednictvím nabídky „Spravovat jádra“. (V systému Ozone/XMB je nutný restart)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Vše" diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index cd80f2c8bf..9c8f2f0bf7 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -551,6 +551,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Installierten Core sperren" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_LOCK, + "Änderungen am aktuell installierten Core verhindern. Kann verwendet werden, um unerwünschte Updates zu vermeiden, wenn Inhalte eine bestimmte Core-Version benötigen (z. B. Arcade-ROM-Sets) oder sich das eigene Savestate-Format des Cores ändert." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Von „Inhaltslose Cores“ ausschließen" @@ -6211,10 +6215,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "\"Einstellungen\" anzeigen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Das „Einstellungen“-Menü anzeigen. (Neustart erforderlich bei Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Kennwort zum Wiederherstellen der \"Einstellungen\" festlegen" @@ -6227,58 +6227,30 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "\"Favoriten\" anzeigen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Das „Favoriten“-Menü anzeigen. (Neustart erforderlich bei Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, "Favoriten zuerst anzeigen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, - "„Favoriten“ vor „Verlauf“ anzeigen. (Für Ozone/XMB Neustart erforderlich)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "\"Bilder\" anzeigen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Das „Bilder“-Menü anzeigen. (Neustart erforderlich bei Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "\"Musik\" anzeigen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Das „Musik“-Menü anzeigen. (Neustart erforderlich bei Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "\"Videos\" anzeigen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Das „Videos“-Menü anzeigen. (Neustart erforderlich bei Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "\"Netzwerkspiel\" anzeigen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Das „Netzwerkspiel“-Menü anzeigen. (Neustart erforderlich bei Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "\"Verlauf\" anzeigen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Das „Verlauf“-Menü anzeigen. (Neustart erforderlich bei Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "\"Inhalte importieren\" anzeigen" @@ -6303,26 +6275,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Wiedergabelisten-Tabs anzeigen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Wiedergabelisten-Tabs anzeigen. Wirkt sich nicht auf RGUI aus. Navigationsleiste muss in GLUI aktiviert sein. (Neustart erforderlich auf Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "\"Erkunden\" anzeigen" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Das „Erkunden“-Menü anzeigen. (Neustart erforderlich bei Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Zeige 'Inhaltslose Cores'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Den Typ des Cores angeben, der im Menü „Inhaltslose Cores“ angezeigt werden soll. Bei der Einstellung „Benutzerdefiniert“ kann die Sichtbarkeit einzelner Cores über das Menü „Cores verwalten“ umgeschaltet werden. (Neustart erforderlich bei Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Alle" @@ -8843,6 +8803,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_STATE, "Speichere einen Zustand in dem aktuellen Speicherplatz." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SAVE_STATE, + "Speichert einen State in den aktuell ausgewählten Speicherplatz. Hinweis: Savestates sind normalerweise nicht übertragbar und funktionieren möglicherweise nicht mit anderen Versionen dieses Cores." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Spielstand laden" @@ -8851,6 +8815,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_STATE, "Lade einen gespeicherten Zustand aus dem aktuellen Speicherplatz." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LOAD_STATE, + "Lädt einen Savestate aus dem aktuell ausgewählten Speicherplatz. Hinweis: Funktioniert möglicherweise nicht, wenn der Status mit einer anderen Version des Cores gespeichert wurde." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Laden des Savestates rückgängig machen" diff --git a/intl/msg_hash_en.h b/intl/msg_hash_en.h index abd01f92a3..1651f83b1b 100644 --- a/intl/msg_hash_en.h +++ b/intl/msg_hash_en.h @@ -999,10 +999,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Show 'Favourites'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Show the 'Favourites' menu. (Restart required on Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Show 'Net-play'" diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index 090efa08b6..342ce0e50b 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -6331,10 +6331,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Mostrar Ajustes" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Muestra el menú Ajustes (es necesario reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Contraseña para activar la sección de Ajustes" @@ -6347,66 +6343,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Mostrar Favoritos" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Muestra el menú Favoritos (es necesario reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, "Mostrar Favoritos en primer lugar" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, - "Muestra el menú de favoritos antes que el historial (es necesario reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Mostrar Imágenes" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Muestra el menú Imágenes (es necesario reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Mostrar Música" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Muestra el menú Música (es necesario reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Mostrar Vídeos" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Muestra el menú Vídeos (es necesario reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Mostrar Juego en red" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Muestra el menú Juego en red (es necesario reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Mostrar Historial" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Muestra el historial de elementos recientes (es necesario reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostrar Importar contenido" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Muestra la opción Importar contenido dentro del menú principal o en la sección de listas de reproducción." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Menú principal" @@ -6427,26 +6391,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Mostrar secciones de listas de reproducción" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Muestra las secciones de las listas de reproducción. No afecta a RGUI. Es necesario activar la barra de navegación en GLUI (es necesario reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Mostrar Explorar" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Muestra la opción del explorador de contenidos (es necesario reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Mostrar Núcleos sin contenidos" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Especifica los tipos de núcleos (en caso de existir) que se mostrarán en el menú «Núcleos sin contenidos». Al seleccionar Personalizado, la visibilidad de cada núcleo podrá activarse o desactivarse dentro del menú «Administrar núcleos» (es necesario reiniciar en Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Todos" diff --git a/intl/msg_hash_fi.h b/intl/msg_hash_fi.h index 287991ca33..2ddb54f9b6 100644 --- a/intl/msg_hash_fi.h +++ b/intl/msg_hash_fi.h @@ -12797,6 +12797,10 @@ MSG_HASH( MSG_REWINDING, "Kelataan taakse." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Puskurin kapasiteetti on riittämätön." + ) MSG_HASH( MSG_REWIND_UNSUPPORTED, "Takaisinkelaus ei saatavilla, sillä tämä ydin ei tue tilatallennuksia." @@ -13289,6 +13293,10 @@ MSG_HASH( MSG_CHEEVOS_NUMBER_ACHIEVEMENTS_UNLOCKED, "Olet avannut %d/%d saavutusta" ) +MSG_HASH( + MSG_CHEEVOS_UNSUPPORTED_WARNING, + "Ei-tuettuja saavutuksia havaittu. Kokeile toista ydintä tai päivitä RetroArch." +) MSG_HASH( MSG_RESAMPLER_QUALITY_LOWEST, "Matalin" diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 4389c4df0c..c996893174 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -6291,10 +6291,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Afficher 'Réglages'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Afficher le menu 'Réglages'. (Redémarrage requis sur Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Définir le mot de passe pour l'activation de 'Réglages' " @@ -6307,66 +6303,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Afficher 'Favoris'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Afficher le menu 'Favoris'. (Redémarrage requis sur Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, "Afficher les favoris en premier" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, - "Afficher les 'Favoris' avant 'Historique'. (Redémarrage requis sur Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Afficher 'Images'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Afficher le menu 'Images'. (Redémarrage requis sur Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Afficher 'Musique'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Afficher le menu 'Musique'. (Redémarrage requis sur Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Afficher 'Vidéo'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Afficher le menu 'Vidéo'. (Redémarrage requis sur Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Afficher 'Jeu en réseau'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Afficher le menu 'Jeu en réseau'. (Redémarrage requis sur Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Afficher 'Historique'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Afficher le menu de l'historique récent. (Redémarrage requis sur Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Afficher 'Importer du contenu'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Afficher l'entrée 'Importer du contenu' dans le menu principal ou le sous-menu des listes de lecture." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Menu principal" @@ -6387,26 +6351,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Afficher les onglets de liste de lecture" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Afficher les onglets de liste de lecture. Cela n'affecte pas RGUI. La barre de navigation doit être activée dans GLUI. (Redémarrage requis pour Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Afficher 'Parcourir'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Afficher l'option pour parcourir le contenu. (Redémarrage requis sur Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Afficher 'Cœurs sans contenu'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Spécifier le type de cœur (le cas échéant) à afficher dans le menu 'Cœurs sans contenu'. Lorsque réglé sur 'Personnalisé', la visibilité des cœurs individuels peut être activée/désactivée via le menu 'Gérer les cœurs'. (Redémarrage requis pour Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Tous" diff --git a/intl/msg_hash_gl.h b/intl/msg_hash_gl.h index 5576d85fc1..23aa1eeeab 100644 --- a/intl/msg_hash_gl.h +++ b/intl/msg_hash_gl.h @@ -6207,10 +6207,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Mostrar \"Configuración\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Mostra o menú \"Configuración\". (Requírese reiniciar en Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Establecer o contrasinal para activar \"Configuración\"" @@ -6223,26 +6219,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Mostrar \"Favoritos\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Mostra o menú \"Favoritos\". (Requírese reiniciar en Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Mostrar \"Imaxes\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Mostra o menú \"Imaxes\". (Requírese reiniciar en Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Mostrar \"Música\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Mostra o menú \"Música\". (Requírese reiniciar en Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Mostrar \"Vídeos\"" @@ -6251,18 +6235,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Amosar 'Xogo en Rede'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Amosa o menú \"Xogo en rede\". (Requírese reiniciar en Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Mostrar \"Historial\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Mostra o menú do historial recente. (Requírese reiniciar en Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostrar \"Importar contido\"" @@ -6287,26 +6263,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Amosar lapelas de listas de reprodución" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Amosar as lapelas de listas de reprodución. Non afecta a RGUI. A barra de navegación debe estar activada en GLUI. (Requírese reiniciar en Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Mostrar \"Explorar\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Mostra a opción do explorador de contido. (Requírese reiniciar en Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Mostrar \"Núcleos sen contido\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Especifique o tipo de núcleo (se o hai) para mostrar no menú \"Núcleos sen contido\". Cando se define como \"Personalizado\", a visibilidade do núcleo individual pódese alternar a través do menú \"Xestionar núcleos\". (Requírese reiniciar en Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Todo" diff --git a/intl/msg_hash_hu.h b/intl/msg_hash_hu.h index e503fcc950..502f35ee2b 100644 --- a/intl/msg_hash_hu.h +++ b/intl/msg_hash_hu.h @@ -6307,10 +6307,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "\"Beállítások\" látható" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "A \"Beállítások\" menü jelenjen meg. (Ozone / XMB esetén újraindítás szükséges.)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Jelszó beállítása a \"Beállítások\" engedélyezéséhez" @@ -6323,50 +6319,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "\"Kedvencek\" látható" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "A \"Kedvencek\" menü jelenjen meg. (Ozone / XMB esetén újraindítás szükséges.)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "\"Képek\" látható" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "A \"Képek\" menü jelenjen meg. (Ozone / XMB esetén újraindítás szükséges.)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "\"Zenék\" látható" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "A \"Zenék\" menü jelenjen meg. (Ozone / XMB esetén újraindítás szükséges.)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "\"Filmek\" látható" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "A \"Filmek\" menü jelenjen meg. (Ozone / XMB esetén újraindítás szükséges.)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "\"Netplay\" látható" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "A \"Netplay\" menü jelenjen meg. (Ozone / XMB esetén újraindítás szükséges.)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "\"Előzmények\" látható" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Az \"Előzmények\" menü jelenjen meg. (Ozone / XMB esetén újraindítás szükséges.)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "\"Tartalom importálása\" látható" @@ -6391,26 +6363,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Fülek a játéklistáknak" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "A játéklisták megjelenítése külön füleken. RGUI-ra nincs hatása. GLUI esetén a navigációs sávot be kell kapcsolni. (Újraindítás szükséges Ozone/XMB esetén)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "\"Felfedezés\" látható" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "A \"Felfedezés\" lehetőség jelenjen meg. (Ozone / XMB esetén újraindítás szükséges.)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "\"Tartalmat nem igénylő magok\" látható" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "A \"Tartalmat nem igénylő magok\" menüben megjelenő magok típusa. \"Egyedi\" esetben az egyes magok láthatóságát a \"Magok kezelése\" menüben lehet állítani. (Ozone/XMB esetén újraindítás szükséges.)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Mind" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 713a421d7d..56ccebd2e1 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -6255,10 +6255,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Mostra 'Impostazioni'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Mostra il menu 'Impostazioni'. (Riavvio richiesto su Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Imposta Password Per Abilitare Le 'Impostazioni'" @@ -6271,66 +6267,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Mostra 'Preferiti'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Mostra il menu 'Preferiti'. (Riavvio richiesto su Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, "Mostra Prima I Preferiti" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, - "Mostra 'Preferiti' prima della 'Cronologia'. (Restart richiesto su Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Mostra 'Immagini'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Mostra il menu 'Immagini'. (Riavvio richiesto su Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Mostra 'Musica'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Mostra il menu 'Musica'. (Riavvio richiesto su Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Mostra 'Video'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Mostra il menu 'Video'. (Riavvio richiesto su Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Mostra 'Netplay'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Mostra il menu 'Netplay'. (Riavvio richiesto su Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Mostra 'Cronologia'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Mostra il menu cronologia recente. (Riavvio richiesto su Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Mostra 'Importa Contenuto'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Mostra la voce 'Importa contenuto' nel menu principale o nel sottomenu delle playlist." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Menu Principale" @@ -6351,26 +6315,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Mostra le schede delle Playlist" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Mostra le schede della playlist. Non influisce su RGUI. La barra della navigazione deve essere abilitata in GLUI. (Riavvio richiesto su Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Mostra 'Esplora'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Mostra l'opzione Esplora contenuti. (Riavvio richiesto su Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Mostra 'Nuclei senza Contenuti'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Specifica il tipo di nucleo (se presente) da mostrare nel menu 'Cores senza contenuti'. Quando impostato su 'Personalizzato', la visibilità individuale del core può essere attivata tramite il menu 'Gestisci core' (necessario per Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Tutti" diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index c31e6ec971..e26f06a674 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -6031,10 +6031,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "[設定] を表示" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "[設定] メニューを表示します。 (Ozone/XMB で再起動が必要)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "[設定] を有効にするためのパスワードを設定" @@ -6047,50 +6043,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "[お気に入り] を表示" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "[お気に入り] メニューを表示します。 (Ozone/XMB で再起動が必要)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "[画像] を表示" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "[画像] メニューを表示します。 (Ozone/XMB で再起動が必要)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "[音楽] を表示" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "[音楽] メニューを表示します。 (Ozone/XMB で再起動が必要)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "[動画] を表示" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "[動画] メニューを表示します。 (Ozone/XMB で再起動が必要)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "[ネットプレイ] を表示" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "[ネットプレイ] メニューを表示します。 (Ozone/XMB で再起動が必要)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "[履歴] を表示" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "[履歴] メニューを表示します。 (Ozone/XMB で再起動が必要)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "[コンテンツをインポート] を表示" @@ -6111,18 +6083,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "[エクスプローラー] を表示" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "[エクスプローラー] メニューを表示します。 (Ozone/XMB で再起動が必要)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "[コンテンツレスコア] を表示" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "[コンテンツレスコア] メニューに表示するコアの種類を指定します。「カスタム」に設定すると、[コアの管理] メニューから個々のコアの表示/非表示を切り替えることができます。 (Ozone/XMB で再起動が必要)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "すべて" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index b2aec2b6ab..d2910e546a 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -6371,10 +6371,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "'설정' 표시" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "'설정' 메뉴를 표시합니다. (Ozone/XMB 사용시 재시작 필요)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "'설정' 항목에 비밀번호 설정" @@ -6387,50 +6383,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "'즐겨찾기' 표시" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "'즐겨찾기' 메뉴를 표시합니다. (Ozone/XMB 사용시 재시작 필요)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "'이미지' 표시" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "'이미지' 메뉴를 표시합니다. (Ozone/XMB 사용시 재시작 필요)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "'음악' 표시" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "'음악' 메뉴를 표시합니다. (Ozone/XMB 사용시 재시작 필요)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "'비디오' 표시" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "'비디오' 메뉴를 표시합니다. (Ozone/XMB 사용시 재시작 필요)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "'넷플레이' 표시" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "'넷플레이' 메뉴를 표시합니다. (Ozone/XMB 사용시 재시작 필요)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "'최근 실행' 표시" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "최근 실행 메뉴를 표시합니다. (Ozone/XMB 사용시 재시작 필요)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "'콘텐츠 가져오기' 표시" @@ -6455,26 +6427,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "실행목록 탭 표시" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "실행목록 탭을 표시합니다. RGUI에서는 무시됩니다. GLUI에서는 내비게이션 바가 활성화되어 있어야 합니다. (Ozone/XMB 사용시 재시작 필요)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "'탐색' 표시" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "콘텐츠 탐색 메뉴를 표시합니다. (Ozone/XMB 사용시 재시작 필요)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "'단독 실행 코어' 표시" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "'단독 실행 코어' 메뉴에 표시할 코어의 종류를 선택합니다. '사용자 정의'로 설정할 경우, '코어 관리' 메뉴에서 개별 코어의 표시 여부를 설정할 수 있습니다. (Ozone/XMB에서 재시작 필요)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "전체" diff --git a/intl/msg_hash_no.h b/intl/msg_hash_no.h index 6a4f7d0dce..c0c2e6aec3 100644 --- a/intl/msg_hash_no.h +++ b/intl/msg_hash_no.h @@ -2799,18 +2799,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Vis \"Utforsk\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Vis innholdsutforsker alternativet. (Omstart kreves på Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Vis 'Innholdløse kjerner'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Angi type kjerne (hvis noen) som skal vises i 'Contentless Cores' menyen. Når satt til \"Tilpasset\", kan enkeltkjernen slås av via \"Behandle kjerner\"-menyen. (Omstart kreves på Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Alle" diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index ae599eb62d..e8728f1a15 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -5455,10 +5455,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Pokaż 'Ustawienia'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Pokaż menu \"Ustawienia\". (Wymagany restart na Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Ustaw hasło do włączenia 'Ustawienia'" @@ -5471,10 +5467,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Pokaż 'Ulubione'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Pokaż menu 'Ulubione'. (Wymagany restart w Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, "Pokaż zakładkę Ulubione" @@ -5483,34 +5475,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Pokaż 'Obrazy'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Pokaż menu 'Obrazy'. (Wymagany restart na Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Pokaż 'Muzyka'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Pokaż menu 'Muzyka'. (Wymagane restart na Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Pokaż 'Filmy'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Pokaż menu 'Filmy'. (Wymagany restart na Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Pokaż 'Netplay'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Pokaż menu \"Netplay\". (Wymagany restart na Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Pokaż 'Historia'" @@ -5519,10 +5495,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Pokaż 'Importuj zawartość'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Pokaż wpis 'Importuj zawartość' wewnątrz menu głównego lub podmenu listy odtwarzania." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Menu główne" @@ -5543,22 +5515,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Pokaż karty playlist" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Pokaż karty playlisty. Nie ma wpływu na RGUI. Pasek nawigacyjny musi być włączony w GLUI. (Pestart wymagany w Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Pokaż 'Eksploruj'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Pokaż opcję eksploratora zawartości. (Wymagany restart w Ozone/XMB)" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Określ typ rdzenia (jeśli istnieje) do pokazania w menu 'Contentless Cores'. Po ustawieniu na 'Własny', indywidualna widoczność rdzenia może być przełączona za pomocą menu 'Zarządzaj Coron'. (Zachowaj wymagane w Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Wszystkie" diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index f18565ea78..464632408a 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -5503,10 +5503,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Mostrar 'Configurações'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Exibe o menu \"Configurações\". (requer reinício em Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Defina a senha para ativar a aba \"Configurações\"" @@ -5519,26 +5515,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Mostrar \"Favoritos\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Exibe o menu \"Favoritos\". (requer reinício em Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, "Mostrar Favoritos Primeiro" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, - "Mostrar ‘Favoritos’ antes de ‘Histórico’. (Reinicialização necessária no Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Mostrar 'Imagens'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Exibe o menu \"Imagens\". (requer reinício em Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Mostrar 'Música'" @@ -5551,10 +5535,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Mostrar \"Netplay\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Exibe o menu \"Netplay\". (requer reinício em Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Mostrar \"Histórico\"" diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index ceefe1ab89..c7f49b8719 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -6363,10 +6363,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Показывать 'Настройки'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Показывать меню 'Настройки' (требуется перезапуск для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Пароль для отображения вкладки 'Настройки'" @@ -6379,66 +6375,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Показывать 'Избранное'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Показывать меню 'Избранное' (требуется перезапуск для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, "Показывать сначала 'Избранное'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, - "Показывать вкладку 'Избранное' перед 'Историей запуска' (требуется перезапуск для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Показывать 'Изображения'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Показывать меню 'Изображения' (требуется перезапуск для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Показывать 'Музыка'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Показывать меню 'Музыка' (требуется перезапуск для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Показывать 'Видео'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Показывать меню 'Видео' (требуется перезапуск для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Показывать 'Сетевая игра'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Показывать меню 'Сетевая игра' (требуется перезапуск для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Показывать 'История запуска'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Показывать меню 'История запуска' (требуется перезапуск для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Показывать 'Импорт контента'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Показывать 'Импорт контента' в главном меню или в подменю плейлистов." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Главное меню" @@ -6459,26 +6423,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Показывать вкладки плейлистов" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Показывать плейлисты на вкладках. Не влияет на RGUI. Для GLUI должна быть включена панель навигации. Требуется перезапуск для Ozone/XMB." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Показывать 'Обзор'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Показывать опцию 'Обзор' (требуется перезапуск для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Показывать 'Автономные ядра'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Типы ядер (при их наличии), отображаемые в меню 'Автономные ядра'. В режиме 'Вручную' видимость каждого ядра можно настроить в меню 'Управление ядрами' (требуется перезапуск для Ozone/XMB)." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Все" diff --git a/intl/msg_hash_sv.h b/intl/msg_hash_sv.h index 6762de1125..86c4dcc39a 100644 --- a/intl/msg_hash_sv.h +++ b/intl/msg_hash_sv.h @@ -5763,10 +5763,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Visa 'Inställningar'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Visa menyn ”Inställningar”. (Omstart krävs på Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Ange lösenord för 'Inställningar'" @@ -5779,42 +5775,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Visa 'Favoriter'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Visa menyn ”Favoriter”. (Omstart krävs på Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Visa 'Bilder'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Visa menyn ”Bilder”. (Omstart krävs på Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Visa 'Musik'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Visa menyn ”Musik”. (Omstart krävs på Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Visa 'Videor'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Visa menyn ”Videor”. (Omstart krävs på Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Visa 'Netplay'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Visa menyn ”Netplay”. (Omstart krävs på Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Visa 'Historik'" @@ -5847,10 +5823,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Visa 'Utforska'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Visa alternativ för innehållsutforskare. (Omstart krävs på Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Visa 'Innehållslösa kärnor'" diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index b3959bc9a9..72c5addd32 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -6335,10 +6335,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "'Ayarlar' Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "'Ayarlar' menüsünü gösterin. (Ozon/XMB'de Yeniden Başlatılmalı)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "'Ayarları' Etkinleştirmek için Parola Ayarla" @@ -6351,66 +6347,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "'Sık Kullanılanlar' Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "'Sık Kullanılanlar' menüsünü gösterin. (Ozon/XMB'de Yeniden Başlatılmalı)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, "Sık Kullanılanları Öncelikli Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES_FIRST, - "'Geçmiş' bölümünden önce 'Sık Kullanılanları' göster. (Ozone/XMB yeniden başlatılmalı)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "'Resimler' Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "'Resimler' menüsünü gösterin. (Ozon/XMB'de Yeniden Başlatılmalı)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "'Müzikleri' Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "'Müzikler' menüsünü gösterin. (Ozon/XMB'de Yeniden Başlatılmalı)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "'Video' Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "'Video' menüsünü gösterin. (Ozon/XMB'de Yeniden Başlatılmalı)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "'Netplay' Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "'Netplay' menüsünü gösterin. (Ozon/XMB'de Yeniden Başlatılmalı)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "'Geçmiş' Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Geçmiş menüsünü gösterin. (Ozon/XMB'de Yeniden Başlatılmalı)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "'İçeriği İçe Aktar' Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD_ENTRY, - "Ana menü veya oynatma listeleri alt menüsünde bir 'İçeriği İçe Aktar' girişi gösterin." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Ana Menü" @@ -6431,26 +6395,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Oynatma Listesi Sekmesini Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Oynatma listesi sekmelerini gösterin. RGUI etkilenmez. Gezinme çubuğu GLUI ile etkinleştirilmelidir. (Ozon/XMB yeniden başlatılmalı)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "'Gezgin' Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "İçerik gezgini seçeneğini gösterin. (Ozon/XMB'de Yeniden Başlatılmalı)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "'İçeriksiz Çekirdekler' Göster" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "'İçeriksiz Çekirdekler' menüsünde gösterilecek çekirdek türünü (varsa) belirtin. 'Özel' olarak ayarlandığında, bireysel çekirdek görünürlüğü 'Çekirdekleri Yönet' menüsü aracılığıyla değiştirilebilir. (Ozone/XMB Yeniden Başlatılmalı)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Tümü" diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index de51eca54d..10e4dc8b56 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -567,6 +567,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, "Блокувати встановлене ядро" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_LOCK, + "Запобігти зміні встановлених в даний момент. Може використовуватися для уникнення небажаних оновлень, коли контент вимагає конкретної версії ядра (наприклад,. Аркада ПЗУ набору) або власний формат стану \"збереження\"." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_SET_STANDALONE_EXEMPT, "Виключити з меню 'Автономні ядра'" @@ -6307,10 +6311,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, "Показати \"Налаштування\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Показувати меню 'Параметри'. (Для перезапуску необхідно перезавантажити пристрій Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, "Встановити пароль для активування 'Параметри'" @@ -6324,49 +6324,29 @@ MSG_HASH( "Показувати 'Обране'" ) MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Показувати меню «Улюблене». (Для перезавантаження потрібен Ozone/XMB)" + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES_FIRST, + "Показати улюблені спочатку" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, "Показати \"Зображення\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Відображати меню 'Зображення'. (Перезапуск необхідного для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, "Показати 'Музика'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Показувати меню 'Музика'. (Потрібно перезапустити з Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Показати 'Відео'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Показувати меню 'Відео'. (Для перезапуску потрібен Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Показати 'Netplay'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Відображати меню 'Netplay'. (Перезапустіть необхідну для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "Показати \"Історія\"" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Показати останнє меню історії. (Для перезапуску, потрібен Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY, "Показати 'Зміст імпорту'" @@ -6391,26 +6371,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLIST_TABS, "Показати вкладки списку відтворення" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLIST_TABS, - "Показати вкладки списку відтворення. Не впливає на RGUI. Панель навігації має бути ввімкнена в GLUI. (Потрібен перезапуск Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE, "Показати 'Explore'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_EXPLORE, - "Показати кнопку провідника вмісту. (Перезапустити необхідні для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_CONTENTLESS_CORES, "Показати 'Автономні Ядра'" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_SHOW_CONTENTLESS_CORES, - "Визначає тип ядра (якщо є) для відображення в меню 'Без змісту'. Якщо встановлено значення 'Користувачна', індивідуальна базова видимість може бути переключена через меню 'Керувати Cores'. (Перезапустити необхідну для Ozone/XMB)" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHOW_CONTENTLESS_CORES_ALL, "Усі" @@ -8983,6 +8951,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_STATE, "Зберегти стан у вибрану вами комірку." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SAVE_STATE, + "Зберегти стан в поточний слот. Примітка: збереження станів зазвичай не є портативним і не може працювати з іншими версіями цього ядра." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Завантажити стан" @@ -8991,6 +8963,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_STATE, "Завантажити збережений стан з обраного вами слота." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_LOAD_STATE, + "Завантажити збережений стан з обраного в даний час слота. Примітка: може не працювати, якщо стан був збережений в іншій версії ядра." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, "Скасувати завантажений стан" @@ -14249,6 +14225,10 @@ MSG_HASH( MSG_REWINDING, "Відмотати назад." ) +MSG_HASH( + MSG_REWIND_BUFFER_CAPACITY_INSUFFICIENT, + "Недостатньо ємності буфера." + ) MSG_HASH( MSG_REWIND_UNSUPPORTED, "Перемотування недоступний, тому що в цьому базовому відсутні серіалізовані служби збереження стану." diff --git a/intl/progress.h b/intl/progress.h index 9183e807eb..d29a3c5a41 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -15,11 +15,11 @@ #define LANGUAGE_PROGRESS_BULGARIAN_APPROVED 0 /* Catalan */ -#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_CATALAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ -#define LANGUAGE_PROGRESS_CZECH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_CZECH_TRANSLATED 98 #define LANGUAGE_PROGRESS_CZECH_APPROVED 0 /* Welsh */ @@ -47,7 +47,7 @@ #define LANGUAGE_PROGRESS_ESPERANTO_APPROVED 0 /* Spanish */ -#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 99 #define LANGUAGE_PROGRESS_SPANISH_APPROVED 90 /* Persian */ @@ -55,15 +55,15 @@ #define LANGUAGE_PROGRESS_PERSIAN_APPROVED 0 /* Finnish */ -#define LANGUAGE_PROGRESS_FINNISH_TRANSLATED 74 +#define LANGUAGE_PROGRESS_FINNISH_TRANSLATED 75 #define LANGUAGE_PROGRESS_FINNISH_APPROVED 45 /* French */ -#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 100 -#define LANGUAGE_PROGRESS_FRENCH_APPROVED 100 +#define LANGUAGE_PROGRESS_FRENCH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_FRENCH_APPROVED 99 /* Galician */ -#define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_GALICIAN_TRANSLATED 98 #define LANGUAGE_PROGRESS_GALICIAN_APPROVED 0 /* Hebrew */ @@ -83,7 +83,7 @@ #define LANGUAGE_PROGRESS_INDONESIAN_APPROVED 0 /* Italian */ -#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 100 +#define LANGUAGE_PROGRESS_ITALIAN_TRANSLATED 99 #define LANGUAGE_PROGRESS_ITALIAN_APPROVED 0 /* Japanese */ @@ -107,7 +107,7 @@ #define LANGUAGE_PROGRESS_ODIA_APPROVED 0 /* Polish */ -#define LANGUAGE_PROGRESS_POLISH_TRANSLATED 77 +#define LANGUAGE_PROGRESS_POLISH_TRANSLATED 76 #define LANGUAGE_PROGRESS_POLISH_APPROVED 22 /* Portuguese, Brazilian */ @@ -135,8 +135,8 @@ #define LANGUAGE_PROGRESS_SWEDISH_APPROVED 51 /* Turkish */ -#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 100 -#define LANGUAGE_PROGRESS_TURKISH_APPROVED 100 +#define LANGUAGE_PROGRESS_TURKISH_TRANSLATED 99 +#define LANGUAGE_PROGRESS_TURKISH_APPROVED 99 /* Tatar */ #define LANGUAGE_PROGRESS_TATAR_TRANSLATED 0 From 13790a0fad566fdfb9cf16f5167a62a5808f298d Mon Sep 17 00:00:00 2001 From: libretroadmin Date: Wed, 28 May 2025 16:40:56 +0200 Subject: [PATCH 141/175] (Audio) Some cleanups --- audio/audio_defines.h | 8 +---- audio/audio_driver.c | 67 +++++++++++++++++++-------------------- audio/audio_driver.h | 19 ++--------- audio/microphone_driver.c | 30 +++++++++--------- audio/microphone_driver.h | 2 +- retroarch.c | 6 ++-- 6 files changed, 56 insertions(+), 76 deletions(-) diff --git a/audio/audio_defines.h b/audio/audio_defines.h index ca2a8e162a..d68a6beee9 100644 --- a/audio/audio_defines.h +++ b/audio/audio_defines.h @@ -21,8 +21,6 @@ RETRO_BEGIN_DECLS -#define AUDIO_CHUNK_SIZE_BLOCKING 512 - /* So we don't get complete line-noise when fast-forwarding audio. */ #define AUDIO_CHUNK_SIZE_NONBLOCKING 2048 @@ -33,11 +31,7 @@ RETRO_BEGIN_DECLS #define AUDIO_MIXER_MAX_SYSTEM_STREAMS (AUDIO_MIXER_MAX_STREAMS + 8) -/* Fastforward timing calculations running average samples. Helps with a -consistent pitch when fast-forwarding. */ -#define AUDIO_FF_EXP_AVG_SAMPLES 16 - -/* do not define more than (MAX_SYSTEM_STREAMS - MAX_STREAMS) */ +/* Do not define more than (MAX_SYSTEM_STREAMS - MAX_STREAMS) */ enum audio_mixer_system_slot { AUDIO_MIXER_SYSTEM_SLOT_OK = AUDIO_MIXER_MAX_STREAMS, diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 88048cc0f9..073283266c 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -59,6 +59,12 @@ #include "../tasks/task_content.h" #include "../verbosity.h" +#define AUDIO_CHUNK_SIZE_BLOCKING 512 + +/* Fastforward timing calculations running average samples. Helps with + * a consistent pitch when fast-forwarding. */ +#define AUDIO_FF_EXP_AVG_SAMPLES 16 + #define MENU_SOUND_FORMATS "ogg|mod|xm|s3m|mp3|flac|wav" /* Converts decibels to voltage gain. returns voltage gain value. */ @@ -199,20 +205,13 @@ const char *config_get_audio_driver_options(void) return char_list_new_special(STRING_LIST_AUDIO_DRIVERS, NULL); } -unsigned audio_driver_get_sample_size(void) -{ - audio_driver_state_t *audio_st = &audio_driver_st; - return (audio_st->flags & AUDIO_FLAG_USE_FLOAT) ? sizeof(float) : sizeof(int16_t); -} - #ifdef HAVE_TRANSLATE /* TODO/FIXME - Doesn't currently work. Fix this. */ bool audio_driver_is_ai_service_speech_running(void) { #ifdef HAVE_AUDIOMIXER enum audio_mixer_state res = audio_driver_mixer_get_stream_state(10); - bool ret = (res == AUDIO_STREAM_STATE_NONE) || (res == AUDIO_STREAM_STATE_STOPPED); - if (!ret) + if (!((res == AUDIO_STREAM_STATE_NONE) || (res == AUDIO_STREAM_STATE_STOPPED))) return true; #endif return false; @@ -235,7 +234,7 @@ static bool audio_driver_free_devices_list(void) } #ifdef DEBUG -static void report_audio_buffer_statistics(void) +static void audio_driver_report_audio_buffer_statistics(void) { audio_statistics_t audio_stats; audio_stats.samples = 0; @@ -269,7 +268,6 @@ static void audio_driver_deinit_resampler(void) audio_st->resampler_quality = RESAMPLER_QUALITY_DONTCARE; } - static bool audio_driver_deinit_internal(bool audio_enable) { audio_driver_state_t *audio_st = &audio_driver_st; @@ -314,7 +312,7 @@ static bool audio_driver_deinit_internal(bool audio_enable) audio_driver_dsp_filter_free(); #endif #ifdef DEBUG - report_audio_buffer_statistics(); + audio_driver_report_audio_buffer_statistics(); #endif return true; @@ -392,8 +390,7 @@ bool audio_driver_find_driver(const char *audio_drv, * @param is_slowmotion True if the core is currently running in slow motion. * @param is_fastmotion True if the core is currently running in fast-forward. **/ -static void audio_driver_flush( - audio_driver_state_t *audio_st, +static void audio_driver_flush(audio_driver_state_t *audio_st, float slowmotion_ratio, const int16_t *data, size_t samples, bool is_slowmotion, bool is_fastforward) @@ -410,41 +407,46 @@ static void audio_driver_flush( convert_s16_to_float(audio_st->input_data, data, samples, audio_volume_gain); - /* The resampler operates on floating-point frames, - * so we gotta convert the input first */ + /* The resampler operates on floating-point frames, + * so we have to convert the input first */ src_data.data_in = audio_st->input_data; src_data.input_frames = samples >> 1; + /* Remember, we allocated buffers that are twice as big as needed. * (see audio_driver_init) */ #ifdef HAVE_DSP_FILTER + /* If we want to process our audio for reasons besides resampling... */ if (audio_st->dsp) - { /* If we want to process our audio for reasons besides resampling... */ + { struct retro_dsp_data dsp_data; dsp_data.input = audio_st->input_data; dsp_data.input_frames = (unsigned)(samples >> 1); dsp_data.output = NULL; dsp_data.output_frames = 0; + /* Initialize the DSP input/output. - * Our DSP implementations generally operate directly on the input buffer, - * so the output/output_frames attributes here are zero; - * the DSP filter will set them to useful values, - * most likely to be the same as the inputs. */ + * Our DSP implementations generally operate directly on the + * input buffer, so the output/output_frames attributes here are zero; + * the DSP filter will set them to useful values, most likely to be + * the same as the inputs. */ retro_dsp_filter_process(audio_st->dsp, &dsp_data); + /* If the DSP filter succeeded... */ if (dsp_data.output) - { /* If the DSP filter succeeded... */ + { + /* Then let's pass the DSP's output to the resampler's input */ src_data.data_in = dsp_data.output; src_data.input_frames = dsp_data.output_frames; - /* Then let's pass the DSP's output to the resampler's input */ } } #endif src_data.data_out = audio_st->output_samples_buf; + /* Now the resampler will write to the driver state's scratch buffer */ /* Count samples. */ @@ -462,10 +464,8 @@ static void audio_driver_flush( double direction = (double)delta_mid / half_size; double adjust = 1.0 + audio_st->rate_control_delta * direction; - audio_st->free_samples_buf[write_idx] - = avail; - audio_st->source_ratio_current - = audio_st->source_ratio_original * adjust; + audio_st->free_samples_buf[write_idx] = avail; + audio_st->src_ratio_curr = audio_st->src_ratio_orig * adjust; #if 0 if (verbosity_is_enabled()) @@ -474,14 +474,14 @@ static void audio_driver_flush( (unsigned)(100 - (avail * 100) / audio_st->buffer_size)); RARCH_LOG_OUTPUT("[Audio]: New rate: %lf, Orig rate: %lf\n", - audio_st->source_ratio_current, - audio_st->source_ratio_original); + audio_st->src_ratio_curr, + audio_st->src_ratio_orig); } #endif } } - src_data.ratio = audio_st->source_ratio_current; + src_data.ratio = audio_st->src_ratio_curr; if (is_slowmotion) src_data.ratio *= slowmotion_ratio; @@ -520,8 +520,7 @@ static void audio_driver_flush( audio_st->last_flush_time = flush_time; } - audio_st->resampler->process( - audio_st->resampler_data, &src_data); + audio_st->resampler->process(audio_st->resampler_data, &src_data); #ifdef HAVE_AUDIOMIXER if (audio_st->flags & AUDIO_FLAG_MIXER_ACTIVE) @@ -722,8 +721,8 @@ bool audio_driver_init_internal(void *settings_data, bool audio_cb_inited) audio_driver_st.input = settings->uints.audio_output_sample_rate; } - audio_driver_st.source_ratio_original = - audio_driver_st.source_ratio_current = + audio_driver_st.src_ratio_orig = + audio_driver_st.src_ratio_curr = (double)settings->uints.audio_output_sample_rate / audio_driver_st.input; if (!string_is_empty(settings->arrays.audio_resampler)) @@ -740,7 +739,7 @@ bool audio_driver_init_internal(void *settings_data, bool audio_cb_inited) &audio_driver_st.resampler, audio_driver_st.resampler_ident, audio_driver_st.resampler_quality, - audio_driver_st.source_ratio_original)) + audio_driver_st.src_ratio_orig)) { RARCH_ERR("Failed to initialize resampler \"%s\".\n", audio_driver_st.resampler_ident); diff --git a/audio/audio_driver.h b/audio/audio_driver.h index 676744798a..cd0ca5606d 100644 --- a/audio/audio_driver.h +++ b/audio/audio_driver.h @@ -169,8 +169,8 @@ typedef struct audio_driver typedef struct { - double source_ratio_original; - double source_ratio_current; + double src_ratio_orig; + double src_ratio_curr; uint64_t free_samples_count; @@ -320,17 +320,6 @@ bool audio_driver_start(bool is_shutdown); bool audio_driver_stop(void); -/** - * If you need to query the size of audio samples, - * use this function instead of checking the flags directly. - * - * @return The size of a single audio sample in bytes, - * as determined by the presence of the \c AUDIO_FLAG_USE_FLOAT flag. - * Will currently return either 2 (for \c uint16_t) or 4 (for \c float), - * although this may change if we add support for more sample types. - */ -unsigned audio_driver_get_sample_size(void); - #ifdef HAVE_TRANSLATE /* TODO/FIXME - Doesn't currently work. Fix this. */ bool audio_driver_is_ai_service_speech_running(void); @@ -344,9 +333,7 @@ bool audio_driver_is_ai_service_speech_running(void); **/ bool audio_compute_buffer_statistics(audio_statistics_t *stats); -bool audio_driver_init_internal( - void *settings_data, - bool audio_cb_inited); +bool audio_driver_init_internal(void *data, bool audio_cb_inited); bool audio_driver_deinit(void); diff --git a/audio/microphone_driver.c b/audio/microphone_driver.c index f3f7dc3d11..75b11efba2 100644 --- a/audio/microphone_driver.c +++ b/audio/microphone_driver.c @@ -79,11 +79,12 @@ bool microphone_driver_start(void) microphone_driver_state_t *mic_st = &mic_driver_st; retro_microphone_t *microphone = &mic_st->microphone; + /* If there's an opened microphone that the core turned on... */ if (microphone->flags & MICROPHONE_FLAG_ACTIVE) - { /* If there's an opened microphone that the core turned on... */ - + { + /* If this microphone was requested before the driver was ready...*/ if (microphone->flags & MICROPHONE_FLAG_PENDING) - { /* If this microphone was requested before the driver was ready...*/ + { retro_assert(microphone->microphone_context == NULL); /* The microphone context shouldn't have been created yet */ @@ -102,8 +103,9 @@ bool microphone_driver_start(void) * what if the player just unplugged their mic? */ } } + /* The microphone was already created, so let's just unpause it */ else - { /* The mic was already created, so let's just unpause it */ + { microphone_driver_set_mic_state(microphone, true); RARCH_DBG("[Microphone]: Started a microphone that was enabled when the driver was last stopped.\n"); @@ -117,18 +119,16 @@ bool microphone_driver_stop(void) { microphone_driver_state_t *mic_st = &mic_driver_st; retro_microphone_t *microphone = &mic_st->microphone; - bool result = true; - if ((microphone->flags & MICROPHONE_FLAG_ACTIVE) - && (microphone->flags & MICROPHONE_FLAG_ENABLED) + /* If there's an opened microphone that the core + * turned on and received... */ + if ( (microphone->flags & MICROPHONE_FLAG_ACTIVE) + && (microphone->flags & MICROPHONE_FLAG_ENABLED) && !(microphone->flags & MICROPHONE_FLAG_PENDING)) - { /* If there's an opened microphone that the core turned on and received... */ - - result = mic_st->driver->stop_mic(mic_st->driver_context, microphone->microphone_context); - } + return mic_st->driver->stop_mic(mic_st->driver_context, + microphone->microphone_context); /* If the mic is pending, then we don't need to do anything. */ - - return result; + return true; } /** @@ -388,14 +388,14 @@ static bool mic_driver_open_mic_internal(retro_microphone_t* microphone) && mic_driver->mic_use_float(mic_st->driver_context, microphone->microphone_context)) microphone->flags |= MICROPHONE_FLAG_USE_FLOAT; - microphone->original_ratio = (double)microphone->effective_params.rate / microphone->actual_params.rate; + microphone->orig_ratio = (double)microphone->effective_params.rate / microphone->actual_params.rate; if (!retro_resampler_realloc( µphone->resampler_data, µphone->resampler, mic_st->resampler_ident, mic_st->resampler_quality, - microphone->original_ratio)) + microphone->orig_ratio)) { RARCH_ERR("[Microphone]: Failed to initialize resampler \"%s\".\n", mic_st->resampler_ident); goto error; diff --git a/audio/microphone_driver.h b/audio/microphone_driver.h index 3997911b1e..0104932565 100644 --- a/audio/microphone_driver.h +++ b/audio/microphone_driver.h @@ -190,7 +190,7 @@ struct retro_microphone * The ratio of the core-requested sample rate to the device's opened sample rate. * If this is (almost) equal to 1, then resampling will be skipped. */ - double original_ratio; + double orig_ratio; }; /** diff --git a/retroarch.c b/retroarch.c index 3aace49722..45fa014cb1 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2,7 +2,7 @@ * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2021 - Daniel De Matteis * Copyright (C) 2012-2015 - Michael Lelli - * Copyright (C) 2014-2017 - Jean-Andr� Santoni + * Copyright (C) 2014-2017 - Jean-Andr Santoni * Copyright (C) 2016-2019 - Brad Parker * * RetroArch is free software: you can redistribute it and/or modify it under the terms @@ -1979,8 +1979,8 @@ bool driver_ctl(enum driver_ctl_state state, void *data) video_monitor_set_refresh_rate(*hz); /* Sets audio monitor rate to new value. */ - audio_st->source_ratio_original = - audio_st->source_ratio_current = + audio_st->src_ratio_orig = + audio_st->src_ratio_curr = (double)audio_output_sample_rate / audio_st->input; driver_adjust_system_rates(runloop_st, video_st, settings); From 08c0221c27f49e4dc262c34ea432b26011ca7af2 Mon Sep 17 00:00:00 2001 From: libretroadmin Date: Wed, 28 May 2025 17:19:32 +0200 Subject: [PATCH 142/175] (audio driver) Cleanups --- audio/audio_driver.c | 91 +++++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 39 deletions(-) diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 073283266c..99f77bfc0e 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -454,9 +454,9 @@ static void audio_driver_flush(audio_driver_state_t *audio_st, unsigned write_idx = audio_st->free_samples_count++ & (AUDIO_BUFFER_FREE_SAMPLES_COUNT - 1); + /* Readjust the audio input rate. */ if (audio_st->flags & AUDIO_FLAG_CONTROL) { - /* Readjust the audio input rate. */ int avail = (int)audio_st->current_audio->write_avail( audio_st->context_audio_data); int half_size = (int)(audio_st->buffer_size / 2); @@ -506,11 +506,12 @@ static void audio_driver_flush(audio_driver_state_t *audio_st, https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average */ - const retro_time_t n = AUDIO_FF_EXP_AVG_SAMPLES; + const retro_time_t n = AUDIO_FF_EXP_AVG_SAMPLES; audio_st->avg_flush_delta = audio_st->avg_flush_delta * (n - 1) / n + (flush_time - audio_st->last_flush_time) / n; - /* How much does the avg_flush_delta deviate from the delta at 1.0x speed? */ + /* How much does the avg_flush_delta deviate + * from the delta at 1.0x speed? */ src_data.ratio *= MAX(AUDIO_MIN_RATIO, MIN(AUDIO_MAX_RATIO, @@ -542,11 +543,14 @@ static void audio_driver_flush(audio_driver_state_t *audio_st, #endif /* Now we write our processed audio output to the driver. - * It may not be played immediately, depending on the driver implementation. */ + * It may not be played immediately, depending on + * the driver implementation. */ { const void *output_data = audio_st->output_samples_buf; unsigned output_frames = (unsigned)src_data.output_frames; /* Unit: frames */ + /* If the audio driver supports float samples, + * we don't have to do conversion */ if (audio_st->flags & AUDIO_FLAG_USE_FLOAT) output_frames *= sizeof(float); /* Unit: bytes */ else @@ -746,7 +750,7 @@ bool audio_driver_init_internal(void *settings_data, bool audio_cb_inited) audio_driver_st.flags &= ~AUDIO_FLAG_ACTIVE; } - audio_driver_st.data_ptr = 0; + audio_driver_st.data_ptr = 0; out_samples_buf = (float*)memalign_alloc(64, outsamples_max * sizeof(float)); @@ -813,14 +817,14 @@ void audio_driver_sample(int16_t left, int16_t right) runloop_flags = runloop_get_flags(); recording_st = recording_state_get_ptr(); - if ( recording_st->data && - recording_st->driver && - recording_st->driver->push_audio) + if ( recording_st->data + && recording_st->driver + && recording_st->driver->push_audio) { struct record_audio_data ffemu_data; - ffemu_data.data = audio_st->output_samples_conv_buf; - ffemu_data.frames = audio_st->data_ptr / 2; + ffemu_data.data = audio_st->output_samples_conv_buf; + ffemu_data.frames = audio_st->data_ptr / 2; recording_st->driver->push_audio(recording_st->data, &ffemu_data); } @@ -841,6 +845,8 @@ void audio_driver_sample(int16_t left, int16_t right) size_t audio_driver_sample_batch(const int16_t *data, size_t frames) { uint32_t runloop_flags; + bool recording_push_audio = false; + bool flush_audio = false; size_t frames_remaining = frames; recording_state_t *record_st = recording_state_get_ptr(); audio_driver_state_t *audio_st = &audio_driver_st; @@ -848,7 +854,13 @@ size_t audio_driver_sample_batch(const int16_t *data, size_t frames) if ((audio_st->flags & AUDIO_FLAG_SUSPENDED) || (frames < 1)) return frames; - runloop_flags = runloop_get_flags(); + runloop_flags = runloop_get_flags(); + flush_audio = !((runloop_flags & RUNLOOP_FLAG_PAUSED) + || !(audio_st->flags & AUDIO_FLAG_ACTIVE) + || !(audio_st->output_samples_buf)); + recording_push_audio = record_st->data + && record_st->driver + && record_st->driver->push_audio; /* We want to run this loop at least once, so use a * do...while (do...while has only a single conditional @@ -856,15 +868,15 @@ size_t audio_driver_sample_batch(const int16_t *data, size_t frames) * conditional jump and an unconditional jump). Note, * however, that this is only relevant for compilers * that are poor at optimisation... */ + do { size_t frames_to_write = - (frames_remaining > (AUDIO_CHUNK_SIZE_NONBLOCKING >> 1)) ? - (AUDIO_CHUNK_SIZE_NONBLOCKING >> 1) : frames_remaining; + (frames_remaining > (AUDIO_CHUNK_SIZE_NONBLOCKING >> 1)) + ? (AUDIO_CHUNK_SIZE_NONBLOCKING >> 1) + : frames_remaining; - if ( record_st->data - && record_st->driver - && record_st->driver->push_audio) + if (recording_push_audio) { struct record_audio_data ffemu_data; @@ -874,9 +886,7 @@ size_t audio_driver_sample_batch(const int16_t *data, size_t frames) record_st->driver->push_audio(record_st->data, &ffemu_data); } - if (!( (runloop_flags & RUNLOOP_FLAG_PAUSED) - || !(audio_st->flags & AUDIO_FLAG_ACTIVE) - || !(audio_st->output_samples_buf))) + if (flush_audio) audio_driver_flush(audio_st, config_get_ptr()->floats.slowmotion_ratio, data, @@ -886,8 +896,7 @@ size_t audio_driver_sample_batch(const int16_t *data, size_t frames) frames_remaining -= frames_to_write; data += frames_to_write << 1; - } - while (frames_remaining > 0); + } while (frames_remaining > 0); return frames; } @@ -914,7 +923,6 @@ size_t audio_driver_sample_batch_rewind( { if (audio_st->rewind_ptr < 1) break; - audio_st->rewind_buf[--audio_st->rewind_ptr] = data[i]; } @@ -1038,7 +1046,7 @@ static int audio_mixer_find_index( static void audio_mixer_play_stop_cb( audio_mixer_sound_t *sound, unsigned reason) { - int idx = audio_mixer_find_index(sound); + int idx = audio_mixer_find_index(sound); switch (reason) { @@ -1071,7 +1079,7 @@ static void audio_mixer_play_stop_cb( static void audio_mixer_menu_stop_cb( audio_mixer_sound_t *sound, unsigned reason) { - int idx = audio_mixer_find_index(sound); + int idx = audio_mixer_find_index(sound); switch (reason) { @@ -1092,7 +1100,7 @@ static void audio_mixer_menu_stop_cb( static void audio_mixer_play_stop_sequential_cb( audio_mixer_sound_t *sound, unsigned reason) { - int idx = audio_mixer_find_index(sound); + int idx = audio_mixer_find_index(sound); switch (reason) { @@ -1141,13 +1149,13 @@ static void audio_mixer_play_stop_sequential_cb( static bool audio_driver_mixer_get_free_stream_slot( unsigned *id, enum audio_mixer_stream_type type) { - unsigned i = AUDIO_MIXER_MAX_STREAMS; - unsigned count = AUDIO_MIXER_MAX_SYSTEM_STREAMS; + unsigned i = AUDIO_MIXER_MAX_STREAMS; + unsigned count = AUDIO_MIXER_MAX_SYSTEM_STREAMS; if (type == AUDIO_STREAM_TYPE_USER) { - i = 0; - count = AUDIO_MIXER_MAX_STREAMS; + i = 0; + count = AUDIO_MIXER_MAX_STREAMS; } for (; i < count; i++) @@ -1184,7 +1192,6 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params) * before assigning the new one */ audio_driver_mixer_stop_stream(free_slot); audio_driver_mixer_remove_stream(free_slot); - break; case AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC: default: @@ -1305,14 +1312,14 @@ static void audio_driver_mixer_play_stream_internal( } } +#if defined(HAVE_MENU) static void audio_driver_load_menu_bgm_callback(retro_task_t *task, void *task_data, void *user_data, const char *error) { -#if defined(HAVE_AUDIOMIXER) && defined(HAVE_MENU) if (menu_state_get_ptr()->flags & MENU_ST_FLAG_ALIVE) audio_driver_mixer_play_menu_sound_looped(AUDIO_MIXER_SYSTEM_SLOT_BGM); -#endif } +#endif void audio_driver_load_system_sounds(void) { @@ -1421,10 +1428,15 @@ void audio_driver_load_system_sounds(void) if (path_notice_back) task_push_audio_mixer_load(path_notice_back, NULL, NULL, true, AUDIO_MIXER_SLOT_SELECTION_MANUAL, AUDIO_MIXER_SYSTEM_SLOT_NOTICE_BACK); } + +#if defined(HAVE_MENU) if (path_bgm && audio_enable_menu_bgm) task_push_audio_mixer_load(path_bgm, audio_driver_load_menu_bgm_callback, NULL, true, AUDIO_MIXER_SLOT_SELECTION_MANUAL, AUDIO_MIXER_SYSTEM_SLOT_BGM); +#endif + if (path_cheevo_unlock && audio_enable_cheevo_unlock) task_push_audio_mixer_load(path_cheevo_unlock, NULL, NULL, true, AUDIO_MIXER_SLOT_SELECTION_MANUAL, AUDIO_MIXER_SYSTEM_SLOT_ACHIEVEMENT_UNLOCK); + if (audio_enable_menu_scroll) { if (path_up) @@ -1695,9 +1707,9 @@ void audio_driver_frame_is_reverse(void) uint32_t runloop_flags = runloop_get_flags(); /* We just rewound. Flush rewind audio buffer. */ - if ( recording_st->data && - recording_st->driver && - recording_st->driver->push_audio) + if ( recording_st->data + && recording_st->driver + && recording_st->driver->push_audio) { struct record_audio_data ffemu_data; @@ -1718,10 +1730,8 @@ void audio_driver_frame_is_reverse(void) if (!(audio_st->flags & AUDIO_FLAG_SUSPENDED)) audio_driver_flush(audio_st, config_get_ptr()->floats.slowmotion_ratio, - audio_st->rewind_buf + - audio_st->rewind_ptr, - audio_st->rewind_size - - audio_st->rewind_ptr, + audio_st->rewind_buf + audio_st->rewind_ptr, + audio_st->rewind_size - audio_st->rewind_ptr, (runloop_flags & RUNLOOP_FLAG_SLOWMOTION) ? true : false, (runloop_flags & RUNLOOP_FLAG_FASTMOTION) ? true : false); } @@ -1867,6 +1877,7 @@ void audio_driver_menu_sample(void) bool check_flush = !( !(audio_st->flags & AUDIO_FLAG_ACTIVE) || !audio_st->output_samples_buf); + if ((audio_st->flags & AUDIO_FLAG_SUSPENDED)) check_flush = false; @@ -1893,6 +1904,7 @@ void audio_driver_menu_sample(void) (runloop_flags & RUNLOOP_FLAG_FASTMOTION) ? true : false); sample_count -= 1024; } + if ( recording_st->data && recording_st->driver && recording_st->driver->push_audio) @@ -1905,6 +1917,7 @@ void audio_driver_menu_sample(void) recording_st->driver->push_audio( recording_st->data, &ffemu_data); } + if (check_flush) audio_driver_flush(audio_st, slowmotion_ratio, samples_buf, sample_count, From bd9561d93c5d3453ab1e88047f2a727cc05d08e6 Mon Sep 17 00:00:00 2001 From: Ryunam Date: Wed, 28 May 2025 17:20:33 +0200 Subject: [PATCH 143/175] XInput: Fix rumble overload by limiting on state changes and interval --- input/drivers_joypad/xinput_hybrid_joypad.c | 26 +++++++++++++++++---- input/drivers_joypad/xinput_joypad.c | 26 +++++++++++++++++---- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/input/drivers_joypad/xinput_hybrid_joypad.c b/input/drivers_joypad/xinput_hybrid_joypad.c index 1acdf80d06..6ff40fcb41 100644 --- a/input/drivers_joypad/xinput_hybrid_joypad.c +++ b/input/drivers_joypad/xinput_hybrid_joypad.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -68,6 +69,8 @@ typedef struct bool connected; } xinput_joypad_state; +#define RUMBLE_INTERVAL 0.005 + /* TODO/FIXME - static globals */ static int g_xinput_pad_indexes[MAX_USERS]; static unsigned g_last_xinput_pad_idx = 0; @@ -90,6 +93,7 @@ static XINPUT_FEEDBACK g_xinput_rumble_states[4]; static XINPUT_VIBRATION g_xinput_rumble_states[4]; #endif static xinput_joypad_state g_xinput_states[4]; +static clock_t last_rumble_time[4] = {0}; /* Buttons are provided by XInput as bits of a uint16. * Map from rarch button index (0..10) to a mask to @@ -646,17 +650,31 @@ static bool xinput_joypad_rumble(unsigned pad, if (xuser == -1) return dinput_joypad_set_rumble(pad, effect, strength); + XINPUT_VIBRATION *state = &g_xinput_rumble_states[xuser]; + XINPUT_VIBRATION new_state = *state; + /* Consider the low frequency (left) motor the "strong" one. */ if (effect == RETRO_RUMBLE_STRONG) - g_xinput_rumble_states[xuser].wLeftMotorSpeed = strength; + new_state.wLeftMotorSpeed = strength; else if (effect == RETRO_RUMBLE_WEAK) - g_xinput_rumble_states[xuser].wRightMotorSpeed = strength; + new_state.wRightMotorSpeed = strength; + + bool rumble_state_unchanged = ((new_state.wLeftMotorSpeed == state->wLeftMotorSpeed) && + (new_state.wRightMotorSpeed == state->wRightMotorSpeed)); + + clock_t now = clock(); + double time_since_last_rumble = (double)(now - last_rumble_time[xuser]) / CLOCKS_PER_SEC; + bool rumble_interval_unelapsed = (time_since_last_rumble < RUMBLE_INTERVAL); + + if (rumble_state_unchanged || rumble_interval_unelapsed) + return true; if (!g_XInputSetState) return false; - return (g_XInputSetState(xuser, &g_xinput_rumble_states[xuser]) - == 0); + *state = new_state; + last_rumble_time[xuser] = now; + return (g_XInputSetState(xuser, state) == ERROR_SUCCESS); } static void xinput_joypad_destroy(void) diff --git a/input/drivers_joypad/xinput_joypad.c b/input/drivers_joypad/xinput_joypad.c index 71f3d3cd3d..866cf4495b 100644 --- a/input/drivers_joypad/xinput_joypad.c +++ b/input/drivers_joypad/xinput_joypad.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -51,6 +52,8 @@ typedef struct bool connected; } xinput_joypad_state; +#define RUMBLE_INTERVAL 0.005 + /* Function pointer, to be assigned with dylib_proc */ typedef uint32_t (__stdcall *XInputGetStateEx_t)(uint32_t, XINPUT_STATE*); typedef uint32_t (__stdcall *XInputSetState_t)(uint32_t, XINPUT_VIBRATION*); @@ -71,6 +74,7 @@ static XINPUT_FEEDBACK g_xinput_rumble_states[4]; static XINPUT_VIBRATION g_xinput_rumble_states[4]; #endif static xinput_joypad_state g_xinput_states[4]; +static clock_t last_rumble_time[4] = {0}; /* Buttons are provided by XInput as bits of a uint16. * Map from rarch button index (0..10) to a mask to @@ -371,17 +375,31 @@ static bool xinput_joypad_rumble(unsigned pad, if (xuser == -1) return false; + XINPUT_VIBRATION *state = &g_xinput_rumble_states[xuser]; + XINPUT_VIBRATION new_state = *state; + /* Consider the low frequency (left) motor the "strong" one. */ if (effect == RETRO_RUMBLE_STRONG) - g_xinput_rumble_states[xuser].wLeftMotorSpeed = strength; + new_state.wLeftMotorSpeed = strength; else if (effect == RETRO_RUMBLE_WEAK) - g_xinput_rumble_states[xuser].wRightMotorSpeed = strength; + new_state.wRightMotorSpeed = strength; + + bool rumble_state_unchanged = ((new_state.wLeftMotorSpeed == state->wLeftMotorSpeed) && + (new_state.wRightMotorSpeed == state->wRightMotorSpeed)); + + clock_t now = clock(); + double time_since_last_rumble = (double)(now - last_rumble_time[xuser]) / CLOCKS_PER_SEC; + bool rumble_interval_unelapsed = (time_since_last_rumble < RUMBLE_INTERVAL); + + if (rumble_state_unchanged || rumble_interval_unelapsed) + return true; if (!g_XInputSetState) return false; - return (g_XInputSetState(xuser, &g_xinput_rumble_states[xuser]) - == 0); + *state = new_state; + last_rumble_time[xuser] = now; + return (g_XInputSetState(xuser, state) == ERROR_SUCCESS); } input_device_driver_t xinput_joypad = { From c9bc94183083d3a20005577fe4c3c6a973f5f9a8 Mon Sep 17 00:00:00 2001 From: libretroadmin Date: Wed, 28 May 2025 17:32:14 +0200 Subject: [PATCH 144/175] move microphone_driver.c inside audio_driver.c. This way we can move some of the defines from audio_defines.h into audio_driver.c --- Makefile.common | 1 - audio/audio_defines.h | 6 - audio/audio_driver.c | 841 ++++++++++++++++++++++++++++++++++++- audio/microphone_driver.c | 849 -------------------------------------- griffin/griffin.c | 3 - 5 files changed, 839 insertions(+), 861 deletions(-) delete mode 100644 audio/microphone_driver.c diff --git a/Makefile.common b/Makefile.common index 2175fbd298..4596b84651 100644 --- a/Makefile.common +++ b/Makefile.common @@ -351,7 +351,6 @@ endif ifeq ($(HAVE_MICROPHONE), 1) DEFINES += -DHAVE_MICROPHONE - OBJ += audio/microphone_driver.o endif ifeq ($(HAVE_REWIND), 1) diff --git a/audio/audio_defines.h b/audio/audio_defines.h index d68a6beee9..67ef8c75dd 100644 --- a/audio/audio_defines.h +++ b/audio/audio_defines.h @@ -21,12 +21,6 @@ RETRO_BEGIN_DECLS -/* So we don't get complete line-noise when fast-forwarding audio. */ -#define AUDIO_CHUNK_SIZE_NONBLOCKING 2048 - -#define AUDIO_MAX_RATIO 16 -#define AUDIO_MIN_RATIO 0.0625 - #define AUDIO_MIXER_MAX_STREAMS 16 #define AUDIO_MIXER_MAX_SYSTEM_STREAMS (AUDIO_MIXER_MAX_STREAMS + 8) diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 99f77bfc0e..0e3732a4e3 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -1,7 +1,8 @@ /** * RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2011-2025 - Daniel De Matteis + * Copyright (C) 2023-2025 - Jesse Talavera-Greenberg * * RetroArch is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free @@ -18,9 +19,11 @@ **/ #include +#include #include "audio_driver.h" +#include #include #include #include @@ -28,6 +31,7 @@ #include #include