translation #1

Merged
WallyHackenslacker merged 3 commits from translation into master 2026-03-20 18:29:30 +00:00
17 changed files with 2183 additions and 155 deletions

View File

@@ -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

View File

@@ -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.

View File

@@ -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.

30
game/anita.rpy Normal file
View File

@@ -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
"""

View File

@@ -3,54 +3,221 @@ 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",
'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",
"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",
"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"]),
}

View File

@@ -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

View File

@@ -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
-----------------------------------------------------------

BIN
game/gui/Onilesca.ttf Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -1,6 +1,8 @@
import renpy
import persistent
from renpy import _
from .anita import SYSTEM_PROMPT
from .constants_ren import SYNONYMS
"""renpy
@@ -12,6 +14,10 @@ init python:
import re
def translated_system_prompt() -> str:
return renpy.translate_string(SYSTEM_PROMPT)
EMOTION_REGEX = re.compile(r"EMOTION:\w+")
EMOTION_TOKEN_REGEX = re.compile(rf"{EMOTION_REGEX.pattern} ?")
@@ -42,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)
@@ -97,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
@@ -120,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(
@@ -168,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:

View File

@@ -770,6 +770,12 @@ screen preferences():
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.

View File

@@ -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()
@@ -18,14 +18,14 @@ label start:
show anita happy with dissolve
python:
response = fetch_llm('Start the conversation.')[0]
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?")
message = renpy.input(prompt = _("What do you say to her?"))
response = fetch_llm(message)
i = 0

View File

@@ -0,0 +1,8 @@
# TODO: Translation updated at 2026-03-20 14:08
translate spanish strings:
# 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 "

1224
game/tl/spanish/common.rpy Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -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"

359
game/tl/spanish/screens.rpy Normal file
View File

@@ -0,0 +1,359 @@
# 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: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"
# 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ú"

View File

@@ -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."
"Ay Dios mío! Identificar las capacidades del modelo configurado falló con el siguiente 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."
"Desafortunadamente el programa no puede continuar, regresando al menú principal."
translate spanish strings:
# game/script.rpy:21
old "Start the conversation."
new "Comienza la conversación."
# game/script.rpy:28
old "What do you say to her?"
new "Que le dices a ella?"