From 2d83726cc03286f04064a9db483967020e80002b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 4 Sep 2026 12:16:11 -0300 Subject: [PATCH 01/11] Locale: Regenerate the POT file There are 2 new strings to translate since the last time. --- locale/threadbare.pot | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/locale/threadbare.pot b/locale/threadbare.pot index d3f9de8f9c..f9fab301b2 100644 --- a/locale/threadbare.pot +++ b/locale/threadbare.pot @@ -109,6 +109,10 @@ msgstr "" msgid "Player Abilities" msgstr "" +#: scenes/menus/debug/debug_settings.tscn +msgid "Open Current Scene In Editor" +msgstr "" + #: scenes/globals/pause/pause_overlay.tscn msgid "Inventory" msgstr "" @@ -146,6 +150,7 @@ msgid "Next" msgstr "" #: scenes/menus/title/components/main_menu.gd:23 +#: scenes/menus/quest_separator/quest_separator.tscn msgid "Restart" msgstr "" From a67eeabf38683b8f14c257309dbdc6ff08a587f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 4 Sep 2026 12:25:05 -0300 Subject: [PATCH 02/11] Update Spanish translation --- locale/es.po | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/locale/es.po b/locale/es.po index b4a52dc43c..3e7b7b4133 100644 --- a/locale/es.po +++ b/locale/es.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Threadbare\n" -"PO-Revision-Date: 2026-04-08 21:25-0300\n" +"PO-Revision-Date: 2026-09-04 12:31-0300\n" "Last-Translator: Manuel Quiñones \n" "Language-Team: Spanish\n" "Language: es\n" @@ -77,7 +77,7 @@ msgstr "Efectos sonoros" #: scenes/menus/options/components/video_settings.tscn msgid "Show Controls" -msgstr "" +msgstr "Mostrar controles" #: scenes/menus/options/components/video_settings.tscn msgid "Fullscreen" @@ -93,14 +93,17 @@ msgstr "Misiones completadas" msgid "Player Abilities" msgstr "Habilidades del jugador" +#: scenes/menus/debug/debug_settings.tscn +msgid "Open Current Scene In Editor" +msgstr "Abrir escena actual en el editor" + #: scenes/globals/pause/pause_overlay.tscn msgid "Inventory" -msgstr "" +msgstr "Inventario" #: scenes/globals/pause/pause_overlay.tscn -#, fuzzy msgid "Menu" -msgstr "PauseMenu" +msgstr "Menú" #: scenes/globals/pause/pause_overlay.tscn msgid "Abandon Quest" @@ -108,7 +111,7 @@ msgstr "Abandonar misión" #: scenes/globals/pause/pause_overlay.tscn msgid "Skip Tutorial" -msgstr "" +msgstr "Saltar el tutorial" #: scenes/globals/pause/pause_overlay.tscn msgid "Report a Problem" @@ -124,13 +127,14 @@ msgstr "Resumir" #: scenes/globals/pause/pause_overlay.tscn msgid "Previous" -msgstr "" +msgstr "Anterior" #: scenes/globals/pause/pause_overlay.tscn msgid "Next" -msgstr "" +msgstr "Siguiente" #: scenes/menus/title/components/main_menu.gd:23 +#: scenes/menus/quest_separator/quest_separator.tscn msgid "Restart" msgstr "Reiniciar" @@ -172,13 +176,7 @@ msgstr "Deshacer" #: scenes/menus/quest_separator/quest_separator.tscn msgid "Play" -msgstr "" +msgstr "Jugar" msgid "Threadbare" msgstr "Threadbare" - -#~ msgid "Game Paused" -#~ msgstr "Juego en pausa" - -#~ msgid "DebugSettings" -#~ msgstr "DebugSettings" From 3f34e8dd82e25cdb6771eb1a2b3940fd29460695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 4 Sep 2026 12:33:34 -0300 Subject: [PATCH 03/11] Locale: Add Dev Archipelago Basics scenes to template Add all `.tscn` files from Basics. Regenerate the template POT file. --- locale/threadbare.pot | 121 ++++++++++++++++++++++++++++++++++++++++++ project.godot | 2 +- 2 files changed, 122 insertions(+), 1 deletion(-) diff --git a/locale/threadbare.pot b/locale/threadbare.pot index f9fab301b2..d861d2e1ae 100644 --- a/locale/threadbare.pot +++ b/locale/threadbare.pot @@ -19,6 +19,9 @@ # res://scenes/menus/quest_separator/quest_separator.tscn # res://scenes/menus/debug/components/debug_completed_quests.tscn # res://scenes/menus/debug/components/debug_player_abilities.tscn +# res://scenes/dev/basics/teleporter/teleporter_test_1.tscn +# res://scenes/dev/basics/teleporter/teleporter_test_2.tscn +# res://scenes/dev/basics/visuals/visuals_test.tscn # # FIRST AUTHOR , YEAR. # @@ -194,5 +197,123 @@ msgstr "" msgid "Play" msgstr "" +#: scenes/dev/basics/teleporter/teleporter_test_1.tscn +msgid "Continue walking to teleport to another scene!" +msgstr "" + +#: scenes/dev/basics/teleporter/teleporter_test_1.tscn +msgid "" +"Teleporting while walking east uses a\n" +"\"Right to Left Wipe\" transition.\n" +"When you return, notice how the transition changes\n" +"to reflect the direction you walk!" +msgstr "" + +#: scenes/dev/basics/teleporter/teleporter_test_2.tscn +msgid "" +"Teleportation can also exist between\n" +"two points in the same scene!" +msgstr "" + +#: scenes/dev/basics/teleporter/teleporter_test_2.tscn +msgid "" +"We only give a teleporter a transition if\n" +" the spawn point is not visible when using it." +msgstr "" + +#: scenes/dev/basics/teleporter/teleporter_test_2.tscn +msgid "" +"Each teleporter can reference a SpawnPoint\n" +"as a target to move the Player to.\n" +"Add a spawn_point.tscn to your scene and then select it\n" +"from the teleporter's \"Spawn Point Path\" dropdown in the inspector." +msgstr "" + +#: scenes/dev/basics/teleporter/teleporter_test_2.tscn +msgid "" +"You can walk back the way you came\n" +"to return to the first scene!" +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"In the world of Threadbare, we want a consistent perspective\n" +" where sprites are layered in a logical order." +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"For example, if you walk behind this house,\n" +"it should appear in front of you!" +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"For nodes that appear \"on the ground\",\n" +"we like to group them under a Node2D\n" +"with Y Sort Enabled." +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"Otherwise you get weird visuals!\n" +"(Try walking right behind this house)" +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"We can also create the illusion of elevated cliffs\n" +"with the elevation_2.tres and shadow.tres tilesets." +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "Don't be afraid to add more TileMapLayers!" +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"Be careful with the perspective of elevation.\n" +"The foam should not be visible off the back." +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"This back tile should have an alternate water tile\n" +"(no collision) to round out the corner!" +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"The alternative tiles make it possible to\n" +"walk above water and stone when using bridges." +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"Head this way to see an\n" +"interactive Y-Sort example." +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"Use the foam_2.tres tileset whenever\n" +"water contacts land." +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "Enable Y-Sorting" +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "Disable Y-Sorting" +msgstr "" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"Shadows under bridges should reflect elevation.\n" +"Make sure that the start and end points\n" +"are consistent." +msgstr "" + msgid "Threadbare" msgstr "" diff --git a/project.godot b/project.godot index 5396f7172b..0841574cdc 100644 --- a/project.godot +++ b/project.godot @@ -304,7 +304,7 @@ next_tab={ [internationalization] locale/translations=PackedStringArray("res://locale/es.po", "res://locale/fr.po") -locale/translations_pot_files=PackedStringArray("res://scenes/menus/title/components/main_menu.tscn", "res://scenes/menus/options/options.tscn", "res://scenes/menus/options/components/sound_settings.tscn", "res://scenes/menus/options/components/video_settings.tscn", "res://scenes/menus/options/components/language_settings.tscn", "res://scenes/menus/debug/debug_settings.tscn", "res://scenes/globals/pause/pause_overlay.tscn", "res://scenes/menus/title/components/main_menu.gd", "res://scenes/ui_elements/input_hints/aim_input_hint.tscn", "res://scenes/ui_elements/input_hints/interact_input_hint.tscn", "res://scenes/ui_elements/input_hints/movement_input_hint.tscn", "res://scenes/ui_elements/input_hints/repel_input_hint.tscn", "res://scenes/ui_elements/input_hints/reset_input_hint.tscn", "res://scenes/ui_elements/input_hints/run_input_hint.tscn", "res://scenes/ui_elements/input_hints/skip_input_hint.tscn", "res://scenes/ui_elements/input_hints/throw_input_hint.tscn", "res://scenes/ui_elements/input_hints/undo_input_hint.tscn", "res://scenes/menus/quest_separator/quest_separator.tscn", "res://scenes/menus/debug/components/debug_completed_quests.tscn", "res://scenes/menus/debug/components/debug_player_abilities.tscn") +locale/translations_pot_files=PackedStringArray("res://scenes/menus/title/components/main_menu.tscn", "res://scenes/menus/options/options.tscn", "res://scenes/menus/options/components/sound_settings.tscn", "res://scenes/menus/options/components/video_settings.tscn", "res://scenes/menus/options/components/language_settings.tscn", "res://scenes/menus/debug/debug_settings.tscn", "res://scenes/globals/pause/pause_overlay.tscn", "res://scenes/menus/title/components/main_menu.gd", "res://scenes/ui_elements/input_hints/aim_input_hint.tscn", "res://scenes/ui_elements/input_hints/interact_input_hint.tscn", "res://scenes/ui_elements/input_hints/movement_input_hint.tscn", "res://scenes/ui_elements/input_hints/repel_input_hint.tscn", "res://scenes/ui_elements/input_hints/reset_input_hint.tscn", "res://scenes/ui_elements/input_hints/run_input_hint.tscn", "res://scenes/ui_elements/input_hints/skip_input_hint.tscn", "res://scenes/ui_elements/input_hints/throw_input_hint.tscn", "res://scenes/ui_elements/input_hints/undo_input_hint.tscn", "res://scenes/menus/quest_separator/quest_separator.tscn", "res://scenes/menus/debug/components/debug_completed_quests.tscn", "res://scenes/menus/debug/components/debug_player_abilities.tscn", "res://scenes/dev/basics/teleporter/teleporter_test_1.tscn", "res://scenes/dev/basics/teleporter/teleporter_test_2.tscn", "res://scenes/dev/basics/visuals/visuals_test.tscn") [layer_names] From 751d5c9c2ebaf0a28aea2532173d6b40fddbb203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 4 Sep 2026 14:05:46 -0300 Subject: [PATCH 04/11] Update Spanish translation This translates the signposts of the "Basics" Dev Island. --- locale/es.po | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 157 insertions(+), 1 deletion(-) diff --git a/locale/es.po b/locale/es.po index 3e7b7b4133..9b614074c7 100644 --- a/locale/es.po +++ b/locale/es.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Threadbare\n" -"PO-Revision-Date: 2026-09-04 12:31-0300\n" +"PO-Revision-Date: 2026-09-04 14:00-0300\n" "Last-Translator: Manuel Quiñones \n" "Language-Team: Spanish\n" "Language: es\n" @@ -178,5 +178,161 @@ msgstr "Deshacer" msgid "Play" msgstr "Jugar" +#: scenes/dev/basics/teleporter/teleporter_test_1.tscn +msgid "Continue walking to teleport to another scene!" +msgstr "¡Sigue caminando para teletransportarte a otra escena!" + +#: scenes/dev/basics/teleporter/teleporter_test_1.tscn +msgid "" +"Teleporting while walking east uses a\n" +"\"Right to Left Wipe\" transition.\n" +"When you return, notice how the transition changes\n" +"to reflect the direction you walk!" +msgstr "" +"Al teletransportarte caminando hacia el este se usa\n" +"una transición \"Right to Left Wipe\".\n" +"Cuando regreses, ¡fíjate cómo cambia la transición\n" +"para reflejar la dirección en la que caminas!" + +#: scenes/dev/basics/teleporter/teleporter_test_2.tscn +msgid "" +"Teleportation can also exist between\n" +"two points in the same scene!" +msgstr "" +"¡La teletransportación también puede existir entre\n" +"dos puntos de la misma escena!" + +#: scenes/dev/basics/teleporter/teleporter_test_2.tscn +msgid "" +"We only give a teleporter a transition if\n" +" the spawn point is not visible when using it." +msgstr "" +"Solo le damos una transición a un teletransportador si\n" +"el spawn point no está visible al usarlo." + +#: scenes/dev/basics/teleporter/teleporter_test_2.tscn +msgid "" +"Each teleporter can reference a SpawnPoint\n" +"as a target to move the Player to.\n" +"Add a spawn_point.tscn to your scene and then select it\n" +"from the teleporter's \"Spawn Point Path\" dropdown in the inspector." +msgstr "" +"Cada teletransportador puede referenciar un SpawnPoint\n" +"como destino para mover al Player.\n" +"Agrega un spawn_point.tscn a tu escena y luego selecciónalo\n" +"en la lista \"Spawn Point Path\" del teletransportador, en el inspector." + +#: scenes/dev/basics/teleporter/teleporter_test_2.tscn +msgid "" +"You can walk back the way you came\n" +"to return to the first scene!" +msgstr "" +"¡Puedes volver por donde viniste\n" +"para regresar a la primera escena!" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"In the world of Threadbare, we want a consistent perspective\n" +" where sprites are layered in a logical order." +msgstr "" +"En el mundo de Threadbare queremos una perspectiva consistente,\n" +"donde los sprites se superpongan en un orden lógico." + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"For example, if you walk behind this house,\n" +"it should appear in front of you!" +msgstr "" +"Por ejemplo, si caminas detrás de esta casa,\n" +"¡debería verse por delante de ti!\n" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"For nodes that appear \"on the ground\",\n" +"we like to group them under a Node2D\n" +"with Y Sort Enabled." +msgstr "" +"Para los nodos que aparecen \"en el suelo\",\n" +"nos gusta agruparlos bajo un Node2D\n" +"con Y Sort Enabled." + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"Otherwise you get weird visuals!\n" +"(Try walking right behind this house)" +msgstr "" +"Si no, ¡se ve todo raro!\n" +"(Prueba caminar justo detrás de esta casa)\n" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"We can also create the illusion of elevated cliffs\n" +"with the elevation_2.tres and shadow.tres tilesets." +msgstr "" +"También podemos crear la ilusión de acantilados elevados\n" +"con los tilesets elevation_2.tres y shadow.tres." + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "Don't be afraid to add more TileMapLayers!" +msgstr "¡No tengas miedo de agregar más TileMapLayers!" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"Be careful with the perspective of elevation.\n" +"The foam should not be visible off the back." +msgstr "" +"Ten cuidado con la perspectiva de la elevación.\n" +"La espuma no debería verse por detrás." + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"This back tile should have an alternate water tile\n" +"(no collision) to round out the corner!" +msgstr "" +"¡Este tile de atrás debería tener un tile de agua alternativo\n" +"(sin colisión) para redondear la esquina!" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"The alternative tiles make it possible to\n" +"walk above water and stone when using bridges." +msgstr "" +"Los tiles alternativos hacen posible\n" +"caminar por encima del agua y la piedra al usar puentes." + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"Head this way to see an\n" +"interactive Y-Sort example." +msgstr "" +"Ve por aquí para ver un\n" +"ejemplo interactivo de Y-Sort." + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"Use the foam_2.tres tileset whenever\n" +"water contacts land." +msgstr "" +"Usa el tileset foam_2.tres siempre que\n" +"el agua toque la tierra." + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "Enable Y-Sorting" +msgstr "Activar Y-Sorting" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "Disable Y-Sorting" +msgstr "Desactivar Y-Sorting" + +#: scenes/dev/basics/visuals/visuals_test.tscn +msgid "" +"Shadows under bridges should reflect elevation.\n" +"Make sure that the start and end points\n" +"are consistent." +msgstr "" +"Las sombras bajo los puentes deben reflejar la elevación.\n" +"Asegúrate de que los puntos de inicio y de fin\n" +"sean consistentes." + msgid "Threadbare" msgstr "Threadbare" From 78b760b86b72dc2fd94ceee535a4798b9c994dd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 4 Sep 2026 14:45:45 -0300 Subject: [PATCH 05/11] Locale: Add Basics Elder dialogue to template Add this single `.dialogue` file to the list of translatable files. Regenerate the template POT file. --- locale/threadbare.pot | 61 +++++++++++++++++++++++++++++++++++++++++++ project.godot | 2 +- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/locale/threadbare.pot b/locale/threadbare.pot index d861d2e1ae..8d57bc8f64 100644 --- a/locale/threadbare.pot +++ b/locale/threadbare.pot @@ -22,6 +22,7 @@ # res://scenes/dev/basics/teleporter/teleporter_test_1.tscn # res://scenes/dev/basics/teleporter/teleporter_test_2.tscn # res://scenes/dev/basics/visuals/visuals_test.tscn +# res://scenes/dev/components/dev_archipelago_basics_elder.dialogue # # FIRST AUTHOR , YEAR. # @@ -315,5 +316,65 @@ msgid "" "are consistent." msgstr "" +#. TRANSLATORS: Character name +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue +msgctxt "dialogue" +msgid "Basics Elder" +msgstr "" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:3 +msgctxt "dialogue" +msgid "[[Hi|Hello|Greetings]], StoryWeaver. Welcome to Dev Archipelago!" +msgstr "" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:4 +msgctxt "dialogue" +msgid "This is a place of creativity, play, and experimentation!" +msgstr "" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:5 +msgctxt "dialogue" +msgid "While I can't explain all of what happens here, I invite you to learn about the basics of our unraveling world!" +msgstr "" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:9 +msgctxt "dialogue" +msgid "Feel free to explore these islands, however these quests might be a helpful way to start!" +msgstr "" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:10 +msgctxt "dialogue" +msgid "Explore and have fun! I hope to see you again if you need to relearn the basics." +msgstr "" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:11 +msgctxt "dialogue" +msgid "The people of Threadbare are counting on you. Your understanding of our world is necessary for its survival!" +msgstr "" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:13 +msgctxt "dialogue" +msgid "Excellent choice, your training will surely help with your world-saving efforts." +msgstr "" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:14 +msgctxt "dialogue" +msgid "Ah, those! Capable of such ingenuity. To do what? I can't quite remember..." +msgstr "" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:15 +msgctxt "dialogue" +msgid "I'm confident you will know how to use this on your journey." +msgstr "" + msgid "Threadbare" msgstr "" diff --git a/project.godot b/project.godot index 0841574cdc..a253c83e39 100644 --- a/project.godot +++ b/project.godot @@ -304,7 +304,7 @@ next_tab={ [internationalization] locale/translations=PackedStringArray("res://locale/es.po", "res://locale/fr.po") -locale/translations_pot_files=PackedStringArray("res://scenes/menus/title/components/main_menu.tscn", "res://scenes/menus/options/options.tscn", "res://scenes/menus/options/components/sound_settings.tscn", "res://scenes/menus/options/components/video_settings.tscn", "res://scenes/menus/options/components/language_settings.tscn", "res://scenes/menus/debug/debug_settings.tscn", "res://scenes/globals/pause/pause_overlay.tscn", "res://scenes/menus/title/components/main_menu.gd", "res://scenes/ui_elements/input_hints/aim_input_hint.tscn", "res://scenes/ui_elements/input_hints/interact_input_hint.tscn", "res://scenes/ui_elements/input_hints/movement_input_hint.tscn", "res://scenes/ui_elements/input_hints/repel_input_hint.tscn", "res://scenes/ui_elements/input_hints/reset_input_hint.tscn", "res://scenes/ui_elements/input_hints/run_input_hint.tscn", "res://scenes/ui_elements/input_hints/skip_input_hint.tscn", "res://scenes/ui_elements/input_hints/throw_input_hint.tscn", "res://scenes/ui_elements/input_hints/undo_input_hint.tscn", "res://scenes/menus/quest_separator/quest_separator.tscn", "res://scenes/menus/debug/components/debug_completed_quests.tscn", "res://scenes/menus/debug/components/debug_player_abilities.tscn", "res://scenes/dev/basics/teleporter/teleporter_test_1.tscn", "res://scenes/dev/basics/teleporter/teleporter_test_2.tscn", "res://scenes/dev/basics/visuals/visuals_test.tscn") +locale/translations_pot_files=PackedStringArray("res://scenes/menus/title/components/main_menu.tscn", "res://scenes/menus/options/options.tscn", "res://scenes/menus/options/components/sound_settings.tscn", "res://scenes/menus/options/components/video_settings.tscn", "res://scenes/menus/options/components/language_settings.tscn", "res://scenes/menus/debug/debug_settings.tscn", "res://scenes/globals/pause/pause_overlay.tscn", "res://scenes/menus/title/components/main_menu.gd", "res://scenes/ui_elements/input_hints/aim_input_hint.tscn", "res://scenes/ui_elements/input_hints/interact_input_hint.tscn", "res://scenes/ui_elements/input_hints/movement_input_hint.tscn", "res://scenes/ui_elements/input_hints/repel_input_hint.tscn", "res://scenes/ui_elements/input_hints/reset_input_hint.tscn", "res://scenes/ui_elements/input_hints/run_input_hint.tscn", "res://scenes/ui_elements/input_hints/skip_input_hint.tscn", "res://scenes/ui_elements/input_hints/throw_input_hint.tscn", "res://scenes/ui_elements/input_hints/undo_input_hint.tscn", "res://scenes/menus/quest_separator/quest_separator.tscn", "res://scenes/menus/debug/components/debug_completed_quests.tscn", "res://scenes/menus/debug/components/debug_player_abilities.tscn", "res://scenes/dev/basics/teleporter/teleporter_test_1.tscn", "res://scenes/dev/basics/teleporter/teleporter_test_2.tscn", "res://scenes/dev/basics/visuals/visuals_test.tscn", "res://scenes/dev/components/dev_archipelago_basics_elder.dialogue") [layer_names] From c0b20dbbcdafa11c586fa93be405524fd1b2d1d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 4 Sep 2026 15:11:31 -0300 Subject: [PATCH 06/11] Update Spanish Translation This translates the dialogue of the Basics Elder at Dev Archipelago. --- locale/es.po | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/locale/es.po b/locale/es.po index 9b614074c7..fa0767611a 100644 --- a/locale/es.po +++ b/locale/es.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Threadbare\n" -"PO-Revision-Date: 2026-09-04 14:00-0300\n" +"PO-Revision-Date: 2026-09-04 15:17-0300\n" "Last-Translator: Manuel Quiñones \n" "Language-Team: Spanish\n" "Language: es\n" @@ -334,5 +334,88 @@ msgstr "" "Asegúrate de que los puntos de inicio y de fin\n" "sean consistentes." +#. TRANSLATORS: Character name +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue +msgctxt "dialogue" +msgid "Basics Elder" +msgstr "Anciano ConceptosBásicos" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:3 +msgctxt "dialogue" +msgid "[[Hi|Hello|Greetings]], StoryWeaver. Welcome to Dev Archipelago!" +msgstr "" +"[[Hola|Buenas|Saludos]], StoryWeaver. Te doy la bienvenida al Archipiélago " +"Dev!" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:4 +msgctxt "dialogue" +msgid "This is a place of creativity, play, and experimentation!" +msgstr "¡Este es un lugar de creatividad, juego y experimentación!" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:5 +msgctxt "dialogue" +msgid "" +"While I can't explain all of what happens here, I invite you to learn about " +"the basics of our unraveling world!" +msgstr "" +"Aunque no puedo explicar todo lo que sucede aquí, ¡te invito a conocer las " +"cosas básicas de nuestro descosido mundo!" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:9 +msgctxt "dialogue" +msgid "" +"Feel free to explore these islands, however these quests might be a helpful " +"way to start!" +msgstr "" +"Siéntete libre de explorar estas islas, ¡estas misiones podrían ser una " +"buena manera de empezar!" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:10 +msgctxt "dialogue" +msgid "" +"Explore and have fun! I hope to see you again if you need to relearn the " +"basics." +msgstr "" +"¡Explora y diviértete! Espero verte de nuevo si necesitas repasar los " +"conceptos básicos." + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:11 +msgctxt "dialogue" +msgid "" +"The people of Threadbare are counting on you. Your understanding of our " +"world is necessary for its survival!" +msgstr "" +"Los habitantes de Threadbare cuentan contigo. ¡Tu comprensión de nuestro " +"mundo es fundamental para su supervivencia!" + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:13 +msgctxt "dialogue" +msgid "" +"Excellent choice, your training will surely help with your world-saving " +"efforts." +msgstr "" +"Excelente elección, el entrenamiento sin duda te ayudará en tus esfuerzos de " +"salvar el mundo." + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:14 +msgctxt "dialogue" +msgid "" +"Ah, those! Capable of such ingenuity. To do what? I can't quite remember..." +msgstr "¡Ah, esos! Tan ingeniosos. ¿Para qué servían? No lo recuerdo bien..." + +#. TRANSLATORS: Character: Basics Elder +#: scenes/dev/components/dev_archipelago_basics_elder.dialogue:15 +msgctxt "dialogue" +msgid "I'm confident you will know how to use this on your journey." +msgstr "Estoy seguro de que sabrás cómo usar esto en tu viaje." + msgid "Threadbare" msgstr "Threadbare" From 7ee7a977fbdf7ad1f01af602646d2ec4254a1ef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 4 Sep 2026 15:57:27 -0300 Subject: [PATCH 07/11] ThreadbareEditor addon: Add translation parser for quests So the .tres file is recognized by the translation system, and title and description of Quests can be extracted to the catalog. --- addons/threadbare_editor/plugin.cfg | 2 +- addons/threadbare_editor/plugin.gd | 11 +++++++ .../quest_translation_parser.gd | 32 +++++++++++++++++++ .../quest_translation_parser.gd.uid | 1 + 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 addons/threadbare_editor/quest_translation_parser.gd create mode 100644 addons/threadbare_editor/quest_translation_parser.gd.uid diff --git a/addons/threadbare_editor/plugin.cfg b/addons/threadbare_editor/plugin.cfg index 95406fcd76..c19c991144 100644 --- a/addons/threadbare_editor/plugin.cfg +++ b/addons/threadbare_editor/plugin.cfg @@ -1,7 +1,7 @@ [plugin] name="ThreadbareEditor" -description="Adds an editor debugger." +description="Threadbare editor integrations: a debugger and a translation parser." author="The Threadbare Authors" version="" script="plugin.gd" diff --git a/addons/threadbare_editor/plugin.gd b/addons/threadbare_editor/plugin.gd index 3bc2ebff6d..b56e484539 100644 --- a/addons/threadbare_editor/plugin.gd +++ b/addons/threadbare_editor/plugin.gd @@ -5,16 +5,27 @@ class_name ThreadbareEditorPlugin extends EditorPlugin const ThreadbareDebugger := preload("res://addons/threadbare_editor/threadbare_debugger.gd") +const QuestTranslationParser := preload( + "res://addons/threadbare_editor/quest_translation_parser.gd" +) var threadbare_debugger: EditorDebuggerPlugin +var quest_translation_parser: EditorTranslationParserPlugin func _enter_tree() -> void: threadbare_debugger = ThreadbareDebugger.new() add_debugger_plugin(threadbare_debugger) + quest_translation_parser = QuestTranslationParser.new() + add_translation_parser_plugin(quest_translation_parser) + func _exit_tree() -> void: if threadbare_debugger: remove_debugger_plugin(threadbare_debugger) threadbare_debugger = null + + if quest_translation_parser: + remove_translation_parser_plugin(quest_translation_parser) + quest_translation_parser = null diff --git a/addons/threadbare_editor/quest_translation_parser.gd b/addons/threadbare_editor/quest_translation_parser.gd new file mode 100644 index 0000000000..557d15d605 --- /dev/null +++ b/addons/threadbare_editor/quest_translation_parser.gd @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: The Threadbare Authors +# SPDX-License-Identifier: MPL-2.0 +@tool +extends EditorTranslationParserPlugin +## Extracts the translatable strings of a [Quest] resource. +## +## A [Quest] is a custom resource, so by default is not recognized by the translation system. +## This parser makes it possible, so adding a quest.tres to the list of translatable +## files puts its title and description in the catalog. + +const TITLE_COMMENT := "Quest title" +const DESCRIPTION_COMMENT := "Quest description" + + +func _get_recognized_extensions() -> PackedStringArray: + return ["tres"] + + +func _parse_file(path: String) -> Array[PackedStringArray]: + var messages: Array[PackedStringArray] = [] + + # Skip .tres files that aren't Quests. + var quest := ResourceLoader.load(path, "", ResourceLoader.CACHE_MODE_IGNORE) as Quest + if not quest: + return messages + + if quest.title: + messages.append(PackedStringArray([quest.title, "", "", TITLE_COMMENT])) + if quest.description: + messages.append(PackedStringArray([quest.description, "", "", DESCRIPTION_COMMENT])) + + return messages diff --git a/addons/threadbare_editor/quest_translation_parser.gd.uid b/addons/threadbare_editor/quest_translation_parser.gd.uid new file mode 100644 index 0000000000..fd0b779216 --- /dev/null +++ b/addons/threadbare_editor/quest_translation_parser.gd.uid @@ -0,0 +1 @@ +uid://v8n7t54c7iqy From 1c3121837645a5c19acfd9fd3ce0491db7008363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 4 Sep 2026 15:58:55 -0300 Subject: [PATCH 08/11] Locale: Add title and description of Dev Basics quests By adding their quest.tres files to the list of translatable files. And regenerating the POT file. --- locale/threadbare.pot | 22 ++++++++++++++++++++++ project.godot | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/locale/threadbare.pot b/locale/threadbare.pot index 8d57bc8f64..82a60785cf 100644 --- a/locale/threadbare.pot +++ b/locale/threadbare.pot @@ -23,6 +23,8 @@ # res://scenes/dev/basics/teleporter/teleporter_test_2.tscn # res://scenes/dev/basics/visuals/visuals_test.tscn # res://scenes/dev/components/dev_archipelago_basics_elder.dialogue +# res://scenes/dev/basics/teleporter/quest.tres +# res://scenes/dev/basics/visuals/quest.tres # # FIRST AUTHOR , YEAR. # @@ -376,5 +378,25 @@ msgctxt "dialogue" msgid "I'm confident you will know how to use this on your journey." msgstr "" +#. TRANSLATORS: Quest title +#: scenes/dev/basics/teleporter/quest.tres +msgid "Teleporters" +msgstr "" + +#. TRANSLATORS: Quest description +#: scenes/dev/basics/teleporter/quest.tres +msgid "Learn how to use teleporters to go from scene to scene or between two points in the same scene." +msgstr "" + +#. TRANSLATORS: Quest title +#: scenes/dev/basics/visuals/quest.tres +msgid "Visuals" +msgstr "" + +#. TRANSLATORS: Quest description +#: scenes/dev/basics/visuals/quest.tres +msgid "Learn how to order TileMapLayers, create fake perspective, and maintain logical y-sorting of sprites in your quests." +msgstr "" + msgid "Threadbare" msgstr "" diff --git a/project.godot b/project.godot index a253c83e39..7d5874e4a0 100644 --- a/project.godot +++ b/project.godot @@ -304,7 +304,7 @@ next_tab={ [internationalization] locale/translations=PackedStringArray("res://locale/es.po", "res://locale/fr.po") -locale/translations_pot_files=PackedStringArray("res://scenes/menus/title/components/main_menu.tscn", "res://scenes/menus/options/options.tscn", "res://scenes/menus/options/components/sound_settings.tscn", "res://scenes/menus/options/components/video_settings.tscn", "res://scenes/menus/options/components/language_settings.tscn", "res://scenes/menus/debug/debug_settings.tscn", "res://scenes/globals/pause/pause_overlay.tscn", "res://scenes/menus/title/components/main_menu.gd", "res://scenes/ui_elements/input_hints/aim_input_hint.tscn", "res://scenes/ui_elements/input_hints/interact_input_hint.tscn", "res://scenes/ui_elements/input_hints/movement_input_hint.tscn", "res://scenes/ui_elements/input_hints/repel_input_hint.tscn", "res://scenes/ui_elements/input_hints/reset_input_hint.tscn", "res://scenes/ui_elements/input_hints/run_input_hint.tscn", "res://scenes/ui_elements/input_hints/skip_input_hint.tscn", "res://scenes/ui_elements/input_hints/throw_input_hint.tscn", "res://scenes/ui_elements/input_hints/undo_input_hint.tscn", "res://scenes/menus/quest_separator/quest_separator.tscn", "res://scenes/menus/debug/components/debug_completed_quests.tscn", "res://scenes/menus/debug/components/debug_player_abilities.tscn", "res://scenes/dev/basics/teleporter/teleporter_test_1.tscn", "res://scenes/dev/basics/teleporter/teleporter_test_2.tscn", "res://scenes/dev/basics/visuals/visuals_test.tscn", "res://scenes/dev/components/dev_archipelago_basics_elder.dialogue") +locale/translations_pot_files=PackedStringArray("res://scenes/menus/title/components/main_menu.tscn", "res://scenes/menus/options/options.tscn", "res://scenes/menus/options/components/sound_settings.tscn", "res://scenes/menus/options/components/video_settings.tscn", "res://scenes/menus/options/components/language_settings.tscn", "res://scenes/menus/debug/debug_settings.tscn", "res://scenes/globals/pause/pause_overlay.tscn", "res://scenes/menus/title/components/main_menu.gd", "res://scenes/ui_elements/input_hints/aim_input_hint.tscn", "res://scenes/ui_elements/input_hints/interact_input_hint.tscn", "res://scenes/ui_elements/input_hints/movement_input_hint.tscn", "res://scenes/ui_elements/input_hints/repel_input_hint.tscn", "res://scenes/ui_elements/input_hints/reset_input_hint.tscn", "res://scenes/ui_elements/input_hints/run_input_hint.tscn", "res://scenes/ui_elements/input_hints/skip_input_hint.tscn", "res://scenes/ui_elements/input_hints/throw_input_hint.tscn", "res://scenes/ui_elements/input_hints/undo_input_hint.tscn", "res://scenes/menus/quest_separator/quest_separator.tscn", "res://scenes/menus/debug/components/debug_completed_quests.tscn", "res://scenes/menus/debug/components/debug_player_abilities.tscn", "res://scenes/dev/basics/teleporter/teleporter_test_1.tscn", "res://scenes/dev/basics/teleporter/teleporter_test_2.tscn", "res://scenes/dev/basics/visuals/visuals_test.tscn", "res://scenes/dev/components/dev_archipelago_basics_elder.dialogue", "res://scenes/dev/basics/teleporter/quest.tres", "res://scenes/dev/basics/visuals/quest.tres") [layer_names] From a35dbdc2413ece8da9411502d7b0ebbc559f40f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 4 Sep 2026 16:00:23 -0300 Subject: [PATCH 09/11] Update Spanish Translation With localized title and description of Dev Basics quests. --- locale/es.po | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/locale/es.po b/locale/es.po index fa0767611a..8787ed994f 100644 --- a/locale/es.po +++ b/locale/es.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Threadbare\n" -"PO-Revision-Date: 2026-09-04 15:17-0300\n" +"PO-Revision-Date: 2026-09-04 15:44-0300\n" "Last-Translator: Manuel Quiñones \n" "Language-Team: Spanish\n" "Language: es\n" @@ -417,5 +417,33 @@ msgctxt "dialogue" msgid "I'm confident you will know how to use this on your journey." msgstr "Estoy seguro de que sabrás cómo usar esto en tu viaje." +#. TRANSLATORS: Quest title +#: scenes/dev/basics/teleporter/quest.tres +msgid "Teleporters" +msgstr "Teletransportadores" + +#. TRANSLATORS: Quest description +#: scenes/dev/basics/teleporter/quest.tres +msgid "" +"Learn how to use teleporters to go from scene to scene or between two points " +"in the same scene." +msgstr "" +"Aprende a usar teletransportadores para ir de una escena a otra o entre dos " +"puntos en la misma escena." + +#. TRANSLATORS: Quest title +#: scenes/dev/basics/visuals/quest.tres +msgid "Visuals" +msgstr "Visuales" + +#. TRANSLATORS: Quest description +#: scenes/dev/basics/visuals/quest.tres +msgid "" +"Learn how to order TileMapLayers, create fake perspective, and maintain " +"logical y-sorting of sprites in your quests." +msgstr "" +"Aprende a ordenar TileMapLayers, crear perspectivas falsas y mantener un y-" +"sorting lógico en los sprites de tus misiones." + msgid "Threadbare" msgstr "Threadbare" From 535a13f0572858f0c5501f11806bf09912e48767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Tue, 8 Sep 2026 08:51:59 -0300 Subject: [PATCH 10/11] Update addons/threadbare_editor/quest_translation_parser.gd Co-authored-by: Will Thompson --- addons/threadbare_editor/quest_translation_parser.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/threadbare_editor/quest_translation_parser.gd b/addons/threadbare_editor/quest_translation_parser.gd index 557d15d605..35b44a4ac4 100644 --- a/addons/threadbare_editor/quest_translation_parser.gd +++ b/addons/threadbare_editor/quest_translation_parser.gd @@ -13,7 +13,7 @@ const DESCRIPTION_COMMENT := "Quest description" func _get_recognized_extensions() -> PackedStringArray: - return ["tres"] + return ResourceLoader.get_recognized_extensions_for_type("Quest") func _parse_file(path: String) -> Array[PackedStringArray]: From 5a95e6b0df384b2ba5f5592ff50dfd40709edef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Tue, 8 Sep 2026 09:10:49 -0300 Subject: [PATCH 11/11] Dialogue Manager: Disable using Static IDs from settings We use gettext and according to the addon, this should be disabled. Regenerate the POT file, which removes the msgctxt "dialogue" from dialogue lines. --- locale/threadbare.pot | 9 --------- project.godot | 1 + 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/locale/threadbare.pot b/locale/threadbare.pot index 82a60785cf..5007ca6b98 100644 --- a/locale/threadbare.pot +++ b/locale/threadbare.pot @@ -326,55 +326,46 @@ msgstr "" #. TRANSLATORS: Character: Basics Elder #: scenes/dev/components/dev_archipelago_basics_elder.dialogue:3 -msgctxt "dialogue" msgid "[[Hi|Hello|Greetings]], StoryWeaver. Welcome to Dev Archipelago!" msgstr "" #. TRANSLATORS: Character: Basics Elder #: scenes/dev/components/dev_archipelago_basics_elder.dialogue:4 -msgctxt "dialogue" msgid "This is a place of creativity, play, and experimentation!" msgstr "" #. TRANSLATORS: Character: Basics Elder #: scenes/dev/components/dev_archipelago_basics_elder.dialogue:5 -msgctxt "dialogue" msgid "While I can't explain all of what happens here, I invite you to learn about the basics of our unraveling world!" msgstr "" #. TRANSLATORS: Character: Basics Elder #: scenes/dev/components/dev_archipelago_basics_elder.dialogue:9 -msgctxt "dialogue" msgid "Feel free to explore these islands, however these quests might be a helpful way to start!" msgstr "" #. TRANSLATORS: Character: Basics Elder #: scenes/dev/components/dev_archipelago_basics_elder.dialogue:10 -msgctxt "dialogue" msgid "Explore and have fun! I hope to see you again if you need to relearn the basics." msgstr "" #. TRANSLATORS: Character: Basics Elder #: scenes/dev/components/dev_archipelago_basics_elder.dialogue:11 -msgctxt "dialogue" msgid "The people of Threadbare are counting on you. Your understanding of our world is necessary for its survival!" msgstr "" #. TRANSLATORS: Character: Basics Elder #: scenes/dev/components/dev_archipelago_basics_elder.dialogue:13 -msgctxt "dialogue" msgid "Excellent choice, your training will surely help with your world-saving efforts." msgstr "" #. TRANSLATORS: Character: Basics Elder #: scenes/dev/components/dev_archipelago_basics_elder.dialogue:14 -msgctxt "dialogue" msgid "Ah, those! Capable of such ingenuity. To do what? I can't quite remember..." msgstr "" #. TRANSLATORS: Character: Basics Elder #: scenes/dev/components/dev_archipelago_basics_elder.dialogue:15 -msgctxt "dialogue" msgid "I'm confident you will know how to use this on your journey." msgstr "" diff --git a/project.godot b/project.godot index 7d5874e4a0..2b421007dd 100644 --- a/project.godot +++ b/project.godot @@ -56,6 +56,7 @@ editor/new_file_template="# SPDX-FileCopyrightText: The Threadbare Authors => END " runtime/balloon_path="uid://dhydhpp43urah" +editor/translations/use_static_ids_as_translation_keys=false [display]