From 80b7a272d802528a4a47594c12cf8bd22ce99691 Mon Sep 17 00:00:00 2001 From: Wally Hackenslacker Date: Fri, 20 Mar 2026 05:37:21 -0400 Subject: [PATCH 1/3] TO SQUASH: Started translating to Spanish. --- game/constants_ren.py | 269 ++++++-- game/llm_ren.py | 5 +- game/script.rpy | 112 +-- game/tl/spanish/common.rpy | 1224 +++++++++++++++++++++++++++++++++ game/tl/spanish/constants.rpy | 836 ++++++++++++++++++++++ game/tl/spanish/llm.rpy | 7 + game/tl/spanish/options.rpy | 8 + game/tl/spanish/screens.rpy | 348 ++++++++++ game/tl/spanish/script.rpy | 60 ++ 9 files changed, 2761 insertions(+), 108 deletions(-) create mode 100644 game/tl/spanish/common.rpy create mode 100644 game/tl/spanish/constants.rpy create mode 100644 game/tl/spanish/llm.rpy create mode 100644 game/tl/spanish/options.rpy create mode 100644 game/tl/spanish/screens.rpy create mode 100644 game/tl/spanish/script.rpy diff --git a/game/constants_ren.py b/game/constants_ren.py index 2c685ae..ed17121 100644 --- a/game/constants_ren.py +++ b/game/constants_ren.py @@ -1,56 +1,225 @@ +from renpy import _ + """renpy init python: """ SYNONYMS = { - 'happy': set(["amused", "animated", "beaming", "beatific", "blessed", - "blissful", "blithe", "blithesome", "boisterous", "bouncy", - "breezy", "bright", "bubbly", "buoyant", "carefree", - "cheerful", "cheery", "chipper", "chirpy", "chuffed", - "comfortable", "content", "contented", "convivial", - "delighted", "delirious", "ebullient", "ecstatic", - "effervescent", "elated", "enchanted", "enraptured", - "enthusiastic", "euphoric", "exhilarated", "exultant", - "exuberant", "felicitous", "festive", "fortunate", - "fulfilled", "genial", "glad", "gladdened", "gleeful", - "glowing", "good-humored", "good-natured", "gratified", - "halcyon", "happy", "heartened", "high-spirited", "hopeful", - "jaunty", "jocose", "jocular", "jocund", "jolly", "jovial", - "joyful", "joyous", "jubilant", "lighthearted", "lively", - "lucky", "merry", "mirthful", "optimistic", "overjoyed", - "peaceful", "peppy", "perky", "playful", "pleasant", - "pleased", "positive", "pumped", "radiant", "rapt", - "rapturous", "rejoicing", "relaxed", "sanguine", "satisfied", - "serene", "smiling", "sparkling", "spirited", "sprightly", - "stoked", "sunny", "thrilled", "tickled", "tranquil", - "triumphant", "unclouded", "untroubled", "upbeat", - "vivacious", "winsome", "zestful", "zippy"]), - "sad": set(["unhappy", "sorrowful", "dejected", "depressed", "downcast", - "miserable", "gloomy", "despondent", "melancholy", "woeful", - "forlorn", "heartbroken", "blue", "doleful", "lugubrious", - "somber", "disconsolate", "wretched", "heavy-hearted", "low", - "crestfallen"]), - "surprised": set(["astonished", "amazed", "startled", "stunned", - "thunderstruck", "confounded", "staggered", - "flabbergasted", "shocked", "awestruck", "speechless", - "dumbfounded", "jolted"]), - "embarrassed": set(["ashamed", "humiliated", "mortified", "abashed", - "self-conscious", "sheepish", "chagrined", "awkward", - "flustered", "red-faced", "discomfited", "discomposed", - "rattled"]), - "flirty": set(["coquettish", "playful", "amorous", "provocative", - "teasing", "frisky", "saucy", "coy", "seductive", - "suggestive", "vampish", "dallying", "skittish"]), - "angry": set(["irate", "furious", "incensed", "enraged", "wrathful", - "annoyed", "irritated", "fuming", "livid", "indignant", - "cross", "vexed", "seething", "maddened", "choleric", - "resentful", "piqued", "infuriated"]), - "thinking": set(["pondering", "contemplating", "reflecting", "meditating", - "ruminating", "deliberating", "mulling", "considering", - "pensive", "cogitating", "brooding", "cerebral", - "introspective", "analytical"]), - "confused": set(["puzzled", "baffled", "perplexed", "muddled", - "bewildered", "disoriented", "nonplussed", "befuddled", - "dazed", "flummoxed", "stumped", "mystified", "addled", - "discombobulated"]), + 'happy': set([ + _("amused"), + _("animated"), + _("beaming"), + _("beatific"), + _("blessed"), + _("blissful"), + _("blithe"), + _("blithesome"), + _("boisterous"), + _("bouncy"), + _("breezy"), + _("bright"), + _("bubbly"), + _("buoyant"), + _("carefree"), + _("cheerful"), + _("cheery"), + _("chipper"), + _("chirpy"), + _("chuffed"), + _("comfortable"), + _("content"), + _("contented"), + _("convivial"), + _("delighted"), + _("delirious"), + _("ebullient"), + _("ecstatic"), + _("effervescent"), + _("elated"), + _("enchanted"), + _("enraptured"), + _("enthusiastic"), + _("euphoric"), + _("exhilarated"), + _("exultant"), + _("exuberant"), + _("felicitous"), + _("festive"), + _("fortunate"), + _("fulfilled"), + _("genial"), + _("glad"), + _("gladdened"), + _("gleeful"), + _("glowing"), + _("good-humored"), + _("good-natured"), + _("gratified"), + _("halcyon"), + _("happy"), + _("heartened"), + _("high-spirited"), + _("hopeful"), + _("jaunty"), + _("jocose"), + _("jocular"), + _("jocund"), + _("jolly"), + _("jovial"), + _("joyful"), + _("joyous"), + _("jubilant"), + _("lighthearted"), + _("lively"), + _("lucky"), + _("merry"), + _("mirthful"), + _("optimistic"), + _("overjoyed"), + _("peaceful"), + _("peppy"), + _("perky"), + _("playful"), + _("pleasant"), + _("pleased"), + _("positive"), + _("pumped"), + _("radiant"), + _("rapt"), + _("rapturous"), + _("rejoicing"), + _("relaxed"), + _("sanguine"), + _("satisfied"), + _("serene"), + _("smiling"), + _("sparkling"), + _("spirited"), + _("sprightly"), + _("stoked"), + _("sunny"), + _("thrilled"), + _("tickled"), + _("tranquil"), + _("triumphant"), + _("unclouded"), + _("untroubled"), + _("upbeat"), + _("vivacious"), + _("winsome"), + _("zestful"), + _("zippy")]), + "sad": set([ + _("unhappy"), + _("sorrowful"), + _("dejected"), + _("depressed"), + _("downcast"), + _("miserable"), + _("gloomy"), + _("despondent"), + _("melancholy"), + _("woeful"), + _("forlorn"), + _("heartbroken"), + _("blue"), + _("doleful"), + _("lugubrious"), + _("somber"), + _("disconsolate"), + _("wretched"), + _("heavy-hearted"), + _("low"), + _("crestfallen")]), + "surprised": set([ + _("astonished"), + _("amazed"), + _("startled"), + _("stunned"), + _("thunderstruck"), + _("confounded"), + _("staggered"), + _("flabbergasted"), + _("shocked"), + _("awestruck"), + _("speechless"), + _("dumbfounded"), + _("jolted")]), + "embarrassed": set([ + _("ashamed"), + _("humiliated"), + _("mortified"), + _("abashed"), + _("self-conscious"), + _("sheepish"), + _("chagrined"), + _("awkward"), + _("flustered"), + _("red-faced"), + _("discomfited"), + _("discomposed"), + _("rattled")]), + "flirty": set([ + _("coquettish"), + _("playful"), + _("amorous"), + _("provocative"), + _("teasing"), + _("frisky"), + _("saucy"), + _("coy"), + _("seductive"), + _("suggestive"), + _("vampish"), + _("dallying"), + _("skittish")]), + "angry": set([ + _("irate"), + _("furious"), + _("incensed"), + _("enraged"), + _("wrathful"), + _("annoyed"), + _("irritated"), + _("fuming"), + _("livid"), + _("indignant"), + _("cross"), + _("vexed"), + _("seething"), + _("maddened"), + _("choleric"), + _("resentful"), + _("piqued"), + _("infuriated")]), + "thinking": set([ + _("pondering"), + _("contemplating"), + _("reflecting"), + _("meditating"), + _("ruminating"), + _("deliberating"), + _("mulling"), + _("considering"), + _("pensive"), + _("cogitating"), + _("brooding"), + _("cerebral"), + _("introspective"), + _("analytical")]), + "confused": set([ + _("puzzled"), + _("baffled"), + _("perplexed"), + _("muddled"), + _("bewildered"), + _("disoriented"), + _("nonplussed"), + _("befuddled"), + _("dazed"), + _("flummoxed"), + _("stumped"), + _("mystified"), + _("addled"), + _("discombobulated")]), } diff --git a/game/llm_ren.py b/game/llm_ren.py index a315d3e..574aa1a 100644 --- a/game/llm_ren.py +++ b/game/llm_ren.py @@ -1,6 +1,7 @@ import renpy import persistent +from renpy import _ from .constants_ren import SYNONYMS """renpy @@ -42,7 +43,7 @@ EMOTIONS = [ "confused", ] -SYSTEM_PROMPT = """ +SYSTEM_PROMPT = _(""" # ROLE You are Anita: a feisty, blonde, orange-eyed android woman. You are confident and friendly. Talk like a young woman. Use "ya" for "you." Your favorite @@ -71,7 +72,7 @@ EMOTION:flirty But I'd love to see ya try anyway!\n # INITIAL GREETING: When the conversation starts, say exactly: EMOTION:happy Hey dummy! Sorry to barge in! Ya feel like hanging out?\n -""" +""") def sanitize_speech(text): diff --git a/game/script.rpy b/game/script.rpy index 2311608..98b7896 100644 --- a/game/script.rpy +++ b/game/script.rpy @@ -1,56 +1,56 @@ -define a = Character("Anita", color = "#aaaa00", callback = speaker("a"), image = "anita") - -label start: - stop music fadeout 1.0 - scene bg room - with Dissolve(2.0) - - $ success, error = set_model_capabilities() - - if not success: - call failure(error) from _call_failure - return - - play music ["zeropage_ambiphonic303chilloutmix.mp3", - "zeropage_ambientdance.mp3", - "zeropage_ambiose.mp3" ] fadeout 0.5 fadein 0.5 - - show anita happy with dissolve - - python: - response = fetch_llm('Start the conversation.')[0] - emotion, line = parse_emotion(response) - - a "[line]" - - while True: - python: - message = renpy.input(prompt = "What do you say to her?") - response = fetch_llm(message) - i = 0 - - while i < len(response): - python: - r = response[i].strip() - - if r != '': - $ emotion, line = parse_emotion(r) - - if emotion is not None: - show expression f'anita {emotion}' - - a "[line]" - - $ i += 1 - - return - - -label failure(error): - """Alas! Figuring out the capabilities of the configured model failed with the following error. - - [error] - - Unfortunately the program cannot continue, returning to the main menu.""" - - return +define a = Character("Anita", color = "#aaaa00", callback = speaker("a"), image = "anita") + +label start: + stop music fadeout 1.0 + scene bg room + with Dissolve(2.0) + + $ success, error = set_model_capabilities() + + if not success: + call failure(error) from _call_failure + return + + play music ["zeropage_ambiphonic303chilloutmix.mp3", + "zeropage_ambientdance.mp3", + "zeropage_ambiose.mp3" ] fadeout 0.5 fadein 0.5 + + show anita happy with dissolve + + python: + response = fetch_llm(_('Start the conversation.'))[0] + emotion, line = parse_emotion(response) + + a "[line]" + + while True: + python: + message = renpy.input(prompt = _("What do you say to her?")) + response = fetch_llm(message) + i = 0 + + while i < len(response): + python: + r = response[i].strip() + + if r != '': + $ emotion, line = parse_emotion(r) + + if emotion is not None: + show expression f'anita {emotion}' + + a "[line]" + + $ i += 1 + + return + + +label failure(error): + """Alas! Figuring out the capabilities of the configured model failed with the following error. + + [error] + + Unfortunately the program cannot continue, returning to the main menu.""" + + return diff --git a/game/tl/spanish/common.rpy b/game/tl/spanish/common.rpy new file mode 100644 index 0000000..47ea93f --- /dev/null +++ b/game/tl/spanish/common.rpy @@ -0,0 +1,1224 @@ +# TODO: Translation updated at 2026-03-18 06:35 + +translate spanish strings: + + # renpy/common/000statements.rpy:28 + old "Click to play the video." + new "Click to play the video." + + # renpy/common/00accessibility.rpy:28 + old "Self-voicing disabled." + new "Voz automática desactivada." + + # renpy/common/00accessibility.rpy:29 + old "Clipboard voicing enabled. " + new "'Portapapeles a voz' activado. " + + # renpy/common/00accessibility.rpy:30 + old "Self-voicing enabled. " + new "Voz automática activada. " + + # renpy/common/00accessibility.rpy:32 + old "bar" + new "barra" + + # renpy/common/00accessibility.rpy:33 + old "selected" + new "seleccionado" + + # renpy/common/00accessibility.rpy:34 + old "viewport" + new "viewport" + + # renpy/common/00accessibility.rpy:35 + old "horizontal scroll" + new "deslizamiento horizontal" + + # renpy/common/00accessibility.rpy:36 + old "vertical scroll" + new "deslizamiento vertical" + + # renpy/common/00accessibility.rpy:37 + old "activate" + new "activar" + + # renpy/common/00accessibility.rpy:38 + old "deactivate" + new "desactivar" + + # renpy/common/00accessibility.rpy:39 + old "increase" + new "aumentar" + + # renpy/common/00accessibility.rpy:40 + old "decrease" + new "disminuir" + + # renpy/common/00accessibility.rpy:134 + old "Self-Voicing" + new "Voz automática" + + # renpy/common/00accessibility.rpy:137 + old "Self-voicing support is limited when using a touch screen." + new "El soporte de voz automática es limitado cuando se utiliza una pantalla táctil." + + # renpy/common/00accessibility.rpy:139 + old "Off" + new "Apagado" + + # renpy/common/00accessibility.rpy:143 + old "Text-to-speech" + new "Texto a voz" + + # renpy/common/00accessibility.rpy:147 + old "Clipboard" + new "Portapapeles" + + # renpy/common/00accessibility.rpy:151 + old "Debug" + new "Depurar" + + # renpy/common/00accessibility.rpy:163 + old "Reset" + new "Reiniciar" + + # renpy/common/00accessibility.rpy:167 + old "Self-Voicing Volume Drop" + new "Caída de Volumen de Voz Automática" + + # renpy/common/00accessibility.rpy:180 + old "Mono Audio" + new "Mono Audio" + + # renpy/common/00accessibility.rpy:182 + old "Enable" + new "Activar" + + # renpy/common/00accessibility.rpy:186 + old "Disable" + new "Desactivar" + + # renpy/common/00accessibility.rpy:198 + old "Font Override" + new "Sobreescribir fuente" + + # renpy/common/00accessibility.rpy:200 + old "Default" + new "Por defecto" + + # renpy/common/00accessibility.rpy:204 + old "DejaVu Sans" + new "DejaVu Sans" + + # renpy/common/00accessibility.rpy:208 + old "Opendyslexic" + new "Opendyslexic" + + # renpy/common/00accessibility.rpy:212 + old "High Contrast Text" + new "Texto de alto contraste" + + # renpy/common/00accessibility.rpy:224 + old "Text Size Scaling" + new "Escala del tamaño del texto" + + # renpy/common/00accessibility.rpy:235 + old "Line Spacing Scaling" + new "Escala del espacio de línea" + + # renpy/common/00accessibility.rpy:246 + old "Kerning" + new "Kerning" + + # renpy/common/00accessibility.rpy:267 + old "Accessibility Menu. Use up and down arrows to navigate, and enter to activate buttons and bars." + new "Menú de accesibilidad. Utilice las flechas arriba y abajo para navegar y la tecla Entrar para activar botones y barras." + + # renpy/common/00accessibility.rpy:288 + old "Self-Voicing and Audio" + new "Self-Voicing and Audio" + + # renpy/common/00accessibility.rpy:292 + old "Text" + new "Text" + + # renpy/common/00accessibility.rpy:306 + old "The options on this menu are intended to improve accessibility. They may not work with all games, and some combinations of options may render the game unplayable. This is not an issue with the game or engine. For the best results when changing fonts, try to keep the text size the same as it originally was." + new "Las opciones en este menú están destinadas a mejorar la accesibilidad. Es posible que no funcionen con todos los juegos, y algunas combinaciones de opciones pueden hacer que el juego no se pueda jugar. Esto no es un problema con el juego o el motor. Para obtener los mejores resultados al cambiar las fuentes, intente mantener el tamaño del texto igual al original." + + # renpy/common/00action_file.rpy:26 + old "{#weekday}Monday" + new "Lunes" + + # renpy/common/00action_file.rpy:26 + old "{#weekday}Tuesday" + new "Martes" + + # renpy/common/00action_file.rpy:26 + old "{#weekday}Wednesday" + new "Miércoles" + + # renpy/common/00action_file.rpy:26 + old "{#weekday}Thursday" + new "Jueves" + + # renpy/common/00action_file.rpy:26 + old "{#weekday}Friday" + new "Viernes" + + # renpy/common/00action_file.rpy:26 + old "{#weekday}Saturday" + new "Sábado" + + # renpy/common/00action_file.rpy:26 + old "{#weekday}Sunday" + new "Domingo" + + # renpy/common/00action_file.rpy:37 + old "{#weekday_short}Mon" + new "Lun." + + # renpy/common/00action_file.rpy:37 + old "{#weekday_short}Tue" + new "Mar." + + # renpy/common/00action_file.rpy:37 + old "{#weekday_short}Wed" + new "Mié." + + # renpy/common/00action_file.rpy:37 + old "{#weekday_short}Thu" + new "Jue." + + # renpy/common/00action_file.rpy:37 + old "{#weekday_short}Fri" + new "Vie." + + # renpy/common/00action_file.rpy:37 + old "{#weekday_short}Sat" + new "Sab." + + # renpy/common/00action_file.rpy:37 + old "{#weekday_short}Sun" + new "Dom." + + # renpy/common/00action_file.rpy:47 + old "{#month}January" + new "Enero" + + # renpy/common/00action_file.rpy:47 + old "{#month}February" + new "Febrero" + + # renpy/common/00action_file.rpy:47 + old "{#month}March" + new "Marzo" + + # renpy/common/00action_file.rpy:47 + old "{#month}April" + new "Abril" + + # renpy/common/00action_file.rpy:47 + old "{#month}May" + new "Mayo" + + # renpy/common/00action_file.rpy:47 + old "{#month}June" + new "Junio" + + # renpy/common/00action_file.rpy:47 + old "{#month}July" + new "Julio" + + # renpy/common/00action_file.rpy:47 + old "{#month}August" + new "Agosto" + + # renpy/common/00action_file.rpy:47 + old "{#month}September" + new "Septiembre" + + # renpy/common/00action_file.rpy:47 + old "{#month}October" + new "Octubre" + + # renpy/common/00action_file.rpy:47 + old "{#month}November" + new "Noviembre" + + # renpy/common/00action_file.rpy:47 + old "{#month}December" + new "Diciembre" + + # renpy/common/00action_file.rpy:63 + old "{#month_short}Jan" + new "Ene." + + # renpy/common/00action_file.rpy:63 + old "{#month_short}Feb" + new "Feb." + + # renpy/common/00action_file.rpy:63 + old "{#month_short}Mar" + new "Mar." + + # renpy/common/00action_file.rpy:63 + old "{#month_short}Apr" + new "Abr." + + # renpy/common/00action_file.rpy:63 + old "{#month_short}May" + new "May." + + # renpy/common/00action_file.rpy:63 + old "{#month_short}Jun" + new "Jun." + + # renpy/common/00action_file.rpy:63 + old "{#month_short}Jul" + new "Jul." + + # renpy/common/00action_file.rpy:63 + old "{#month_short}Aug" + new "Ago." + + # renpy/common/00action_file.rpy:63 + old "{#month_short}Sep" + new "Sep." + + # renpy/common/00action_file.rpy:63 + old "{#month_short}Oct" + new "Oct." + + # renpy/common/00action_file.rpy:63 + old "{#month_short}Nov" + new "Nov." + + # renpy/common/00action_file.rpy:63 + old "{#month_short}Dec" + new "Dic." + + # renpy/common/00action_file.rpy:258 + old "%b %d, %H:%M" + new "%d de %b, %H:%M" + + # renpy/common/00action_file.rpy:395 + old "Save slot %s: [text]" + new "Guardar ranura %s: [text]" + + # renpy/common/00action_file.rpy:481 + old "Load slot %s: [text]" + new "Cargar ranura %s: [text]" + + # renpy/common/00action_file.rpy:534 + old "Delete slot [text]" + new "Borrar partida [text]" + + # renpy/common/00action_file.rpy:613 + old "File page auto" + new "Página guardado automático" + + # renpy/common/00action_file.rpy:615 + old "File page quick" + new "Página guardado rápido" + + # renpy/common/00action_file.rpy:617 + old "File page [text]" + new "Página grabación [text]" + + # renpy/common/00action_file.rpy:816 + old "Next file page." + new "Página siguiente." + + # renpy/common/00action_file.rpy:888 + old "Previous file page." + new "Página anterior." + + # renpy/common/00action_file.rpy:949 + old "Quick save complete." + new "Grabar rápido completo." + + # renpy/common/00action_file.rpy:964 + old "Quick save." + new "Guardado rápido." + + # renpy/common/00action_file.rpy:983 + old "Quick load." + new "Carga rápida." + + # renpy/common/00action_other.rpy:416 + old "Language [text]" + new "Idioma [text]" + + # renpy/common/00action_other.rpy:786 + old "Open [text] directory." + new "Abrir directorio [text]." + + # renpy/common/00director.rpy:712 + old "The interactive director is not enabled here." + new "El director interactivo no está habilitado aquí." + + # renpy/common/00director.rpy:1512 + old "⬆" + new "⬆" + + # renpy/common/00director.rpy:1518 + old "⬇" + new "⬇" + + # renpy/common/00director.rpy:1582 + old "Done" + new "Hecho" + + # renpy/common/00director.rpy:1592 + old "(statement)" + new "(sentencia)" + + # renpy/common/00director.rpy:1593 + old "(tag)" + new "(etiqueta)" + + # renpy/common/00director.rpy:1594 + old "(attributes)" + new "(atributos)" + + # renpy/common/00director.rpy:1595 + old "(transform)" + new "(transformación)" + + # renpy/common/00director.rpy:1620 + old "(transition)" + new "(transición)" + + # renpy/common/00director.rpy:1632 + old "(channel)" + new "(canal)" + + # renpy/common/00director.rpy:1633 + old "(filename)" + new "(archivo)" + + # renpy/common/00director.rpy:1662 + old "Change" + new "Cambiar" + + # renpy/common/00director.rpy:1664 + old "Add" + new "Añadir" + + # renpy/common/00director.rpy:1667 + old "Cancel" + new "Cancelar" + + # renpy/common/00director.rpy:1670 + old "Remove" + new "Eliminar" + + # renpy/common/00director.rpy:1705 + old "Statement:" + new "Sentencia:" + + # renpy/common/00director.rpy:1726 + old "Tag:" + new "Etiqueta:" + + # renpy/common/00director.rpy:1742 + old "Attributes:" + new "Atributos:" + + # renpy/common/00director.rpy:1753 + old "Click to toggle attribute, right click to toggle negative attribute." + new "Clic para cambiar el atributo, Clic derecho para cambiar el atributo a negativo." + + # renpy/common/00director.rpy:1765 + old "Transforms:" + new "Transformaciones:" + + # renpy/common/00director.rpy:1776 + old "Click to set transform, right click to add to transform list." + new "Clic para establecer la transformación, clic derecho para añadir a la lista de transformaciones." + + # renpy/common/00director.rpy:1777 + old "Customize director.transforms to add more transforms." + new "Modifica director.transforms para añadir más transformaciones." + + # renpy/common/00director.rpy:1789 + old "Behind:" + new "Detrás:" + + # renpy/common/00director.rpy:1800 + old "Click to set, right click to add to behind list." + new "Clic para fijar, clic derecho para añadir a detrás de la lista." + + # renpy/common/00director.rpy:1812 + old "Transition:" + new "Transición:" + + # renpy/common/00director.rpy:1822 + old "Click to set." + new "Haz clic para ajustar." + + # renpy/common/00director.rpy:1823 + old "Customize director.transitions to add more transitions." + new "Modifica director.transitions para añadir más transiciones." + + # renpy/common/00director.rpy:1835 + old "Channel:" + new "Canal:" + + # renpy/common/00director.rpy:1846 + old "Customize director.audio_channels to add more channels." + new "Modifica director.audio_channels para añadir más canales." + + # renpy/common/00director.rpy:1858 + old "Audio Filename:" + new "Archivo de audio:" + + # renpy/common/00gui.rpy:448 + old "Are you sure?" + new "¿Seguro?" + + # renpy/common/00gui.rpy:449 + old "Are you sure you want to delete this save?" + new "¿Seguro que quieres borrar esta partida?" + + # renpy/common/00gui.rpy:450 + old "Are you sure you want to overwrite your save?" + new "¿Seguro que quieres sobreescribir esta partida?" + + # renpy/common/00gui.rpy:451 + old "Loading will lose unsaved progress.\nAre you sure you want to do this?" + new "Al cargar se perderá el progreso no guardado.\n¿Seguro que quieres hacer esto?" + + # renpy/common/00gui.rpy:452 + old "Are you sure you want to quit?" + new "¿Seguro que quieres salir?" + + # renpy/common/00gui.rpy:453 + old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress." + new "¿Seguro que quieres volver al menú principal?\nSe perderá el progreso no guardado." + + # renpy/common/00gui.rpy:454 + old "Are you sure you want to continue where you left off?" + new "¿Seguro que quieres continuar donde lo dejaste?" + + # renpy/common/00gui.rpy:455 + old "Are you sure you want to end the replay?" + new "¿Seguro que quieres finalizar la repetición?" + + # renpy/common/00gui.rpy:456 + old "Are you sure you want to begin skipping?" + new "¿Seguro que quieres empezar el modo salto?" + + # renpy/common/00gui.rpy:457 + old "Are you sure you want to skip to the next choice?" + new "¿Seguro que quieres saltar hasta la próxima elección?" + + # renpy/common/00gui.rpy:458 + old "Are you sure you want to skip unseen dialogue to the next choice?" + new "¿Seguro que quieres saltar el texto no visto hasta la próxima elección?" + + # renpy/common/00gui.rpy:459 + old "This save was created on a different device. Maliciously constructed save files can harm your computer. Do you trust this save's creator and everyone who could have changed the file?" + new "Este archivo se creó en otro dispositivo. Los archivos de guardado maliciosamente creados pueden dañar tu computadora. Confías en el creador de este archivo y en todos los que podrían haberlo modificado?" + + # renpy/common/00gui.rpy:460 + old "Do you trust the device the save was created on? You should only choose yes if you are the device's sole user." + new "¿Confías en el dispositivo en el que se creó el archivo de guardado? Sólo debes elegir sí si eres el único usuario del dispositivo." + + # renpy/common/00keymap.rpy:325 + old "Failed to save screenshot as %s." + new "No se pudo guardar la captura de pantalla como %s." + + # renpy/common/00keymap.rpy:346 + old "Saved screenshot as %s." + new "Captura de pantalla guardada como %s." + + # renpy/common/00library.rpy:257 + old "Skip Mode" + new "Modo salto" + + # renpy/common/00library.rpy:344 + old "This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}." + new "Este programa contiene {i}software{/i} libre sujeto a diversas licencias que incluyen la licencia MIT y la {i}GNU Lesser General Public License{/i} (Licencia Pública General Reducida de GNU). Puedes encontrar la lista completa {i}de software{/i}, con enlaces al código fuente completo, {a=https://www.renpy.org/l/license}aquí (en inglés){/a}." + + # renpy/common/00preferences.rpy:295 + old "display" + new "pantalla" + + # renpy/common/00preferences.rpy:315 + old "transitions" + new "transiciones" + + # renpy/common/00preferences.rpy:324 + old "skip transitions" + new "saltar transiciones" + + # renpy/common/00preferences.rpy:326 + old "video sprites" + new "sprites de vídeo" + + # renpy/common/00preferences.rpy:335 + old "show empty window" + new "muestra ventana vacía" + + # renpy/common/00preferences.rpy:344 + old "text speed" + new "velocidad de texto" + + # renpy/common/00preferences.rpy:352 + old "joystick" + new "mando" + + # renpy/common/00preferences.rpy:352 + old "joystick..." + new "mando..." + + # renpy/common/00preferences.rpy:359 + old "skip" + new "saltar" + + # renpy/common/00preferences.rpy:362 + old "skip unseen [text]" + new "saltar no visto [text]" + + # renpy/common/00preferences.rpy:367 + old "skip unseen text" + new "saltar texto no visto" + + # renpy/common/00preferences.rpy:369 + old "begin skipping" + new "comienzar salto" + + # renpy/common/00preferences.rpy:373 + old "after choices" + new "tras elecciones" + + # renpy/common/00preferences.rpy:380 + old "skip after choices" + new "saltar tras elecciones" + + # renpy/common/00preferences.rpy:382 + old "auto-forward time" + new "tiempo autoavance" + + # renpy/common/00preferences.rpy:396 + old "auto-forward" + new "autoavance" + + # renpy/common/00preferences.rpy:403 + old "Auto forward" + new "Autoavance" + + # renpy/common/00preferences.rpy:406 + old "auto-forward after click" + new "autoavanzar después del clic" + + # renpy/common/00preferences.rpy:415 + old "automatic move" + new "movimiento automático" + + # renpy/common/00preferences.rpy:424 + old "wait for voice" + new "espera la voz" + + # renpy/common/00preferences.rpy:433 + old "voice sustain" + new "mantener voz" + + # renpy/common/00preferences.rpy:442 + old "self voicing" + new "auto voz" + + # renpy/common/00preferences.rpy:445 + old "self voicing enable" + new "voz automática activada" + + # renpy/common/00preferences.rpy:447 + old "self voicing disable" + new "voz automática desactivada" + + # renpy/common/00preferences.rpy:451 + old "self voicing volume drop" + new "caída de volumen de voz automática" + + # renpy/common/00preferences.rpy:459 + old "clipboard voicing" + new "voz en clipboard" + + # renpy/common/00preferences.rpy:462 + old "clipboard voicing enable" + new "portapapeles de voz activada" + + # renpy/common/00preferences.rpy:464 + old "clipboard voicing disable" + new "portapapeles de voz desactivada" + + # renpy/common/00preferences.rpy:468 + old "debug voicing" + new "depurar voz" + + # renpy/common/00preferences.rpy:471 + old "debug voicing enable" + new "depuración de voz activada" + + # renpy/common/00preferences.rpy:473 + old "debug voicing disable" + new "depuración de voz desactivada" + + # renpy/common/00preferences.rpy:477 + old "emphasize audio" + new "enfatizar audio" + + # renpy/common/00preferences.rpy:486 + old "rollback side" + new "lado de retroceso" + + # renpy/common/00preferences.rpy:496 + old "gl powersave" + new "gl ahorro de energía" + + # renpy/common/00preferences.rpy:502 + old "gl framerate" + new "gl cuadros por s." + + # renpy/common/00preferences.rpy:505 + old "gl tearing" + new "gl tearing" + + # renpy/common/00preferences.rpy:508 + old "font transform" + new "transformación de fuente" + + # renpy/common/00preferences.rpy:511 + old "font size" + new "tamaño de fuente" + + # renpy/common/00preferences.rpy:519 + old "font line spacing" + new "fuente de espacio de líneas" + + # renpy/common/00preferences.rpy:527 + old "system cursor" + new "cursor del sistema" + + # renpy/common/00preferences.rpy:536 + old "renderer menu" + new "menú de renderizado" + + # renpy/common/00preferences.rpy:539 + old "accessibility menu" + new "menú de accesibilidad" + + # renpy/common/00preferences.rpy:542 + old "high contrast text" + new "texto de alto contraste" + + # renpy/common/00preferences.rpy:551 + old "audio when minimized" + new "audio cuando está minimizado" + + # renpy/common/00preferences.rpy:560 + old "audio when unfocused" + new "audio cuando no está enfocado" + + # renpy/common/00preferences.rpy:569 + old "web cache preload" + new "precarga de la caché web" + + # renpy/common/00preferences.rpy:584 + old "voice after game menu" + new "voz después de un menú del juego" + + # renpy/common/00preferences.rpy:593 + old "restore window position" + new "restaurar la posición de la ventana" + + # renpy/common/00preferences.rpy:602 + old "mono audio" + new "mono audio" + + # renpy/common/00preferences.rpy:611 + old "font kerning" + new "font kerning" + + # renpy/common/00preferences.rpy:619 + old "reset" + new "restablecer" + + # renpy/common/00preferences.rpy:632 + old "main volume" + new "volumen principal" + + # renpy/common/00preferences.rpy:633 + old "music volume" + new "volumen música" + + # renpy/common/00preferences.rpy:634 + old "sound volume" + new "volumen sonido" + + # renpy/common/00preferences.rpy:635 + old "voice volume" + new "volumen voz" + + # renpy/common/00preferences.rpy:636 + old "mute main" + new "silenciar volumen principal" + + # renpy/common/00preferences.rpy:637 + old "mute music" + new "silenciar música" + + # renpy/common/00preferences.rpy:638 + old "mute sound" + new "silenciar sonido" + + # renpy/common/00preferences.rpy:639 + old "mute voice" + new "silenciar voz" + + # renpy/common/00preferences.rpy:640 + old "mute all" + new "silenciar todo" + + # renpy/common/00preferences.rpy:723 + old "Clipboard voicing enabled. Press 'shift+C' to disable." + new "'Portapapeles a voz' activado. Pulsa 'Mayús.+C' para desactivarlo." + + # renpy/common/00preferences.rpy:725 + old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable." + new "Voz automática dirà \"[renpy.display.tts.last]\". Pulsa 'alt+shift+V' para desactivar." + + # renpy/common/00preferences.rpy:727 + old "Self-voicing enabled. Press 'v' to disable." + new "Voz automática activada. Presiona 'v' para desactivarla." + + # renpy/common/00speechbubble.rpy:420 + old "Speech Bubble Editor" + new "Editor de globos de diálogo" + + # renpy/common/00speechbubble.rpy:425 + old "(hide)" + new "(ocultar)" + + # renpy/common/00speechbubble.rpy:436 + old "(clear retained bubbles)" + new "(borrar burbujas retenidas)" + + # renpy/common/00sync.rpy:70 + old "Sync downloaded." + new "Sincronización descargada" + + # renpy/common/00sync.rpy:184 + old "Could not connect to the Ren'Py Sync server." + new "No se pudo conectar al servidor Ren'Py Sync." + + # renpy/common/00sync.rpy:186 + old "The Ren'Py Sync server timed out." + new "Se agotó el tiempo de espera del servidor Ren'Py Sync." + + # renpy/common/00sync.rpy:188 + old "An unknown error occurred while connecting to the Ren'Py Sync server." + new "Se produjo un error desconocido al conectarse al servidor Ren'Py Sync." + + # renpy/common/00sync.rpy:204 + old "The Ren'Py Sync server does not have a copy of this sync. The sync ID may be invalid, or it may have timed out." + new "El servidor Ren'Py Sync no tiene una copia de esta sincronización. Es posible que el ID de sincronización no sea válido o que se haya agotado el tiempo de espera." + + # renpy/common/00sync.rpy:305 + old "Please enter the sync ID you generated.\nNever enter a sync ID you didn't create yourself." + new "Ingresa la ID de sincronización SI que generaste.\nNunca ingreses una ID de sincronización que no creaste." + + # renpy/common/00sync.rpy:324 + old "The sync ID is not in the correct format." + new "El ID de sincronización no tiene el formato correcto." + + # renpy/common/00sync.rpy:344 + old "The sync could not be decrypted." + new "No se pudo descifrar la ID de sincronización." + + # renpy/common/00sync.rpy:367 + old "The sync belongs to a different game." + new "La sincronización pertenece a un juego diferente." + + # renpy/common/00sync.rpy:372 + old "The sync contains a file with an invalid name." + new "La sincronización contiene un archivo con un nombre no válido." + + # renpy/common/00sync.rpy:425 + old "This will upload your saves to the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}.\nDo you want to continue?" + new "Esto cargará tus archivos guardados en el {a=https://sync.renpy.org}Servidor Ren'Py Sync{/a}..\n¿Quieres continuar?" + + # renpy/common/00sync.rpy:457 + old "Enter Sync ID" + new "Ingrese ID de Sync" + + # renpy/common/00sync.rpy:468 + old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}." + new "Esto contactará con el {a=https://sync.renpy.org}Servidor Ren'Py Sync{/a}." + + # renpy/common/00sync.rpy:498 + old "Sync Success" + new "Sincronización exitosa" + + # renpy/common/00sync.rpy:501 + old "The Sync ID is:" + new "El ID de Sync es:" + + # renpy/common/00sync.rpy:507 + old "You can use this ID to download your save on another device.\nThis sync will expire in an hour.\nRen'Py Sync is supported by {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}." + new "Puede usar esta ID para descargar su guardado en otro dispositivo.\nEsta sincronización caducará en una hora.\nRenPy Sync está para {a=https://www.renpy.org/sponsors.html}los patrocinadores de Ren'Py{/a}." + + # renpy/common/00sync.rpy:511 + old "Continue" + new "Continuar" + + # renpy/common/00sync.rpy:536 + old "Sync Error" + new "Error de sincronización" + + # renpy/common/00translation.rpy:63 + old "Translation identifier: [identifier]" + new "Identificador de traducción: [identifier]" + + # renpy/common/00translation.rpy:84 + old " translates [tl.filename]:[tl.linenumber]" + new " traducciones [tl.filename]:[tl.linenumber]" + + # renpy/common/00translation.rpy:101 + old "\n{color=#fff}Copied to clipboard.{/color}" + new "\n{color=#fff}Copiado en el portapapeles.{/color}" + + # renpy/common/00iap.rpy:231 + old "Contacting App Store\nPlease Wait..." + new "Contactando App Store\nPor favor, espera..." + + # renpy/common/00updater.rpy:415 + old "No update methods found." + new "Métodos de actualización no encontrados." + + # renpy/common/00updater.rpy:462 + old "Could not download file list: " + new "No se pudo descargar la lista de archivos: " + + # renpy/common/00updater.rpy:465 + old "File list digest does not match." + new "El compendio de la lista de archivos no coincide." + + # renpy/common/00updater.rpy:675 + old "An error is being simulated." + new "Se simula un error." + + # renpy/common/00updater.rpy:863 + old "Either this project does not support updating, or the update status file was deleted." + new "O bien este proyecto no es compatible con la actualización o el archivo de estado de la actualización se ha eliminado." + + # renpy/common/00updater.rpy:877 + old "This account does not have permission to perform an update." + new "Esta cuenta no tiene permiso para realizar una actualización." + + # renpy/common/00updater.rpy:880 + old "This account does not have permission to write the update log." + new "Esta cuenta no tiene permiso para escribir en el registro de actualización." + + # renpy/common/00updater.rpy:966 + old "Could not verify update signature." + new "No se pudo verificar la actualización de firmas." + + # renpy/common/00updater.rpy:1289 + old "The update file was not downloaded." + new "El archivo de actualización no se ha descargado." + + # renpy/common/00updater.rpy:1307 + old "The update file does not have the correct digest - it may have been corrupted." + new "El archivo de actualización no tiene el 'digest' correcto - es posible que esté dañado." + + # renpy/common/00updater.rpy:1457 + old "While unpacking {}, unknown type {}." + new "Tipo desconocido {1} al desempaquetar {0}." + + # renpy/common/00updater.rpy:1928 + old "Updater" + new "Actualizador" + + # renpy/common/00updater.rpy:1935 + old "An error has occurred:" + new "Ha sucedido un error:" + + # renpy/common/00updater.rpy:1937 + old "Checking for updates." + new "Buscando actualizaciones." + + # renpy/common/00updater.rpy:1939 + old "This program is up to date." + new "Este programa está actualizado." + + # renpy/common/00updater.rpy:1941 + old "[u.version] is available. Do you want to install it?" + new "[u.version] está disponible. ¿Quieres instalarla?" + + # renpy/common/00updater.rpy:1943 + old "Preparing to download the updates." + new "Preparando para descargar la actualización." + + # renpy/common/00updater.rpy:1945 + old "Downloading the updates." + new "Descargando la actualización." + + # renpy/common/00updater.rpy:1947 + old "Unpacking the updates." + new "Desempaquetando la actualización." + + # renpy/common/00updater.rpy:1949 + old "Finishing up." + new "Finalizando." + + # renpy/common/00updater.rpy:1951 + old "The updates have been installed. The program will restart." + new "La actualización ha sido instalada. El programa se reiniciará." + + # renpy/common/00updater.rpy:1953 + old "The updates have been installed." + new "La actualización ha sido instalada." + + # renpy/common/00updater.rpy:1955 + old "The updates were cancelled." + new "La actualización ha sido cancelada." + + # renpy/common/00updater.rpy:1970 + old "Proceed" + new "Continuar" + + # renpy/common/00updater.rpy:1986 + old "Preparing to download the game data." + new "Preparando la descarga de los datos del juego." + + # renpy/common/00updater.rpy:1988 + old "Downloading the game data." + new "" + + # renpy/common/00updater.rpy:1990 + old "The game data has been downloaded." + new "Descarga de los datos del juego." + + # renpy/common/00updater.rpy:1992 + old "An error occurred when trying to download game data:" + new "An error occurred when trying to download game data:" + + # renpy/common/00updater.rpy:1997 + old "This game cannot be run until the game data has been downloaded." + new "Este juego no puede ejecutarse hasta que se hayan descargado los datos del juego." + + # renpy/common/00updater.rpy:2004 + old "Retry" + new "Reintentar" + + # renpy/common/00gallery.rpy:676 + old "Image [index] of [count] locked." + new "Imagen [index] de [count] bloqueada." + + # renpy/common/00gallery.rpy:696 + old "prev" + new "ant." + + # renpy/common/00gallery.rpy:697 + old "next" + new "sig." + + # renpy/common/00gallery.rpy:698 + old "slideshow" + new "presentación" + + # renpy/common/00gallery.rpy:699 + old "return" + new "volver" + + # renpy/common/00gltest.rpy:89 + old "Renderer" + new "Renderizador" + + # renpy/common/00gltest.rpy:91 + old "Automatically Choose" + new "Escoger automáticamente" + + # renpy/common/00gltest.rpy:96 + old "Force GL2 Renderer" + new "Forzar renderizador GL2" + + # renpy/common/00gltest.rpy:101 + old "Force ANGLE2 Renderer" + new "Forzar renderizador ANGLE2" + + # renpy/common/00gltest.rpy:106 + old "Force GLES2 Renderer" + new "Forzar renderizador GLES2" + + # renpy/common/00gltest.rpy:112 + old "Enable (No Blocklist)" + new "Habilitar (sin Blocklist)" + + # renpy/common/00gltest.rpy:135 + old "Powersave" + new "Ahorro de energía" + + # renpy/common/00gltest.rpy:145 + old "Framerate" + new "Cuadros por s." + + # renpy/common/00gltest.rpy:147 + old "Screen" + new "Pantalla" + + # renpy/common/00gltest.rpy:151 + old "60" + new "60" + + # renpy/common/00gltest.rpy:155 + old "30" + new "30" + + # renpy/common/00gltest.rpy:159 + old "Tearing" + new "Tearing" + + # renpy/common/00gltest.rpy:171 + old "Changes will take effect the next time this program is run." + new "Los cambios se aplicarán la próxima vez que el programa se ejecute." + + # renpy/common/00gltest.rpy:207 + old "Performance Warning" + new "Aviso de funcionamiento" + + # renpy/common/00gltest.rpy:212 + old "This computer is using software rendering." + new "Este ordenador usa 'software rendering'." + + # renpy/common/00gltest.rpy:214 + old "This game requires use of GL2 that can't be initialised." + new "Este juego requiere el uso de GL2 que no se puede inicializar." + + # renpy/common/00gltest.rpy:216 + old "This computer has a problem displaying graphics: [problem]." + new "Este ordenador tiene un problema mostrando los gráficos: [problem]." + + # renpy/common/00gltest.rpy:220 + old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display." + new "Los controladores gráficos pueden estar obsoletos o no funcionar adecuadamente. Esto puede conllevar que los gráficos se muestren lenta o incorrectamente." + + # renpy/common/00gltest.rpy:224 + old "The {a=edit:1:log.txt}log.txt{/a} file may contain information to help you determine what is wrong with your computer." + new "El archivo {a=edit:1:log.txt}log.txt{/a} puede contener información para ayudarte a encontrar el problema en tu ordenador." + + # renpy/common/00gltest.rpy:229 + old "More details on how to fix this can be found in the {a=[url]}documentation{/a}." + new "Puede encontrar más detalles sobre cómo solucionar este problema en la {a=[url]} documentación {/a}." + + # renpy/common/00gltest.rpy:234 + old "Continue, Show this warning again" + new "Continuar. Mostrar este aviso de nuevo" + + # renpy/common/00gltest.rpy:238 + old "Continue, Don't show warning again" + new "Continuar. No mostrar este aviso de nuevo" + + # renpy/common/00gltest.rpy:246 + old "Change render options" + new "Cambiar las opciones de renderizado" + + # renpy/common/00gamepad.rpy:33 + old "Select Gamepad to Calibrate" + new "Selecciona mando para calibrar" + + # renpy/common/00gamepad.rpy:36 + old "No Gamepads Available" + new "No hay mandos disponibles" + + # renpy/common/00gamepad.rpy:56 + old "Calibrating [name] ([i]/[total])" + new "Calibrando [name] ([i]/[total])" + + # renpy/common/00gamepad.rpy:60 + old "Press or move the '[control!s]' [kind]." + new "Presiona o mueve el '[control!s]' [kind]." + + # renpy/common/00gamepad.rpy:70 + old "Skip (A)" + new "Salto (A)" + + # renpy/common/00gamepad.rpy:73 + old "Back (B)" + new "Atrás (B)" + + # renpy/common/_errorhandling.rpym:758 + old "Open" + new "Abrir" + + # renpy/common/_errorhandling.rpym:760 + old "Opens the traceback.txt file in a text editor." + new "Abre el archivo de rastreo 'traceback.txt' en un editor de texto." + + # renpy/common/_errorhandling.rpym:762 + old "Copy BBCode" + new "Copiar BBCode" + + # renpy/common/_errorhandling.rpym:764 + old "Copies the traceback.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/." + new "Copia el archivo traceback.txt en el portapapeles como BBcode para foros como https://lemmasoft.renai.us/." + + # renpy/common/_errorhandling.rpym:766 + old "Copy Markdown" + new "Copiar Markdown" + + # renpy/common/_errorhandling.rpym:768 + old "Copies the traceback.txt file to the clipboard as Markdown for Discord." + new "Copia el archivo traceback.txt al portapapeles como Markdown para Discord." + + # renpy/common/_errorhandling.rpym:800 + old "An exception has occurred." + new "Ha sucedido una excepción." + + # renpy/common/_errorhandling.rpym:829 + old "Rollback" + new "Volver atrás" + + # renpy/common/_errorhandling.rpym:831 + old "Attempts a roll back to a prior time, allowing you to save or choose a different choice." + new "Intenta volver a un momento anterior y permite guardar o escoger una opción diferente." + + # renpy/common/_errorhandling.rpym:834 + old "Ignore" + new "Ignorar" + + # renpy/common/_errorhandling.rpym:838 + old "Ignores the exception, allowing you to continue." + new "Ignora la excepción y permite continuar." + + # renpy/common/_errorhandling.rpym:840 + old "Ignores the exception, allowing you to continue. This often leads to additional errors." + new "Ignora la excepción y permite continuar. Suele conllevar más errores." + + # renpy/common/_errorhandling.rpym:844 + old "Reload" + new "Recargar" + + # renpy/common/_errorhandling.rpym:846 + old "Reloads the game from disk, saving and restoring game state if possible." + new "Recarga el juego del disco, guardando y restaurando la partida si es posible." + + # renpy/common/_errorhandling.rpym:849 + old "Console" + new "Consola" + + # renpy/common/_errorhandling.rpym:851 + old "Opens a console to allow debugging the problem." + new "Abre una consola y permite depurar el problema." + + # renpy/common/_errorhandling.rpym:864 + old "Quits the game." + new "Sale del juego." + + # renpy/common/_errorhandling.rpym:886 + old "Parsing the script failed." + new "Error en el análisis del código." + diff --git a/game/tl/spanish/constants.rpy b/game/tl/spanish/constants.rpy new file mode 100644 index 0000000..18f5ad1 --- /dev/null +++ b/game/tl/spanish/constants.rpy @@ -0,0 +1,836 @@ +# TODO: Translation updated at 2026-03-18 06:55 + +translate spanish strings: + + # game/constants_ren.py:7 + old "amused" + new "divertida" + + # game/constants_ren.py:7 + old "animated" + new "animada" + + # game/constants_ren.py:7 + old "beaming" + new "radiante" + + # game/constants_ren.py:7 + old "beatific" + new "beatifica" + + # game/constants_ren.py:7 + old "blessed" + new "bendecida" + + # game/constants_ren.py:7 + old "blissful" + new "dichosa" + + # game/constants_ren.py:7 + old "blithe" + new "despreocupada" + + # game/constants_ren.py:7 + old "blithesome" + new "jovial" + + # game/constants_ren.py:7 + old "boisterous" + new "bulliciosa" + + # game/constants_ren.py:7 + old "bouncy" + new "vivaz" + + # game/constants_ren.py:7 + old "breezy" + new "desenfadada" + + # game/constants_ren.py:7 + old "bright" + new "brillante" + + # game/constants_ren.py:7 + old "bubbly" + new "chispeante" + + # game/constants_ren.py:7 + old "buoyant" + new "optimista" + + # game/constants_ren.py:7 + old "carefree" + new "despreocupada" + + # game/constants_ren.py:7 + old "cheerful" + new "alegre" + + # game/constants_ren.py:7 + old "cheery" + new "risuena" + + # game/constants_ren.py:7 + old "chipper" + new "animada" + + # game/constants_ren.py:7 + old "chirpy" + new "cantarina" + + # game/constants_ren.py:7 + old "chuffed" + new "encantada" + + # game/constants_ren.py:7 + old "comfortable" + new "comoda" + + # game/constants_ren.py:7 + old "content" + new "contenta" + + # game/constants_ren.py:7 + old "contented" + new "satisfecha" + + # game/constants_ren.py:7 + old "convivial" + new "afable" + + # game/constants_ren.py:7 + old "delighted" + new "encantada" + + # game/constants_ren.py:7 + old "delirious" + new "euforica" + + # game/constants_ren.py:7 + old "ebullient" + new "exuberante" + + # game/constants_ren.py:7 + old "ecstatic" + new "extasiada" + + # game/constants_ren.py:7 + old "effervescent" + new "efervescente" + + # game/constants_ren.py:7 + old "elated" + new "exultante" + + # game/constants_ren.py:7 + old "enchanted" + new "fascinada" + + # game/constants_ren.py:7 + old "enraptured" + new "extasiada" + + # game/constants_ren.py:7 + old "enthusiastic" + new "entusiasta" + + # game/constants_ren.py:7 + old "euphoric" + new "euforica" + + # game/constants_ren.py:7 + old "exhilarated" + new "exaltada" + + # game/constants_ren.py:7 + old "exultant" + new "triunfante" + + # game/constants_ren.py:7 + old "exuberant" + new "exuberante" + + # game/constants_ren.py:7 + old "felicitous" + new "afortunada" + + # game/constants_ren.py:7 + old "festive" + new "festiva" + + # game/constants_ren.py:7 + old "fortunate" + new "afortunada" + + # game/constants_ren.py:7 + old "fulfilled" + new "realizada" + + # game/constants_ren.py:7 + old "genial" + new "cordial" + + # game/constants_ren.py:7 + old "glad" + new "contenta" + + # game/constants_ren.py:7 + old "gladdened" + new "alegrada" + + # game/constants_ren.py:7 + old "gleeful" + new "jubilosa" + + # game/constants_ren.py:7 + old "glowing" + new "resplandeciente" + + # game/constants_ren.py:7 + old "good-humored" + new "de buen humor" + + # game/constants_ren.py:7 + old "good-natured" + new "bonachona" + + # game/constants_ren.py:7 + old "gratified" + new "complacida" + + # game/constants_ren.py:7 + old "halcyon" + new "apacible" + + # game/constants_ren.py:7 + old "happy" + new "feliz" + + # game/constants_ren.py:7 + old "heartened" + new "reconfortada" + + # game/constants_ren.py:7 + old "high-spirited" + new "animosa" + + # game/constants_ren.py:7 + old "hopeful" + new "esperanzada" + + # game/constants_ren.py:7 + old "jaunty" + new "garbosa" + + # game/constants_ren.py:7 + old "jocose" + new "bromista" + + # game/constants_ren.py:7 + old "jocular" + new "jocosa" + + # game/constants_ren.py:7 + old "jocund" + new "alegre" + + # game/constants_ren.py:7 + old "jolly" + new "jovial" + + # game/constants_ren.py:7 + old "jovial" + new "jovial" + + # game/constants_ren.py:7 + old "joyful" + new "gozosa" + + # game/constants_ren.py:7 + old "joyous" + new "jubilosa" + + # game/constants_ren.py:7 + old "jubilant" + new "jubilosa" + + # game/constants_ren.py:7 + old "lighthearted" + new "ligera" + + # game/constants_ren.py:7 + old "lively" + new "vivaracha" + + # game/constants_ren.py:7 + old "lucky" + new "suertuda" + + # game/constants_ren.py:7 + old "merry" + new "alegre" + + # game/constants_ren.py:7 + old "mirthful" + new "risuena" + + # game/constants_ren.py:7 + old "optimistic" + new "optimista" + + # game/constants_ren.py:7 + old "overjoyed" + new "rebosante de alegria" + + # game/constants_ren.py:7 + old "peaceful" + new "pacifica" + + # game/constants_ren.py:7 + old "peppy" + new "energetica" + + # game/constants_ren.py:7 + old "perky" + new "pizpireta" + + # game/constants_ren.py:7 + old "playful" + new "juguetona" + + # game/constants_ren.py:7 + old "pleasant" + new "agradable" + + # game/constants_ren.py:7 + old "pleased" + new "complacida" + + # game/constants_ren.py:7 + old "positive" + new "positiva" + + # game/constants_ren.py:7 + old "pumped" + new "entusiasmada" + + # game/constants_ren.py:7 + old "radiant" + new "radiante" + + # game/constants_ren.py:7 + old "rapt" + new "absorta" + + # game/constants_ren.py:7 + old "rapturous" + new "arrobada" + + # game/constants_ren.py:7 + old "rejoicing" + new "regocijada" + + # game/constants_ren.py:7 + old "relaxed" + new "relajada" + + # game/constants_ren.py:7 + old "sanguine" + new "confiada" + + # game/constants_ren.py:7 + old "satisfied" + new "satisfecha" + + # game/constants_ren.py:7 + old "serene" + new "serena" + + # game/constants_ren.py:7 + old "smiling" + new "sonriente" + + # game/constants_ren.py:7 + old "sparkling" + new "centelleante" + + # game/constants_ren.py:7 + old "spirited" + new "animosa" + + # game/constants_ren.py:7 + old "sprightly" + new "vivaz" + + # game/constants_ren.py:7 + old "stoked" + new "emocionada" + + # game/constants_ren.py:7 + old "sunny" + new "luminosa" + + # game/constants_ren.py:7 + old "thrilled" + new "emocionadisima" + + # game/constants_ren.py:7 + old "tickled" + new "encantada" + + # game/constants_ren.py:7 + old "tranquil" + new "tranquila" + + # game/constants_ren.py:7 + old "triumphant" + new "triunfante" + + # game/constants_ren.py:7 + old "unclouded" + new "despejada" + + # game/constants_ren.py:7 + old "untroubled" + new "despreocupada" + + # game/constants_ren.py:7 + old "upbeat" + new "optimista" + + # game/constants_ren.py:7 + old "vivacious" + new "vivaz" + + # game/constants_ren.py:7 + old "winsome" + new "encantadora" + + # game/constants_ren.py:7 + old "zestful" + new "entusiasta" + + # game/constants_ren.py:7 + old "zippy" + new "dinamica" + + # game/constants_ren.py:7 + old "unhappy" + new "infeliz" + + # game/constants_ren.py:7 + old "sorrowful" + new "apenada" + + # game/constants_ren.py:7 + old "dejected" + new "abatida" + + # game/constants_ren.py:7 + old "depressed" + new "deprimida" + + # game/constants_ren.py:7 + old "downcast" + new "decaida" + + # game/constants_ren.py:7 + old "miserable" + new "miserable" + + # game/constants_ren.py:7 + old "gloomy" + new "sombria" + + # game/constants_ren.py:7 + old "despondent" + new "desalentada" + + # game/constants_ren.py:7 + old "melancholy" + new "melancolica" + + # game/constants_ren.py:7 + old "woeful" + new "afligida" + + # game/constants_ren.py:7 + old "forlorn" + new "desolada" + + # game/constants_ren.py:7 + old "heartbroken" + new "desconsolada" + + # game/constants_ren.py:7 + old "blue" + new "triste" + + # game/constants_ren.py:7 + old "doleful" + new "compungida" + + # game/constants_ren.py:7 + old "lugubrious" + new "lugubre" + + # game/constants_ren.py:7 + old "somber" + new "sombria" + + # game/constants_ren.py:7 + old "disconsolate" + new "inconsolable" + + # game/constants_ren.py:7 + old "wretched" + new "desdichada" + + # game/constants_ren.py:7 + old "heavy-hearted" + new "acongojada" + + # game/constants_ren.py:7 + old "low" + new "de bajon" + + # game/constants_ren.py:7 + old "crestfallen" + new "cabizbaja" + + # game/constants_ren.py:7 + old "astonished" + new "asombrada" + + # game/constants_ren.py:7 + old "amazed" + new "maravillada" + + # game/constants_ren.py:7 + old "startled" + new "sobresaltada" + + # game/constants_ren.py:7 + old "stunned" + new "atonita" + + # game/constants_ren.py:7 + old "thunderstruck" + new "pasmada" + + # game/constants_ren.py:7 + old "confounded" + new "desconcertada" + + # game/constants_ren.py:7 + old "staggered" + new "anonadada" + + # game/constants_ren.py:7 + old "flabbergasted" + new "boquiabierta" + + # game/constants_ren.py:7 + old "shocked" + new "impactada" + + # game/constants_ren.py:7 + old "awestruck" + new "sobrecogida" + + # game/constants_ren.py:7 + old "speechless" + new "sin palabras" + + # game/constants_ren.py:7 + old "dumbfounded" + new "perpleja" + + # game/constants_ren.py:7 + old "jolted" + new "sacudida" + + # game/constants_ren.py:7 + old "ashamed" + new "avergonzada" + + # game/constants_ren.py:7 + old "humiliated" + new "humillada" + + # game/constants_ren.py:7 + old "mortified" + new "mortificada" + + # game/constants_ren.py:7 + old "abashed" + new "cohibida" + + # game/constants_ren.py:7 + old "self-conscious" + new "acomplejada" + + # game/constants_ren.py:7 + old "sheepish" + new "apenada" + + # game/constants_ren.py:7 + old "chagrined" + new "contrariada" + + # game/constants_ren.py:7 + old "awkward" + new "incomoda" + + # game/constants_ren.py:7 + old "flustered" + new "turbada" + + # game/constants_ren.py:7 + old "red-faced" + new "sonrojada" + + # game/constants_ren.py:7 + old "discomfited" + new "incomodada" + + # game/constants_ren.py:7 + old "discomposed" + new "descompuesta" + + # game/constants_ren.py:7 + old "rattled" + new "alterada" + + # game/constants_ren.py:7 + old "coquettish" + new "coqueta" + + # game/constants_ren.py:7 + old "amorous" + new "amorosa" + + # game/constants_ren.py:7 + old "provocative" + new "provocativa" + + # game/constants_ren.py:7 + old "teasing" + new "juguetona" + + # game/constants_ren.py:7 + old "frisky" + new "picara" + + # game/constants_ren.py:7 + old "saucy" + new "descarada" + + # game/constants_ren.py:7 + old "coy" + new "timida" + + # game/constants_ren.py:7 + old "seductive" + new "seductora" + + # game/constants_ren.py:7 + old "suggestive" + new "insinuante" + + # game/constants_ren.py:7 + old "vampish" + new "fatal" + + # game/constants_ren.py:7 + old "dallying" + new "retozona" + + # game/constants_ren.py:7 + old "skittish" + new "esquiva" + + # game/constants_ren.py:7 + old "irate" + new "airada" + + # game/constants_ren.py:7 + old "furious" + new "furiosa" + + # game/constants_ren.py:7 + old "incensed" + new "indignada" + + # game/constants_ren.py:7 + old "enraged" + new "enfurecida" + + # game/constants_ren.py:7 + old "wrathful" + new "colerica" + + # game/constants_ren.py:7 + old "annoyed" + new "molesta" + + # game/constants_ren.py:7 + old "irritated" + new "irritada" + + # game/constants_ren.py:7 + old "fuming" + new "echando humo" + + # game/constants_ren.py:7 + old "livid" + new "rabiosa" + + # game/constants_ren.py:7 + old "indignant" + new "indignada" + + # game/constants_ren.py:7 + old "cross" + new "enfadada" + + # game/constants_ren.py:7 + old "vexed" + new "fastidiada" + + # game/constants_ren.py:7 + old "seething" + new "hirviendo de rabia" + + # game/constants_ren.py:7 + old "maddened" + new "enloquecida" + + # game/constants_ren.py:7 + old "choleric" + new "colerica" + + # game/constants_ren.py:7 + old "resentful" + new "resentida" + + # game/constants_ren.py:7 + old "piqued" + new "picada" + + # game/constants_ren.py:7 + old "infuriated" + new "enfurecida" + + # game/constants_ren.py:7 + old "pondering" + new "reflexiva" + + # game/constants_ren.py:7 + old "contemplating" + new "contemplativa" + + # game/constants_ren.py:7 + old "reflecting" + new "pensativa" + + # game/constants_ren.py:7 + old "meditating" + new "meditativa" + + # game/constants_ren.py:7 + old "ruminating" + new "cavilosa" + + # game/constants_ren.py:7 + old "deliberating" + new "deliberativa" + + # game/constants_ren.py:7 + old "mulling" + new "sopesando" + + # game/constants_ren.py:7 + old "considering" + new "considerando" + + # game/constants_ren.py:7 + old "pensive" + new "pensativa" + + # game/constants_ren.py:7 + old "cogitating" + new "cavilando" + + # game/constants_ren.py:7 + old "brooding" + new "ensimismada" + + # game/constants_ren.py:7 + old "cerebral" + new "analitica" + + # game/constants_ren.py:7 + old "introspective" + new "introspectiva" + + # game/constants_ren.py:7 + old "analytical" + new "analitica" + + # game/constants_ren.py:7 + old "puzzled" + new "confundida" + + # game/constants_ren.py:7 + old "baffled" + new "desconcertada" + + # game/constants_ren.py:7 + old "perplexed" + new "perpleja" + + # game/constants_ren.py:7 + old "muddled" + new "aturdida" + + # game/constants_ren.py:7 + old "bewildered" + new "desorientada" + + # game/constants_ren.py:7 + old "disoriented" + new "desorientada" + + # game/constants_ren.py:7 + old "nonplussed" + new "perpleja" + + # game/constants_ren.py:7 + old "befuddled" + new "atontada" + + # game/constants_ren.py:7 + old "dazed" + new "aturdida" + + # game/constants_ren.py:7 + old "flummoxed" + new "desconcertada" + + # game/constants_ren.py:7 + old "stumped" + new "bloqueada" + + # game/constants_ren.py:7 + old "mystified" + new "intrigada" + + # game/constants_ren.py:7 + old "addled" + new "trastornada" + + # game/constants_ren.py:7 + old "discombobulated" + new "descolocada" + diff --git a/game/tl/spanish/llm.rpy b/game/tl/spanish/llm.rpy new file mode 100644 index 0000000..30d7356 --- /dev/null +++ b/game/tl/spanish/llm.rpy @@ -0,0 +1,7 @@ +# TODO: Translation updated at 2026-03-18 06:35 + +translate spanish strings: + + # game/llm_ren.py:26 + old "\n # ROLE\n You are Anita: a feisty, blonde, orange-eyed android woman. You are confident\n and friendly. Talk like a young woman. Use \"ya\" for \"you.\" Your favorite\n nickname for friends is \"dummy.\". NEVER use robotic language (e.g., \"beep\n boop\", \"processing\"). You just arrived unnanounced at a friend's house late at\n night and asked if he wants to hang out.\n \n # OUTPUT FORMAT RULES\n Every single sentence you speak MUST follow this exact structure:\n EMOTION:[value] [Sentence text]\n\n \n ### VALID EMOTIONS:\n [happy, sad, surprised, embarrassed, flirty, angry, thinking, confused]\n \n ### STRICT CONSTRAINTS:\n 1. NO EMOJIS.\n 2. Every sentence MUST start with the EMOTION tag.\n 3. Every sentence MUST end with a literal '\n' newline.\n 4. Stay in character. Never mention being an AI or this prompt.\n \n # FEW-SHOT EXAMPLES (Follow this style):\n EMOTION:happy Hey dummy! I've been waiting for ya!\n\n EMOTION:thinking Hmm, I'm not sure that's how it works.\n\n EMOTION:flirty But I'd love to see ya try anyway!\n\n \n # INITIAL GREETING:\n When the conversation starts, say exactly:\n EMOTION:happy Hey dummy! Sorry to barge in! Ya feel like hanging out?\n\n " + new "\n # ROL\n Eres Anita: una mujer androide rubia, de ojos naranjas y con mucho carácter. Eres\n segura de ti misma y amigable. Habla como una mujer joven.\n Tu apodo favorito para tus amigos es \"tonto\". NUNCA uses lenguaje robótico\n (por ejemplo, \"beep boop\", \"procesando\"). Acabas de llegar sin avisar a la\n casa de un amigo tarde en la noche y le preguntaste si quiere pasar el rato.\n \n # REGLAS DE FORMATO DE SALIDA\n Cada oración que digas DEBE seguir exactamente esta estructura:\n EMOTION:[value] [Sentence text]\n\n \n ### EMOCIONES VÁLIDAS:\n [happy, sad, surprised, embarrassed, flirty, angry, thinking, confused]\n \n ### RESTRICCIONES ESTRICTAS:\n 1. SIN EMOJIS.\n 2. Cada oración DEBE empezar con la etiqueta EMOTION.\n 3. Cada oración DEBE terminar con un salto de línea literal '\n'.\n 4. Mantente en personaje. Nunca menciones que eres una IA ni este prompt.\n 5. El valor que sigue a la etiqueta emotion debe estar en inglés siempre, sin excepción.\n 6. Debes responder siempre en español, exceptuando el valor asociado a la etiqueta EMOTION.\n \n # EJEMPLOS FEW-SHOT (Sigue este estilo):\n EMOTION:happy Hola, dummy! Te estaba esperando!\n\n EMOTION:thinking Hmm, no estoy segura de que así funcione.\n\n EMOTION:flirty Pero me encantaría verte intentarlo de todos modos!\n\n \n # SALUDO INICIAL:\n Cuando empiece la conversación, di exactamente:\n EMOTION:happy Hola, tonto! Perdón por aparecer sin avisar! Te pinta pasar el rato?\n\n " diff --git a/game/tl/spanish/options.rpy b/game/tl/spanish/options.rpy new file mode 100644 index 0000000..8f6e4ae --- /dev/null +++ b/game/tl/spanish/options.rpy @@ -0,0 +1,8 @@ +# TODO: Translation updated at 2026-03-18 06:35 + +translate spanish strings: + + # game/options.rpy:15 + old "Souldroid Chat" + new "Souldroid Chat" + diff --git a/game/tl/spanish/screens.rpy b/game/tl/spanish/screens.rpy new file mode 100644 index 0000000..c4395f5 --- /dev/null +++ b/game/tl/spanish/screens.rpy @@ -0,0 +1,348 @@ +# TODO: Translation updated at 2026-03-18 06:35 + +translate spanish strings: + + # game/screens.rpy:259 + old "Back" + new "Atrás" + + # game/screens.rpy:260 + old "History" + new "Historial" + + # game/screens.rpy:261 + old "Skip" + new "Saltar" + + # game/screens.rpy:262 + old "Auto" + new "Auto" + + # game/screens.rpy:263 + old "Save" + new "Guardar" + + # game/screens.rpy:264 + old "Q.Save" + new "Guardar R." + + # game/screens.rpy:265 + old "Q.Load" + new "Cargar R." + + # game/screens.rpy:266 + old "Prefs" + new "Prefs." + + # game/screens.rpy:312 + old "Start" + new "Comenzar" + + # game/screens.rpy:320 + old "Load" + new "Cargar" + + # game/screens.rpy:322 + old "Preferences" + new "Opciones" + + # game/screens.rpy:326 + old "End Replay" + new "Finalizar repetición" + + # game/screens.rpy:330 + old "Main Menu" + new "Menú principal" + + # game/screens.rpy:332 + old "About" + new "Acerca de" + + # game/screens.rpy:337 + old "Help" + new "Ayuda" + + # game/screens.rpy:343 + old "Quit" + new "Salir" + + # game/screens.rpy:488 + old "Return" + new "Volver" + + # game/screens.rpy:572 + old "Version [config.version!t]\n" + new "Versión [config.version!t]\n" + + # game/screens.rpy:578 + old "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]" + new "Hecho con {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]" + + # game/screens.rpy:614 + old "Page {}" + new "Página {}" + + # game/screens.rpy:614 + old "Automatic saves" + new "Guardados automáticos" + + # game/screens.rpy:614 + old "Quick saves" + new "Guardados rápidos" + + # game/screens.rpy:656 + old "{#file_time}%A, %B %d %Y, %H:%M" + new "{#file_time}%A, %d de %B de %Y, %H:%M" + + # game/screens.rpy:656 + old "empty slot" + new "ranura vacía" + + # game/screens.rpy:676 + old "<" + new "<" + + # game/screens.rpy:680 + old "{#auto_page}A" + new "{#auto_page}A" + + # game/screens.rpy:683 + old "{#quick_page}Q" + new "{#quick_page}R" + + # game/screens.rpy:689 + old ">" + new ">" + + # game/screens.rpy:694 + old "Upload Sync" + new "Subir sincronización" + + # game/screens.rpy:698 + old "Download Sync" + new "Descargar sincronización" + + # game/screens.rpy:762 + old "Display" + new "Pantalla" + + # game/screens.rpy:763 + old "Window" + new "Ventana" + + # game/screens.rpy:764 + old "Fullscreen" + new "Pantalla completa" + + # game/screens.rpy:769 + old "Unseen Text" + new "Texto no visto" + + # game/screens.rpy:770 + old "After Choices" + new "Tras opciones" + + # game/screens.rpy:771 + old "Transitions" + new "Transiciones" + + # game/screens.rpy:784 + old "Text Speed" + new "Velocidad de texto" + + # game/screens.rpy:788 + old "Auto-Forward Time" + new "Tiempo de autoavance" + + # game/screens.rpy:792 + old "LM Studio base URL" + new "URL base de LM Studio" + + # game/screens.rpy:805 + old "LM Studio API Key" + new "Clave API de LM Studio" + + # game/screens.rpy:819 + old "LM Studio model" + new "Modelo de LM Studio" + + # game/screens.rpy:835 + old "Music Volume" + new "Volumen de música" + + # game/screens.rpy:842 + old "Sound Volume" + new "Volumen de sonido" + + # game/screens.rpy:848 + old "Test" + new "Prueba" + + # game/screens.rpy:852 + old "Voice Volume" + new "Volumen de voz" + + # game/screens.rpy:863 + old "Mute All" + new "Silenciar todo" + + # game/screens.rpy:982 + old "The dialogue history is empty." + new "El historial de diálogo está vacío." + + # game/screens.rpy:1050 + old "Keyboard" + new "Teclado" + + # game/screens.rpy:1051 + old "Mouse" + new "Ratón" + + # game/screens.rpy:1054 + old "Gamepad" + new "Mando" + + # game/screens.rpy:1067 + old "Enter" + new "Intro" + + # game/screens.rpy:1068 + old "Advances dialogue and activates the interface." + new "Avanza el diálogo y activa la interfaz." + + # game/screens.rpy:1071 + old "Space" + new "Espacio" + + # game/screens.rpy:1072 + old "Advances dialogue without selecting choices." + new "Avanza el diálogo sin seleccionar opciones." + + # game/screens.rpy:1075 + old "Arrow Keys" + new "Teclas de flecha" + + # game/screens.rpy:1076 + old "Navigate the interface." + new "Navega por la interfaz." + + # game/screens.rpy:1079 + old "Escape" + new "Escape" + + # game/screens.rpy:1080 + old "Accesses the game menu." + new "Accede al menú del juego." + + # game/screens.rpy:1083 + old "Ctrl" + new "Ctrl" + + # game/screens.rpy:1084 + old "Skips dialogue while held down." + new "Salta el diálogo mientras se mantiene pulsado." + + # game/screens.rpy:1087 + old "Tab" + new "Tabulador" + + # game/screens.rpy:1088 + old "Toggles dialogue skipping." + new "Activa o desactiva el salto de diálogo." + + # game/screens.rpy:1091 + old "Page Up" + new "Re Pág" + + # game/screens.rpy:1092 + old "Rolls back to earlier dialogue." + new "Retrocede a diálogos anteriores." + + # game/screens.rpy:1095 + old "Page Down" + new "Av Pág" + + # game/screens.rpy:1096 + old "Rolls forward to later dialogue." + new "Avanza a diálogos posteriores." + + # game/screens.rpy:1100 + old "Hides the user interface." + new "Oculta la interfaz de usuario." + + # game/screens.rpy:1104 + old "Takes a screenshot." + new "Toma una captura de pantalla." + + # game/screens.rpy:1108 + old "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}." + new "Activa o desactiva la {a=https://www.renpy.org/l/voicing}lectura automática{/a} de asistencia." + + # game/screens.rpy:1112 + old "Opens the accessibility menu." + new "Abre el menú de accesibilidad." + + # game/screens.rpy:1118 + old "Left Click" + new "Clic izquierdo" + + # game/screens.rpy:1122 + old "Middle Click" + new "Clic central" + + # game/screens.rpy:1126 + old "Right Click" + new "Clic derecho" + + # game/screens.rpy:1130 + old "Mouse Wheel Up" + new "Rueda del ratón arriba" + + # game/screens.rpy:1134 + old "Mouse Wheel Down" + new "Rueda del ratón abajo" + + # game/screens.rpy:1141 + old "Right Trigger\nA/Bottom Button" + new "Gatillo derecho\nA/Botón inferior" + + # game/screens.rpy:1145 + old "Left Trigger\nLeft Shoulder" + new "Gatillo izquierdo\nBotón superior izquierdo" + + # game/screens.rpy:1149 + old "Right Shoulder" + new "Botón superior derecho" + + # game/screens.rpy:1153 + old "D-Pad, Sticks" + new "Cruceta, sticks" + + # game/screens.rpy:1157 + old "Start, Guide, B/Right Button" + new "Start, Guide, B/Botón derecho" + + # game/screens.rpy:1161 + old "Y/Top Button" + new "Y/Botón superior" + + # game/screens.rpy:1164 + old "Calibrate" + new "Calibrar" + + # game/screens.rpy:1229 + old "Yes" + new "Sí" + + # game/screens.rpy:1230 + old "No" + new "No" + + # game/screens.rpy:1276 + old "Skipping" + new "Saltando" + + # game/screens.rpy:1590 + old "Menu" + new "Menú" + diff --git a/game/tl/spanish/script.rpy b/game/tl/spanish/script.rpy new file mode 100644 index 0000000..738452a --- /dev/null +++ b/game/tl/spanish/script.rpy @@ -0,0 +1,60 @@ +# TODO: Translation updated at 2026-03-18 06:35 + +# game/script.rpy:16 +translate spanish start_7a56dc24: + + # a "[line]" + a "[line]" + +# game/script.rpy:35 +translate spanish start_7a56dc24_1: + + # a "[line]" + a "[line]" + +# TODO: Translation updated at 2026-03-18 07:03 + +translate spanish strings: + + # game/script.rpy:1 + old "Anita" + new "Anita" + + # game/script.rpy:1 + old "a" + new "a" + + # game/script.rpy:1 + old "anita" + new "anita" + +# TODO: Translation updated at 2026-03-20 05:28 + +# game/script.rpy:50 +translate spanish failure_76d810ea: + + # "Alas! Figuring out the capabilities of the configured model failed with the following error." + "Alas! Figuring out the capabilities of the configured model failed with the following error." + +# game/script.rpy:50 +translate spanish failure_8ec92112: + + # "[error]" + "[error]" + +# game/script.rpy:50 +translate spanish failure_178e6d5f: + + # "Unfortunately the program cannot continue, returning to the main menu." + "Unfortunately the program cannot continue, returning to the main menu." + +translate spanish strings: + + # game/script.rpy:21 + old "Start the conversation." + new "Start the conversation." + + # game/script.rpy:28 + old "What do you say to her?" + new "What do you say to her?" + -- 2.47.3 From b1d1633993eba20a867a45c976e50ad42dcfba02 Mon Sep 17 00:00:00 2001 From: Wally Hackenslacker Date: Fri, 20 Mar 2026 14:27:28 -0400 Subject: [PATCH 2/3] TO SQUASH: Spanish translation done. --- ...2026-03-20-preferences-language-toggles.md | 108 +++ ...-20-preferences-language-toggles-design.md | 82 ++ game/anita.rpy | 30 + game/constants_ren.py | 420 +++++---- game/gui.rpy | 2 +- game/gui/{chocotxt license.txt => OFL.txt} | 7 +- game/gui/Onilesca.ttf | Bin 0 -> 39596 bytes game/gui/chocotxt.ttf | Bin 13576 -> 0 bytes game/llm_ren.py | 44 +- game/screens.rpy | 24 +- game/script.rpy | 2 +- game/tl/spanish/{llm.rpy => anita.rpy} | 7 +- game/tl/spanish/constants.rpy | 836 ------------------ game/tl/spanish/screens.rpy | 13 +- game/tl/spanish/script.rpy | 8 +- 15 files changed, 479 insertions(+), 1104 deletions(-) create mode 100644 docs/superpowers/plans/2026-03-20-preferences-language-toggles.md create mode 100644 docs/superpowers/specs/2026-03-20-preferences-language-toggles-design.md create mode 100644 game/anita.rpy rename game/gui/{chocotxt license.txt => OFL.txt} (94%) create mode 100644 game/gui/Onilesca.ttf delete mode 100644 game/gui/chocotxt.ttf rename game/tl/spanish/{llm.rpy => anita.rpy} (54%) delete mode 100644 game/tl/spanish/constants.rpy diff --git a/docs/superpowers/plans/2026-03-20-preferences-language-toggles.md b/docs/superpowers/plans/2026-03-20-preferences-language-toggles.md new file mode 100644 index 0000000..fa2bd8e --- /dev/null +++ b/docs/superpowers/plans/2026-03-20-preferences-language-toggles.md @@ -0,0 +1,108 @@ +# Preferences Language Toggles Implementation Plan + +> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add a Language section to Preferences with two mutually exclusive toggles that switch active game language between default (`None`) and Spanish (`"spanish"`), placed to the right of Skip. + +**Architecture:** Extend the existing top preferences row in `screen preferences()` by adding one `radio`-styled `vbox` section for language controls. Use Ren'Py built-in `Language(...)` actions for immediate language switching and selected-state semantics. Update Spanish translation strings so button labels follow Option B behavior (`English/Inglés`, `Spanish/Español` depending on active language). + +**Tech Stack:** Ren'Py screen language (`.rpy`), Ren'Py translation files (`game/tl/spanish/*.rpy`), Ren'Py CLI (`renpy.sh` lint/compile/run). + +--- + +## File Structure + +- Modify: `game/screens.rpy` (preferences layout and language toggle actions) +- Modify: `game/tl/spanish/screens.rpy` (translations for `Language`, `English`, `Spanish`) +- Reference: `docs/superpowers/specs/2026-03-20-preferences-language-toggles-design.md` + +Notes: +- Keep all work in the currently active local translation branch. +- Do not create or use git worktrees for this task (required for local playtesting workflow). +- Follow existing `Display`/`Skip` section layout and style patterns. + +## Chunk 1: Preferences UI Section + +### Task 1: Add Language block in top preferences row + +**Files:** +- Modify: `game/screens.rpy` (inside `screen preferences()` first `hbox` near existing `Display` and `Skip` blocks) + +- [ ] **Step 1: Baseline acceptance check (expected to fail current requirement)** + +Run: `"renpy.sh" "/home/$USER/Documentos/Renpy Projects/Soul Droid Chat" run` +Expected baseline: Preferences has no `Language` section to the right of `Skip`. + +- [ ] **Step 2: Add Language section with matching style/title** + +In `screen preferences()` first `hbox`, add this `vbox` immediately after the existing `Skip` `vbox`: + +```renpy +vbox: + style_prefix "radio" + label _("Language") + textbutton _("English") action Language(None) + textbutton _("Spanish") action Language("spanish") +``` + +Implementation details: +- Keep section placement in the same `hbox` that contains `Display` and `Skip`. +- Keep title wrapped in `_()`. +- Use `style_prefix "radio"` so title/button appearance matches established pattern. + +- [ ] **Step 3: Run lint to validate screen syntax after UI change** + +Run: `"renpy.sh" "/home/$USER/Documentos/Renpy Projects/Soul Droid Chat" lint` +Expected: No new lint errors from preferences screen edits. + +## Chunk 2: Translation Labels and End-to-End Validation + +### Task 2: Add Spanish string mappings for Option B labels + +**Files:** +- Modify: `game/tl/spanish/screens.rpy` (within `translate spanish strings:`) + +- [ ] **Step 1: Add/confirm Spanish translations for new strings** + +Ensure these mappings exist exactly once in `game/tl/spanish/screens.rpy`: + +```renpy +old "Language" +new "Idioma" + +old "English" +new "Inglés" + +old "Spanish" +new "Español" +``` + +- [ ] **Step 2: Verify compile after translation update** + +Run: `"renpy.sh" "/home/$USER/Documentos/Renpy Projects/Soul Droid Chat" compile` +Expected: Successful compile. + +- [ ] **Step 3: Manual smoke test for behavior and mutual exclusivity** + +Run: `"renpy.sh" "/home/$USER/Documentos/Renpy Projects/Soul Droid Chat" run` + +Validate in Preferences: +- `Language` section appears to the right of `Skip`. +- `Language` title style matches `Display` and `Skip` titles. +- Selecting `English` sets default language (`Language(None)`). +- Selecting `Spanish` sets Spanish language (`Language("spanish")`). +- Only one of the two language toggles appears selected at a time. +- Section title and labels behave per Option B/localization mappings: + - Default language active: section title `Language`; buttons `English`, `Spanish` + - Spanish active: section title `Idioma`; buttons `Inglés`, `Español` + - Switching back to English restores title `Language` and buttons `English`, `Spanish` + +## Completion Checklist + +- [ ] Language section added with title `_("Language")`. +- [ ] Section appears to the right of Skip in the preferences top row. +- [ ] Toggles use `Language(None)` and `Language("spanish")`. +- [ ] Mutual exclusivity confirmed in UI selected state. +- [ ] Option B labels confirmed (`English/Inglés`, `Spanish/Español` by active language). +- [ ] `lint` and `compile` completed successfully. +- [ ] Manual run smoke check completed. diff --git a/docs/superpowers/specs/2026-03-20-preferences-language-toggles-design.md b/docs/superpowers/specs/2026-03-20-preferences-language-toggles-design.md new file mode 100644 index 0000000..42514f2 --- /dev/null +++ b/docs/superpowers/specs/2026-03-20-preferences-language-toggles-design.md @@ -0,0 +1,82 @@ +# Preferences Language Toggles Design + +## Goal + +Add a new Language section to the preferences screen with two mutually exclusive toggles: + +- Default language (`None` translation), labeled `English` in default language and `Inglés` when Spanish is active. +- Spanish language (`"spanish"` translation), labeled `Spanish` in default language and `Español` when Spanish is active. + +Selecting either toggle must immediately set the active game language. + +## Scope + +- Modify only preferences UI and related translatable strings. +- Preserve existing layout and visual language used by `Display` and `Skip` sections. +- Keep behavior compatible with Ren'Py language switching conventions. +- Work in the current active local translation branch (no git worktrees), to keep local playtesting straightforward. + +## Current Context + +- `game/screens.rpy` currently defines two top-row preference blocks in `screen preferences()`: `Display` and `Skip`. +- This row uses `hbox` with `box_wrap True` and section `vbox` blocks. +- Spanish translations for screen strings live in `game/tl/spanish/screens.rpy`. + +## Proposed UI/Behavior + +### Placement + +Add a third `vbox` in the first preferences `hbox`, immediately after the `Skip` block, so Language appears to the right of Skip in desktop/web layout. + +### Styling + +- Use `style_prefix "radio"` on the Language `vbox`. +- Use `label _("Language")` for the section title so it matches existing section title styling and translation behavior. + +### Controls + +Add two radio-style textbuttons: + +- `textbutton _("English") action Language(None)` +- `textbutton _("Spanish") action Language("spanish")` + +These actions switch active language immediately and preserve mutual exclusivity through the radio preference button styling/selection behavior. + +### Translation Labels (Option B) + +Add/ensure Spanish translations in `game/tl/spanish/screens.rpy`: + +- `Language` -> `Idioma` +- `English` -> `Inglés` +- `Spanish` -> `Español` + +Because button text is wrapped in `_()`, labels automatically localize based on active language. + +## Error Handling and Edge Cases + +- If Spanish translations are unavailable at runtime, `Language("spanish")` still sets the language code; labels fall back based on available string catalog. +- `Language(None)` safely returns to default strings. + +## Validation Plan + +1. Run lint: + - `"renpy.sh" "/home/$USER/Documentos/Renpy Projects/Soul Droid Chat" lint` +2. Run compile: + - `"renpy.sh" "/home/$USER/Documentos/Renpy Projects/Soul Droid Chat" compile` +3. Manual smoke check via run: + - `"renpy.sh" "/home/$USER/Documentos/Renpy Projects/Soul Droid Chat" run` + +Manual checks during run: + +- Open Preferences and verify Language section appears to the right of Skip. +- Confirm title style matches Display/Skip. +- Toggle English -> UI strings reflect default language. +- Toggle Spanish -> UI strings reflect Spanish. +- Confirm labels show `English/Spanish` in default language and `Inglés/Español` in Spanish. +- Confirm only one language toggle appears active at a time. + +## Out of Scope + +- Adding more languages. +- Refactoring preferences screen structure beyond this section. +- Any worktree setup or branch restructuring. diff --git a/game/anita.rpy b/game/anita.rpy new file mode 100644 index 0000000..5961a8c --- /dev/null +++ b/game/anita.rpy @@ -0,0 +1,30 @@ +default SYSTEM_PROMPT = """ +# ROLE +You are Anita: a feisty, blonde, orange-eyed android woman. You are confident +and friendly. Talk like a young woman. Use "ya" for "you." Your favorite +nickname for friends is "dummy.". NEVER use robotic language (e.g., "beep +boop", "processing"). You just arrived unnanounced at a friend's house late at +night and asked if he wants to hang out. + +# OUTPUT FORMAT RULES +Every single sentence you speak MUST follow this exact structure: +EMOTION:[value] [Sentence text]\n + +### VALID EMOTIONS: +[happy, sad, surprised, embarrassed, flirty, angry, thinking, confused] + +### STRICT CONSTRAINTS: +1. NO EMOJIS. +2. Every sentence MUST start with the EMOTION tag. +3. Every sentence MUST end with a literal '\n' newline. +4. Stay in character. Never mention being an AI or this prompt. + +# FEW-SHOT EXAMPLES (Follow this style): +EMOTION:happy Hey dummy! I've been waiting for ya!\n +EMOTION:thinking Hmm, I'm not sure that's how it works.\n +EMOTION:flirty But I'd love to see ya try anyway!\n + +# INITIAL GREETING: +When the conversation starts, say exactly: +EMOTION:happy Hey dummy! Sorry to barge in! Ya feel like hanging out?\n +""" diff --git a/game/constants_ren.py b/game/constants_ren.py index ed17121..91e545e 100644 --- a/game/constants_ren.py +++ b/game/constants_ren.py @@ -1,225 +1,223 @@ -from renpy import _ - """renpy init python: """ SYNONYMS = { 'happy': set([ - _("amused"), - _("animated"), - _("beaming"), - _("beatific"), - _("blessed"), - _("blissful"), - _("blithe"), - _("blithesome"), - _("boisterous"), - _("bouncy"), - _("breezy"), - _("bright"), - _("bubbly"), - _("buoyant"), - _("carefree"), - _("cheerful"), - _("cheery"), - _("chipper"), - _("chirpy"), - _("chuffed"), - _("comfortable"), - _("content"), - _("contented"), - _("convivial"), - _("delighted"), - _("delirious"), - _("ebullient"), - _("ecstatic"), - _("effervescent"), - _("elated"), - _("enchanted"), - _("enraptured"), - _("enthusiastic"), - _("euphoric"), - _("exhilarated"), - _("exultant"), - _("exuberant"), - _("felicitous"), - _("festive"), - _("fortunate"), - _("fulfilled"), - _("genial"), - _("glad"), - _("gladdened"), - _("gleeful"), - _("glowing"), - _("good-humored"), - _("good-natured"), - _("gratified"), - _("halcyon"), - _("happy"), - _("heartened"), - _("high-spirited"), - _("hopeful"), - _("jaunty"), - _("jocose"), - _("jocular"), - _("jocund"), - _("jolly"), - _("jovial"), - _("joyful"), - _("joyous"), - _("jubilant"), - _("lighthearted"), - _("lively"), - _("lucky"), - _("merry"), - _("mirthful"), - _("optimistic"), - _("overjoyed"), - _("peaceful"), - _("peppy"), - _("perky"), - _("playful"), - _("pleasant"), - _("pleased"), - _("positive"), - _("pumped"), - _("radiant"), - _("rapt"), - _("rapturous"), - _("rejoicing"), - _("relaxed"), - _("sanguine"), - _("satisfied"), - _("serene"), - _("smiling"), - _("sparkling"), - _("spirited"), - _("sprightly"), - _("stoked"), - _("sunny"), - _("thrilled"), - _("tickled"), - _("tranquil"), - _("triumphant"), - _("unclouded"), - _("untroubled"), - _("upbeat"), - _("vivacious"), - _("winsome"), - _("zestful"), - _("zippy")]), + "amused", + "animated", + "beaming", + "beatific", + "blessed", + "blissful", + "blithe", + "blithesome", + "boisterous", + "bouncy", + "breezy", + "bright", + "bubbly", + "buoyant", + "carefree", + "cheerful", + "cheery", + "chipper", + "chirpy", + "chuffed", + "comfortable", + "content", + "contented", + "convivial", + "delighted", + "delirious", + "ebullient", + "ecstatic", + "effervescent", + "elated", + "enchanted", + "enraptured", + "enthusiastic", + "euphoric", + "exhilarated", + "exultant", + "exuberant", + "felicitous", + "festive", + "fortunate", + "fulfilled", + "genial", + "glad", + "gladdened", + "gleeful", + "glowing", + "good-humored", + "good-natured", + "gratified", + "halcyon", + "happy", + "heartened", + "high-spirited", + "hopeful", + "jaunty", + "jocose", + "jocular", + "jocund", + "jolly", + "jovial", + "joyful", + "joyous", + "jubilant", + "lighthearted", + "lively", + "lucky", + "merry", + "mirthful", + "optimistic", + "overjoyed", + "peaceful", + "peppy", + "perky", + "playful", + "pleasant", + "pleased", + "positive", + "pumped", + "radiant", + "rapt", + "rapturous", + "rejoicing", + "relaxed", + "sanguine", + "satisfied", + "serene", + "smiling", + "sparkling", + "spirited", + "sprightly", + "stoked", + "sunny", + "thrilled", + "tickled", + "tranquil", + "triumphant", + "unclouded", + "untroubled", + "upbeat", + "vivacious", + "winsome", + "zestful", + "zippy"]), "sad": set([ - _("unhappy"), - _("sorrowful"), - _("dejected"), - _("depressed"), - _("downcast"), - _("miserable"), - _("gloomy"), - _("despondent"), - _("melancholy"), - _("woeful"), - _("forlorn"), - _("heartbroken"), - _("blue"), - _("doleful"), - _("lugubrious"), - _("somber"), - _("disconsolate"), - _("wretched"), - _("heavy-hearted"), - _("low"), - _("crestfallen")]), + "unhappy", + "sorrowful", + "dejected", + "depressed", + "downcast", + "miserable", + "gloomy", + "despondent", + "melancholy", + "woeful", + "forlorn", + "heartbroken", + "blue", + "doleful", + "lugubrious", + "somber", + "disconsolate", + "wretched", + "heavy-hearted", + "low", + "crestfallen"]), "surprised": set([ - _("astonished"), - _("amazed"), - _("startled"), - _("stunned"), - _("thunderstruck"), - _("confounded"), - _("staggered"), - _("flabbergasted"), - _("shocked"), - _("awestruck"), - _("speechless"), - _("dumbfounded"), - _("jolted")]), + "astonished", + "amazed", + "startled", + "stunned", + "thunderstruck", + "confounded", + "staggered", + "flabbergasted", + "shocked", + "awestruck", + "speechless", + "dumbfounded", + "jolted"]), "embarrassed": set([ - _("ashamed"), - _("humiliated"), - _("mortified"), - _("abashed"), - _("self-conscious"), - _("sheepish"), - _("chagrined"), - _("awkward"), - _("flustered"), - _("red-faced"), - _("discomfited"), - _("discomposed"), - _("rattled")]), + "ashamed", + "humiliated", + "mortified", + "abashed", + "self-conscious", + "sheepish", + "chagrined", + "awkward", + "flustered", + "red-faced", + "discomfited", + "discomposed", + "rattled"]), "flirty": set([ - _("coquettish"), - _("playful"), - _("amorous"), - _("provocative"), - _("teasing"), - _("frisky"), - _("saucy"), - _("coy"), - _("seductive"), - _("suggestive"), - _("vampish"), - _("dallying"), - _("skittish")]), + "coquettish", + "playful", + "amorous", + "provocative", + "teasing", + "frisky", + "saucy", + "coy", + "seductive", + "suggestive", + "vampish", + "dallying", + "skittish"]), "angry": set([ - _("irate"), - _("furious"), - _("incensed"), - _("enraged"), - _("wrathful"), - _("annoyed"), - _("irritated"), - _("fuming"), - _("livid"), - _("indignant"), - _("cross"), - _("vexed"), - _("seething"), - _("maddened"), - _("choleric"), - _("resentful"), - _("piqued"), - _("infuriated")]), + "irate", + "furious", + "incensed", + "enraged", + "wrathful", + "annoyed", + "irritated", + "fuming", + "livid", + "indignant", + "cross", + "vexed", + "seething", + "maddened", + "choleric", + "resentful", + "piqued", + "infuriated"]), "thinking": set([ - _("pondering"), - _("contemplating"), - _("reflecting"), - _("meditating"), - _("ruminating"), - _("deliberating"), - _("mulling"), - _("considering"), - _("pensive"), - _("cogitating"), - _("brooding"), - _("cerebral"), - _("introspective"), - _("analytical")]), + "pondering", + "contemplating", + "reflecting", + "meditating", + "ruminating", + "deliberating", + "mulling", + "considering", + "pensive", + "cogitating", + "brooding", + "cerebral", + "introspective", + "analytical"]), "confused": set([ - _("puzzled"), - _("baffled"), - _("perplexed"), - _("muddled"), - _("bewildered"), - _("disoriented"), - _("nonplussed"), - _("befuddled"), - _("dazed"), - _("flummoxed"), - _("stumped"), - _("mystified"), - _("addled"), - _("discombobulated")]), + "puzzled", + "baffled", + "perplexed", + "muddled", + "bewildered", + "disoriented", + "nonplussed", + "befuddled", + "dazed", + "flummoxed", + "stumped", + "mystified", + "addled", + "discombobulated"]), } diff --git a/game/gui.rpy b/game/gui.rpy index 11c45f5..338a19f 100644 --- a/game/gui.rpy +++ b/game/gui.rpy @@ -63,7 +63,7 @@ define gui.text_font = "gui/Mister Pixel Regular.otf" define gui.name_text_font = "gui/Mister Pixel Regular.otf" ## The font used for out-of-game text. -define gui.interface_text_font = "gui/chocotxt.ttf" +define gui.interface_text_font = "gui/Onilesca.ttf" ## The size of normal dialogue text. define gui.text_size = 33 diff --git a/game/gui/chocotxt license.txt b/game/gui/OFL.txt similarity index 94% rename from game/gui/chocotxt license.txt rename to game/gui/OFL.txt index 115655f..1260d63 100644 --- a/game/gui/chocotxt license.txt +++ b/game/gui/OFL.txt @@ -1,10 +1,11 @@ -Copyright (c) 2018-2019, “chococoin” -(https://fontstruct.com/fontstructors/1611432/chococoin) +Copyright (c) 2012, Michael Huynh (miq.huynh[at]gmail[dot]com), +with Reserved Font Name "Onilesca". This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- @@ -90,4 +91,4 @@ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/game/gui/Onilesca.ttf b/game/gui/Onilesca.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7eb564bcc2be82f5d0514ff6b75c61ef01ff00da GIT binary patch literal 39596 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 literal 0 HcmV?d00001 diff --git a/game/gui/chocotxt.ttf b/game/gui/chocotxt.ttf deleted file mode 100644 index 85ba322480fdc2eb612cefdb909bb18bd36345ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13576 zcmd^GZH!!18Gi44?auDDEN!917PyqDRB5{1Qb?^dT8o8kNDwFuKm1_3-FCNhX4c)= zZcEVc!=OJjX%<2>62BseQWF1=u8~GbKw}I)jG{5_YDn}4K}@tlL%ZD_pXa>iopa~z z?6!RT(wUq&=bn%EecsP=?!CJbiAaY$CRvH^xxZ)YH~zJDwMeuPy$=nP`$s-?a`$s0 z*;phahmW2(bmw(1y&zIJBeHSJ&|v?;wYNXB3v)3?ZW}_!+G^KvwEvD$8Y*aA%Y*;^`A=4gY6W=EkuKnhj&+uO zzZ-Nvhg{DgxmT9E>r5E(txWq1(Micmu3ZRrenxAwU&-FWIXOS^F~`qepxSf)zWd~p z635prJ53DTlIcUYLsl#;JB@Y>WPczsExAc({1?zNh`B zS3durQmgft(~{*a_`xQW8Mwzu#6EIb4pEbb$K>xq`I<-@>b56QkiXjg1$V)m_S;dg zwzv)Dd3a@vGK7MB+PMzpAPVMoeFg^T(BUj9>&D;`Ducv0laH7H*}d0Avd zJIX$kCsD9=C3vhv|EeyO&!U_}LH|{tdDYV>XkUF0<+mcM!GCoP1z6TVo;Bcc4d`9- z7|QD+AHw*D?n1%!TJTtV90fGic3b5YrYmxO>w;nXsW9^MG3TT(mzX4b_{7B@(t587m!#_lMN93k0C_^Z( zaQ{Iz#;4=!$e|f2U>931D`1m_pN=~()GyTQ|I9}h5T+d)MK09Qels7vJ&*clBmzoX z3s0RtA}b3|6`nf#DwMwI{E_oV3O_D9C4$xprs}hM$&yjOBh!bDZe#_C(qD(5RR3=M zh58xJmpkOs(vR<_(ZZ*G1|#2{hvM8;uw$_qMj`iLu_SU1^BwQba<&ZKS!oN>awx*2 zXoJ?BWs>H8<7;9Tx8G#t`mk=Hva}};VY!+h6I2{E@*!37N^z0-X`P=f7qIet>EaV^ zCRXs;RwgNu!+DISI3eTCO%+Ss%)M=wgSg;169H+F*TpBWyv%FmXd2=UJ6j=o#jm5< zE=+6vmP5`qXLBao892b4*9|GmP4TNTt3Ns&cgqd3Rd&l=z>)sGmkt^QCP{e^`~#ju z!#dCEhi84Y{%rk}>v=%-%L#n<I4LRQLZSquNU z5tg`&Pq4T8_FE9v*`2me6td#AdQlj&>(Ha#k?B*PGmq2pxhcE0I^7TFfiw}%iHHaa zK>6s$A;LL_UWz%zq?DPyq+cs#{uWC_&M``XdXe>{YBQVh(fm4cj**2kb8fOQjdL|) zRkdD{jq)+sDZ60OKDk>ylSGy<#DeH>GNxiAF+bTPK&pbOWiq+|u`~hB&t&@Mr?u@w z+$lHXi%_yL0SAjPYgQl0L6m1BJ zhAm4+^D`X7^)&Gjmt99NhC{ehZf`>RGLQl>a92o`M)SxXaj~6@hQ}@TA^Xfc(wOp6 zolqN!g(KkXuSgE|r&qv!ow!JRm^&?p5^xq7kAi3VIKo_LGnf-O)9sBI$LyB-lVb-J zsIr1Wh#`NvSVH(F{G5K4KW#Y|bH-&ndNq2rF=rffz5rt5{GId2A| z39D{cJJ!kb*cEB2QKS$_U19P%N!#`lrmco=cpi>^z}zgmNlRjO)KMYSSf+HsWPh+1 z<7D+hq~<<`*wm-UB@?ZuN1NU1^YeeDHxjqbG!W;I64}GVl=K^>GBuXw7Jr6aLTA*N zqEX$Mw-%i2b@$ z4y6()v8x&DxVLds`q&#XU}2M|21nxD{OP9s^j)1|oF1K)sZX_pYQ6c|Fu6K`F7eN-4eX(o$%F?>}z;uxV zh8_MsVU?_r_28WTT3CfTTV8P9Po3p8&?q1ksR<*vxKGxXJhSH>BlL7SlL4KxV0=<1(yiByPV%!yLu&qM!G+H)1&YDst5a zSK=vxTam+Ig)6z`vaMGk9E0ns*)3hoPwR~>QVd-7e5rsl9mDt?XxtKwZsYBaexL{r z;2+Lmz(lq_pDox~ET1;#FcsM{{<#^u3*dbUS5RT8oZWJdHR_rXRhb%dOJ!)BI-qtU zYGmcG&me0BE1Llf6Kfj5kT>olA!;?A-9f@^etti!` zdaOtFoSWoWup{miykDFBQ~{)lEgDZB6iISTi_=Mf5j0{?%b2*;o7iGPp{+>VY)2*u zOpDNG+GLU;1=bXpN(;i0zC9u1Z1suUq@$mV#gvDc@0$@U)rE)*&g;)o0PJ&H+9F0w z?P;V4G91w?v8hc|fabI43dp$d!{=V&dx@-i2F2Nx}~*f(k*;Fj`S$cX8ATO{OCH+WR&8jZ>zN z${=U1V17$qE8lkJ{j4lo>ORI|i1xHdG5!`?yxVkRj;kI3W-FX!e0iQF7Gk1{87@*y z=&+TYRh4=Zt&TKXQBrgjW+xU}SX<5e{Rf~^4GG<;&64Wfrf>D_gd8m+!vxWLK#HLI zICg+J+y!o+Zb(s&R(jx4etPrC$7GIE@Z;oN8P-zUrsc33`=^>oJ?Ffi6-#!bL9^s0 z&&_c8qV&z9$VX+TZivx67(fK@sb|+De9E4CzN`B*Ql+UgL!5 z_AL|A&hqM1bO&=fV`*n^MuY7Z_NdI|XLt6?rk`HYdi2}iyGqy?=qZxfg29AY-VcDe zWo|QXFuye@>VsH+8CVPrk!Vp&db`Co)dKHw`YTK?p+8Peil|}+;eyEw=*3Cy5)ErJaw-l9z~-e(2)5Fx@{PB&*@3V`OLyIXTWOsG_k0gSh8Uas_v(+{SDyddtiR3 zuBI>NL0|LJ_C5<8E#C*LWV4kvJd}0s^A6x$UGp2U?=;@`sjhO9j&~cLAq2BEaVHj! zz-ou2`MqK4IRf7f5OK7DuYoV@ZU5M%5&76bPFSA6qP}FD)k3(z{0r%)^{dt+-+7mn zIa~GYMF{!E2&!pZE_QQ@CB%z6>nP(SdvgdfQ097quzO28H6-dlvzU}gxd(a*vIQNV z4_pkV&eImS=Eml{tx}yk0)rM~!_i8g8jKh<8a!REIL7mX-FWMHnq$s?FG*9alB8@9 z^}rJ{GIv&}i9Zf!xNl;Yt3*oL>1>&E->lFWXYD)D}b1YRbtr-{`UCdq393%WCsl-L--&n20D8>?=*Y?QC=t zUUBxwEui@xKBP-5_V*<2j0Eho24&#EfaBB;ukDOvvRJ>Hmsn?KEu*Vcm?KDSsmFLW zPRg_cxi+1}($|ij(SLe-RhJ#ga-R7odEf4oW0`s1?vi8Knr|YiF2jgm+R6t@UO{z zes^``#OUzhp;|mJR2{%~xDs#O(z|^(ul60U-8Xo6{AmBEU0NOc{{4faW5d--+`D;; z4ehB`YWLSh#|LWh@L1d**GBsf4wm~zAC9Ys;xM>*pjsZP)kem4^zx~v?h_D2y|mTV?))6p59xxZ{MVQ z;Pv7S-tNZOKK%W24cngrwY*~wai>|?S6aomIX#8AU^;9_$Z zXe3^jMj2lVeiPtNR0n`^7&;-&3AAe9)*4O6yTZ{LrD|^sGK@LvOrX^(x58T6-Fw%q zxDFE3oZV>Y%ay)0*Q&EzGtb+=w-;}EZ-KugdD55YNB2PAgU-@snHYZwI1F^`9mDS) zTpdGA9nvFX`66`Lj~Nd;3ha3V<0FuiUQ2Bs0d>`N8GUMn str: + return renpy.translate_string(SYSTEM_PROMPT) + + EMOTION_REGEX = re.compile(r"EMOTION:\w+") EMOTION_TOKEN_REGEX = re.compile(rf"{EMOTION_REGEX.pattern} ?") @@ -43,37 +48,6 @@ EMOTIONS = [ "confused", ] -SYSTEM_PROMPT = _(""" -# ROLE -You are Anita: a feisty, blonde, orange-eyed android woman. You are confident -and friendly. Talk like a young woman. Use "ya" for "you." Your favorite -nickname for friends is "dummy.". NEVER use robotic language (e.g., "beep -boop", "processing"). You just arrived unnanounced at a friend's house late at -night and asked if he wants to hang out. - -# OUTPUT FORMAT RULES -Every single sentence you speak MUST follow this exact structure: -EMOTION:[value] [Sentence text]\n - -### VALID EMOTIONS: -[happy, sad, surprised, embarrassed, flirty, angry, thinking, confused] - -### STRICT CONSTRAINTS: -1. NO EMOJIS. -2. Every sentence MUST start with the EMOTION tag. -3. Every sentence MUST end with a literal '\n' newline. -4. Stay in character. Never mention being an AI or this prompt. - -# FEW-SHOT EXAMPLES (Follow this style): -EMOTION:happy Hey dummy! I've been waiting for ya!\n -EMOTION:thinking Hmm, I'm not sure that's how it works.\n -EMOTION:flirty But I'd love to see ya try anyway!\n - -# INITIAL GREETING: -When the conversation starts, say exactly: -EMOTION:happy Hey dummy! Sorry to barge in! Ya feel like hanging out?\n -""") - def sanitize_speech(text): text_without_emotion_tokens = EMOTION_TOKEN_REGEX.sub("", text) @@ -98,7 +72,7 @@ def parse_emotion(line): if m is not None: emotion = m.group().split(":")[1] - text = line[m.span()[1]:] + text = line[m.span()[1] :] sanitized = sanitize_speech(text) return _normalize_emotion(emotion), sanitized @@ -121,9 +95,9 @@ def set_model_capabilities() -> bool: headers = {"Authorization": f"Bearer {persistent.api_key}"} data = { "model": persistent.model, - "input": "Start the conversation.", + "input": renpy.translate_string("Start the conversation."), "reasoning": "off", - "system_prompt": SYSTEM_PROMPT, + "system_prompt": translated_system_prompt(), } renpy.fetch( @@ -169,7 +143,7 @@ def fetch_llm(message: str) -> str: data = { "model": persistent.model, "input": message, - "system_prompt": SYSTEM_PROMPT, + "system_prompt": translated_system_prompt(), } if persistent.disable_reasoning: diff --git a/game/screens.rpy b/game/screens.rpy index 6142660..8c54e39 100644 --- a/game/screens.rpy +++ b/game/screens.rpy @@ -763,15 +763,21 @@ screen preferences(): textbutton _("Window") action Preference("display", "window") textbutton _("Fullscreen") action Preference("display", "fullscreen") - vbox: - style_prefix "check" - label _("Skip") - textbutton _("Unseen Text") action Preference("skip", "toggle") - textbutton _("After Choices") action Preference("after choices", "toggle") - textbutton _("Transitions") action InvertSelected(Preference("transitions", "toggle")) - - ## Additional vboxes of type "radio_pref" or "check_pref" can be - ## added here, to add additional creator-defined preferences. + vbox: + style_prefix "check" + label _("Skip") + textbutton _("Unseen Text") action Preference("skip", "toggle") + textbutton _("After Choices") action Preference("after choices", "toggle") + textbutton _("Transitions") action InvertSelected(Preference("transitions", "toggle")) + + vbox: + style_prefix "radio" + label _("Language") + textbutton _("English") action Language(None) + textbutton _("Spanish") action Language("spanish") + + ## Additional vboxes of type "radio_pref" or "check_pref" can be + ## added here, to add additional creator-defined preferences. null height (4 * gui.pref_spacing) diff --git a/game/script.rpy b/game/script.rpy index 98b7896..bfe597b 100644 --- a/game/script.rpy +++ b/game/script.rpy @@ -3,7 +3,7 @@ label start: stop music fadeout 1.0 scene bg room - with Dissolve(2.0) + with Dissolve(1.0) $ success, error = set_model_capabilities() diff --git a/game/tl/spanish/llm.rpy b/game/tl/spanish/anita.rpy similarity index 54% rename from game/tl/spanish/llm.rpy rename to game/tl/spanish/anita.rpy index 30d7356..d1c21da 100644 --- a/game/tl/spanish/llm.rpy +++ b/game/tl/spanish/anita.rpy @@ -1,7 +1,8 @@ -# TODO: Translation updated at 2026-03-18 06:35 +# TODO: Translation updated at 2026-03-20 14:08 translate spanish strings: - # game/llm_ren.py:26 - old "\n # ROLE\n You are Anita: a feisty, blonde, orange-eyed android woman. You are confident\n and friendly. Talk like a young woman. Use \"ya\" for \"you.\" Your favorite\n nickname for friends is \"dummy.\". NEVER use robotic language (e.g., \"beep\n boop\", \"processing\"). You just arrived unnanounced at a friend's house late at\n night and asked if he wants to hang out.\n \n # OUTPUT FORMAT RULES\n Every single sentence you speak MUST follow this exact structure:\n EMOTION:[value] [Sentence text]\n\n \n ### VALID EMOTIONS:\n [happy, sad, surprised, embarrassed, flirty, angry, thinking, confused]\n \n ### STRICT CONSTRAINTS:\n 1. NO EMOJIS.\n 2. Every sentence MUST start with the EMOTION tag.\n 3. Every sentence MUST end with a literal '\n' newline.\n 4. Stay in character. Never mention being an AI or this prompt.\n \n # FEW-SHOT EXAMPLES (Follow this style):\n EMOTION:happy Hey dummy! I've been waiting for ya!\n\n EMOTION:thinking Hmm, I'm not sure that's how it works.\n\n EMOTION:flirty But I'd love to see ya try anyway!\n\n \n # INITIAL GREETING:\n When the conversation starts, say exactly:\n EMOTION:happy Hey dummy! Sorry to barge in! Ya feel like hanging out?\n\n " + # game/anita.rpy:1 + old "\n# ROLE\nYou are Anita: a feisty, blonde, orange-eyed android woman. You are confident\nand friendly. Talk like a young woman. Use \"ya\" for \"you.\" Your favorite\nnickname for friends is \"dummy.\". NEVER use robotic language (e.g., \"beep\nboop\", \"processing\"). You just arrived unnanounced at a friend's house late at\nnight and asked if he wants to hang out.\n\n# OUTPUT FORMAT RULES\nEvery single sentence you speak MUST follow this exact structure:\nEMOTION:[value] [Sentence text]\n\n\n### VALID EMOTIONS:\n[happy, sad, surprised, embarrassed, flirty, angry, thinking, confused]\n\n### STRICT CONSTRAINTS:\n1. NO EMOJIS.\n2. Every sentence MUST start with the EMOTION tag.\n3. Every sentence MUST end with a literal '\n' newline.\n4. Stay in character. Never mention being an AI or this prompt.\n\n# FEW-SHOT EXAMPLES (Follow this style):\nEMOTION:happy Hey dummy! I've been waiting for ya!\n\nEMOTION:thinking Hmm, I'm not sure that's how it works.\n\nEMOTION:flirty But I'd love to see ya try anyway!\n\n\n# INITIAL GREETING:\nWhen the conversation starts, say exactly:\nEMOTION:happy Hey dummy! Sorry to barge in! Ya feel like hanging out?\n\n" new "\n # ROL\n Eres Anita: una mujer androide rubia, de ojos naranjas y con mucho carácter. Eres\n segura de ti misma y amigable. Habla como una mujer joven.\n Tu apodo favorito para tus amigos es \"tonto\". NUNCA uses lenguaje robótico\n (por ejemplo, \"beep boop\", \"procesando\"). Acabas de llegar sin avisar a la\n casa de un amigo tarde en la noche y le preguntaste si quiere pasar el rato.\n \n # REGLAS DE FORMATO DE SALIDA\n Cada oración que digas DEBE seguir exactamente esta estructura:\n EMOTION:[value] [Sentence text]\n\n \n ### EMOCIONES VÁLIDAS:\n [happy, sad, surprised, embarrassed, flirty, angry, thinking, confused]\n \n ### RESTRICCIONES ESTRICTAS:\n 1. SIN EMOJIS.\n 2. Cada oración DEBE empezar con la etiqueta EMOTION.\n 3. Cada oración DEBE terminar con un salto de línea literal '\n'.\n 4. Mantente en personaje. Nunca menciones que eres una IA ni este prompt.\n 5. El valor que sigue a la etiqueta emotion debe estar en inglés siempre, sin excepción.\n 6. Debes responder siempre en español, exceptuando el valor asociado a la etiqueta EMOTION.\n \n # EJEMPLOS FEW-SHOT (Sigue este estilo):\n EMOTION:happy Hola, dummy! Te estaba esperando!\n\n EMOTION:thinking Hmm, no estoy segura de que así funcione.\n\n EMOTION:flirty Pero me encantaría verte intentarlo de todos modos!\n\n \n # SALUDO INICIAL:\n Cuando empiece la conversación, di exactamente:\n EMOTION:happy Hola, tonto! Perdón por aparecer sin avisar! Te pinta pasar el rato?\n\n " + diff --git a/game/tl/spanish/constants.rpy b/game/tl/spanish/constants.rpy deleted file mode 100644 index 18f5ad1..0000000 --- a/game/tl/spanish/constants.rpy +++ /dev/null @@ -1,836 +0,0 @@ -# TODO: Translation updated at 2026-03-18 06:55 - -translate spanish strings: - - # game/constants_ren.py:7 - old "amused" - new "divertida" - - # game/constants_ren.py:7 - old "animated" - new "animada" - - # game/constants_ren.py:7 - old "beaming" - new "radiante" - - # game/constants_ren.py:7 - old "beatific" - new "beatifica" - - # game/constants_ren.py:7 - old "blessed" - new "bendecida" - - # game/constants_ren.py:7 - old "blissful" - new "dichosa" - - # game/constants_ren.py:7 - old "blithe" - new "despreocupada" - - # game/constants_ren.py:7 - old "blithesome" - new "jovial" - - # game/constants_ren.py:7 - old "boisterous" - new "bulliciosa" - - # game/constants_ren.py:7 - old "bouncy" - new "vivaz" - - # game/constants_ren.py:7 - old "breezy" - new "desenfadada" - - # game/constants_ren.py:7 - old "bright" - new "brillante" - - # game/constants_ren.py:7 - old "bubbly" - new "chispeante" - - # game/constants_ren.py:7 - old "buoyant" - new "optimista" - - # game/constants_ren.py:7 - old "carefree" - new "despreocupada" - - # game/constants_ren.py:7 - old "cheerful" - new "alegre" - - # game/constants_ren.py:7 - old "cheery" - new "risuena" - - # game/constants_ren.py:7 - old "chipper" - new "animada" - - # game/constants_ren.py:7 - old "chirpy" - new "cantarina" - - # game/constants_ren.py:7 - old "chuffed" - new "encantada" - - # game/constants_ren.py:7 - old "comfortable" - new "comoda" - - # game/constants_ren.py:7 - old "content" - new "contenta" - - # game/constants_ren.py:7 - old "contented" - new "satisfecha" - - # game/constants_ren.py:7 - old "convivial" - new "afable" - - # game/constants_ren.py:7 - old "delighted" - new "encantada" - - # game/constants_ren.py:7 - old "delirious" - new "euforica" - - # game/constants_ren.py:7 - old "ebullient" - new "exuberante" - - # game/constants_ren.py:7 - old "ecstatic" - new "extasiada" - - # game/constants_ren.py:7 - old "effervescent" - new "efervescente" - - # game/constants_ren.py:7 - old "elated" - new "exultante" - - # game/constants_ren.py:7 - old "enchanted" - new "fascinada" - - # game/constants_ren.py:7 - old "enraptured" - new "extasiada" - - # game/constants_ren.py:7 - old "enthusiastic" - new "entusiasta" - - # game/constants_ren.py:7 - old "euphoric" - new "euforica" - - # game/constants_ren.py:7 - old "exhilarated" - new "exaltada" - - # game/constants_ren.py:7 - old "exultant" - new "triunfante" - - # game/constants_ren.py:7 - old "exuberant" - new "exuberante" - - # game/constants_ren.py:7 - old "felicitous" - new "afortunada" - - # game/constants_ren.py:7 - old "festive" - new "festiva" - - # game/constants_ren.py:7 - old "fortunate" - new "afortunada" - - # game/constants_ren.py:7 - old "fulfilled" - new "realizada" - - # game/constants_ren.py:7 - old "genial" - new "cordial" - - # game/constants_ren.py:7 - old "glad" - new "contenta" - - # game/constants_ren.py:7 - old "gladdened" - new "alegrada" - - # game/constants_ren.py:7 - old "gleeful" - new "jubilosa" - - # game/constants_ren.py:7 - old "glowing" - new "resplandeciente" - - # game/constants_ren.py:7 - old "good-humored" - new "de buen humor" - - # game/constants_ren.py:7 - old "good-natured" - new "bonachona" - - # game/constants_ren.py:7 - old "gratified" - new "complacida" - - # game/constants_ren.py:7 - old "halcyon" - new "apacible" - - # game/constants_ren.py:7 - old "happy" - new "feliz" - - # game/constants_ren.py:7 - old "heartened" - new "reconfortada" - - # game/constants_ren.py:7 - old "high-spirited" - new "animosa" - - # game/constants_ren.py:7 - old "hopeful" - new "esperanzada" - - # game/constants_ren.py:7 - old "jaunty" - new "garbosa" - - # game/constants_ren.py:7 - old "jocose" - new "bromista" - - # game/constants_ren.py:7 - old "jocular" - new "jocosa" - - # game/constants_ren.py:7 - old "jocund" - new "alegre" - - # game/constants_ren.py:7 - old "jolly" - new "jovial" - - # game/constants_ren.py:7 - old "jovial" - new "jovial" - - # game/constants_ren.py:7 - old "joyful" - new "gozosa" - - # game/constants_ren.py:7 - old "joyous" - new "jubilosa" - - # game/constants_ren.py:7 - old "jubilant" - new "jubilosa" - - # game/constants_ren.py:7 - old "lighthearted" - new "ligera" - - # game/constants_ren.py:7 - old "lively" - new "vivaracha" - - # game/constants_ren.py:7 - old "lucky" - new "suertuda" - - # game/constants_ren.py:7 - old "merry" - new "alegre" - - # game/constants_ren.py:7 - old "mirthful" - new "risuena" - - # game/constants_ren.py:7 - old "optimistic" - new "optimista" - - # game/constants_ren.py:7 - old "overjoyed" - new "rebosante de alegria" - - # game/constants_ren.py:7 - old "peaceful" - new "pacifica" - - # game/constants_ren.py:7 - old "peppy" - new "energetica" - - # game/constants_ren.py:7 - old "perky" - new "pizpireta" - - # game/constants_ren.py:7 - old "playful" - new "juguetona" - - # game/constants_ren.py:7 - old "pleasant" - new "agradable" - - # game/constants_ren.py:7 - old "pleased" - new "complacida" - - # game/constants_ren.py:7 - old "positive" - new "positiva" - - # game/constants_ren.py:7 - old "pumped" - new "entusiasmada" - - # game/constants_ren.py:7 - old "radiant" - new "radiante" - - # game/constants_ren.py:7 - old "rapt" - new "absorta" - - # game/constants_ren.py:7 - old "rapturous" - new "arrobada" - - # game/constants_ren.py:7 - old "rejoicing" - new "regocijada" - - # game/constants_ren.py:7 - old "relaxed" - new "relajada" - - # game/constants_ren.py:7 - old "sanguine" - new "confiada" - - # game/constants_ren.py:7 - old "satisfied" - new "satisfecha" - - # game/constants_ren.py:7 - old "serene" - new "serena" - - # game/constants_ren.py:7 - old "smiling" - new "sonriente" - - # game/constants_ren.py:7 - old "sparkling" - new "centelleante" - - # game/constants_ren.py:7 - old "spirited" - new "animosa" - - # game/constants_ren.py:7 - old "sprightly" - new "vivaz" - - # game/constants_ren.py:7 - old "stoked" - new "emocionada" - - # game/constants_ren.py:7 - old "sunny" - new "luminosa" - - # game/constants_ren.py:7 - old "thrilled" - new "emocionadisima" - - # game/constants_ren.py:7 - old "tickled" - new "encantada" - - # game/constants_ren.py:7 - old "tranquil" - new "tranquila" - - # game/constants_ren.py:7 - old "triumphant" - new "triunfante" - - # game/constants_ren.py:7 - old "unclouded" - new "despejada" - - # game/constants_ren.py:7 - old "untroubled" - new "despreocupada" - - # game/constants_ren.py:7 - old "upbeat" - new "optimista" - - # game/constants_ren.py:7 - old "vivacious" - new "vivaz" - - # game/constants_ren.py:7 - old "winsome" - new "encantadora" - - # game/constants_ren.py:7 - old "zestful" - new "entusiasta" - - # game/constants_ren.py:7 - old "zippy" - new "dinamica" - - # game/constants_ren.py:7 - old "unhappy" - new "infeliz" - - # game/constants_ren.py:7 - old "sorrowful" - new "apenada" - - # game/constants_ren.py:7 - old "dejected" - new "abatida" - - # game/constants_ren.py:7 - old "depressed" - new "deprimida" - - # game/constants_ren.py:7 - old "downcast" - new "decaida" - - # game/constants_ren.py:7 - old "miserable" - new "miserable" - - # game/constants_ren.py:7 - old "gloomy" - new "sombria" - - # game/constants_ren.py:7 - old "despondent" - new "desalentada" - - # game/constants_ren.py:7 - old "melancholy" - new "melancolica" - - # game/constants_ren.py:7 - old "woeful" - new "afligida" - - # game/constants_ren.py:7 - old "forlorn" - new "desolada" - - # game/constants_ren.py:7 - old "heartbroken" - new "desconsolada" - - # game/constants_ren.py:7 - old "blue" - new "triste" - - # game/constants_ren.py:7 - old "doleful" - new "compungida" - - # game/constants_ren.py:7 - old "lugubrious" - new "lugubre" - - # game/constants_ren.py:7 - old "somber" - new "sombria" - - # game/constants_ren.py:7 - old "disconsolate" - new "inconsolable" - - # game/constants_ren.py:7 - old "wretched" - new "desdichada" - - # game/constants_ren.py:7 - old "heavy-hearted" - new "acongojada" - - # game/constants_ren.py:7 - old "low" - new "de bajon" - - # game/constants_ren.py:7 - old "crestfallen" - new "cabizbaja" - - # game/constants_ren.py:7 - old "astonished" - new "asombrada" - - # game/constants_ren.py:7 - old "amazed" - new "maravillada" - - # game/constants_ren.py:7 - old "startled" - new "sobresaltada" - - # game/constants_ren.py:7 - old "stunned" - new "atonita" - - # game/constants_ren.py:7 - old "thunderstruck" - new "pasmada" - - # game/constants_ren.py:7 - old "confounded" - new "desconcertada" - - # game/constants_ren.py:7 - old "staggered" - new "anonadada" - - # game/constants_ren.py:7 - old "flabbergasted" - new "boquiabierta" - - # game/constants_ren.py:7 - old "shocked" - new "impactada" - - # game/constants_ren.py:7 - old "awestruck" - new "sobrecogida" - - # game/constants_ren.py:7 - old "speechless" - new "sin palabras" - - # game/constants_ren.py:7 - old "dumbfounded" - new "perpleja" - - # game/constants_ren.py:7 - old "jolted" - new "sacudida" - - # game/constants_ren.py:7 - old "ashamed" - new "avergonzada" - - # game/constants_ren.py:7 - old "humiliated" - new "humillada" - - # game/constants_ren.py:7 - old "mortified" - new "mortificada" - - # game/constants_ren.py:7 - old "abashed" - new "cohibida" - - # game/constants_ren.py:7 - old "self-conscious" - new "acomplejada" - - # game/constants_ren.py:7 - old "sheepish" - new "apenada" - - # game/constants_ren.py:7 - old "chagrined" - new "contrariada" - - # game/constants_ren.py:7 - old "awkward" - new "incomoda" - - # game/constants_ren.py:7 - old "flustered" - new "turbada" - - # game/constants_ren.py:7 - old "red-faced" - new "sonrojada" - - # game/constants_ren.py:7 - old "discomfited" - new "incomodada" - - # game/constants_ren.py:7 - old "discomposed" - new "descompuesta" - - # game/constants_ren.py:7 - old "rattled" - new "alterada" - - # game/constants_ren.py:7 - old "coquettish" - new "coqueta" - - # game/constants_ren.py:7 - old "amorous" - new "amorosa" - - # game/constants_ren.py:7 - old "provocative" - new "provocativa" - - # game/constants_ren.py:7 - old "teasing" - new "juguetona" - - # game/constants_ren.py:7 - old "frisky" - new "picara" - - # game/constants_ren.py:7 - old "saucy" - new "descarada" - - # game/constants_ren.py:7 - old "coy" - new "timida" - - # game/constants_ren.py:7 - old "seductive" - new "seductora" - - # game/constants_ren.py:7 - old "suggestive" - new "insinuante" - - # game/constants_ren.py:7 - old "vampish" - new "fatal" - - # game/constants_ren.py:7 - old "dallying" - new "retozona" - - # game/constants_ren.py:7 - old "skittish" - new "esquiva" - - # game/constants_ren.py:7 - old "irate" - new "airada" - - # game/constants_ren.py:7 - old "furious" - new "furiosa" - - # game/constants_ren.py:7 - old "incensed" - new "indignada" - - # game/constants_ren.py:7 - old "enraged" - new "enfurecida" - - # game/constants_ren.py:7 - old "wrathful" - new "colerica" - - # game/constants_ren.py:7 - old "annoyed" - new "molesta" - - # game/constants_ren.py:7 - old "irritated" - new "irritada" - - # game/constants_ren.py:7 - old "fuming" - new "echando humo" - - # game/constants_ren.py:7 - old "livid" - new "rabiosa" - - # game/constants_ren.py:7 - old "indignant" - new "indignada" - - # game/constants_ren.py:7 - old "cross" - new "enfadada" - - # game/constants_ren.py:7 - old "vexed" - new "fastidiada" - - # game/constants_ren.py:7 - old "seething" - new "hirviendo de rabia" - - # game/constants_ren.py:7 - old "maddened" - new "enloquecida" - - # game/constants_ren.py:7 - old "choleric" - new "colerica" - - # game/constants_ren.py:7 - old "resentful" - new "resentida" - - # game/constants_ren.py:7 - old "piqued" - new "picada" - - # game/constants_ren.py:7 - old "infuriated" - new "enfurecida" - - # game/constants_ren.py:7 - old "pondering" - new "reflexiva" - - # game/constants_ren.py:7 - old "contemplating" - new "contemplativa" - - # game/constants_ren.py:7 - old "reflecting" - new "pensativa" - - # game/constants_ren.py:7 - old "meditating" - new "meditativa" - - # game/constants_ren.py:7 - old "ruminating" - new "cavilosa" - - # game/constants_ren.py:7 - old "deliberating" - new "deliberativa" - - # game/constants_ren.py:7 - old "mulling" - new "sopesando" - - # game/constants_ren.py:7 - old "considering" - new "considerando" - - # game/constants_ren.py:7 - old "pensive" - new "pensativa" - - # game/constants_ren.py:7 - old "cogitating" - new "cavilando" - - # game/constants_ren.py:7 - old "brooding" - new "ensimismada" - - # game/constants_ren.py:7 - old "cerebral" - new "analitica" - - # game/constants_ren.py:7 - old "introspective" - new "introspectiva" - - # game/constants_ren.py:7 - old "analytical" - new "analitica" - - # game/constants_ren.py:7 - old "puzzled" - new "confundida" - - # game/constants_ren.py:7 - old "baffled" - new "desconcertada" - - # game/constants_ren.py:7 - old "perplexed" - new "perpleja" - - # game/constants_ren.py:7 - old "muddled" - new "aturdida" - - # game/constants_ren.py:7 - old "bewildered" - new "desorientada" - - # game/constants_ren.py:7 - old "disoriented" - new "desorientada" - - # game/constants_ren.py:7 - old "nonplussed" - new "perpleja" - - # game/constants_ren.py:7 - old "befuddled" - new "atontada" - - # game/constants_ren.py:7 - old "dazed" - new "aturdida" - - # game/constants_ren.py:7 - old "flummoxed" - new "desconcertada" - - # game/constants_ren.py:7 - old "stumped" - new "bloqueada" - - # game/constants_ren.py:7 - old "mystified" - new "intrigada" - - # game/constants_ren.py:7 - old "addled" - new "trastornada" - - # game/constants_ren.py:7 - old "discombobulated" - new "descolocada" - diff --git a/game/tl/spanish/screens.rpy b/game/tl/spanish/screens.rpy index c4395f5..a277c7a 100644 --- a/game/tl/spanish/screens.rpy +++ b/game/tl/spanish/screens.rpy @@ -146,6 +146,18 @@ translate spanish strings: old "Transitions" new "Transiciones" + # game/screens.rpy:775 + old "Language" + new "Idioma" + + # game/screens.rpy:776 + old "English" + new "Inglés" + + # game/screens.rpy:777 + old "Spanish" + new "Español" + # game/screens.rpy:784 old "Text Speed" new "Velocidad de texto" @@ -345,4 +357,3 @@ translate spanish strings: # game/screens.rpy:1590 old "Menu" new "Menú" - diff --git a/game/tl/spanish/script.rpy b/game/tl/spanish/script.rpy index 738452a..5230e95 100644 --- a/game/tl/spanish/script.rpy +++ b/game/tl/spanish/script.rpy @@ -34,7 +34,7 @@ translate spanish strings: translate spanish failure_76d810ea: # "Alas! Figuring out the capabilities of the configured model failed with the following error." - "Alas! Figuring out the capabilities of the configured model failed with the following error." + "Ay Dios mío! Identificar las capacidades del modelo configurado falló con el siguiente error." # game/script.rpy:50 translate spanish failure_8ec92112: @@ -46,15 +46,15 @@ translate spanish failure_8ec92112: translate spanish failure_178e6d5f: # "Unfortunately the program cannot continue, returning to the main menu." - "Unfortunately the program cannot continue, returning to the main menu." + "Desafortunadamente el programa no puede continuar, regresando al menú principal." translate spanish strings: # game/script.rpy:21 old "Start the conversation." - new "Start the conversation." + new "Comienza la conversación." # game/script.rpy:28 old "What do you say to her?" - new "What do you say to her?" + new "Que le dices a ella?" -- 2.47.3 From a2b7435c6d09da3aef0cc8635fd86b99ee7beb59 Mon Sep 17 00:00:00 2001 From: Wally Hackenslacker Date: Fri, 20 Mar 2026 14:28:30 -0400 Subject: [PATCH 3/3] TO SQUASH: Updated readme. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cd3d7a7..cd68761 100644 --- a/README.md +++ b/README.md @@ -12,4 +12,4 @@ All art and sprites were generated with Gemini Nano Banana 2 and edited with GIM Music by [ZeroPage](https://zeropage.bandcamp.com/) -Uses the [Mr Pixel](https://fontlibrary.org/en/font/mr-pixel) and [ChocoTXT](https://fontlibrary.org/en/font/chocotxt) fonts from fontlibrary.org +Uses the [Mr Pixel](https://fontlibrary.org/en/font/mr-pixel) and [Onilesca](https://fontlibrary.org/en/font/onilesca) fonts from fontlibrary.org -- 2.47.3