\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.9.0\n"
+
+#: src/racetime_client.py:22 src/rtgg_obs.py:24
+msgid ""
+"You've loaded the incorrect script.
Please remove this fileand "
+"add 'racetime_obs.py' instead
"
+msgstr ""
+" Sie haben das falsche Skript geladen.
Bitte entfernen Sie "
+"diese Datei und fügen Sie stattdessen 'racetime_obs.py' hinzu p>"
+
+#: src/racetime_obs.py:29
+msgid ""
+"Select a text source to use as your timer and enter your full username on"
+" racetime.gg (including discriminator). This only needs to be done once."
+" Then select the race room each race you join and stop worrying about "
+"whether you started your timer or not."
+msgstr ""
+"Wählen Sie eine Textquelle als Timer und geben Sie Ihren vollständigen "
+"Benutzernamen unter racetime.gg (einschließlich Diskriminator). Dies muss "
+"nur einmal durchgeführt werden. Wählen Sie dann bei jedem Rennen, an dem "
+"Sie teilnehmen, den Rennraum aus und machen Sie sich keine Sorgen mehr. ob "
+"Sie Ihren Timer gestartet haben oder nicht."
+
+#: src/racetime_obs.py:85
+msgid "Race info"
+msgstr "Renninfo"
+
+#: src/racetime_obs.py:107
+msgid "Refresh"
+msgstr "Aktualisierung"
+
+#: src/racetime_obs.py:161
+msgid "Race not found"
+msgstr "Rennen nicht gefunden"
+
+#: src/scripting/__init__.py:33
+msgid "All"
+msgstr "Alle"
+
+#: src/scripting/__init__.py:35
+msgid "Keiner"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:15
+msgid "Display coop information?"
+msgstr "Koop-Informationen anzeigen?"
+
+#: src/scripting/coop_scripting.py:19
+msgid "Co-op Mode"
+msgstr "Koop-Modus"
+
+#: src/scripting/coop_scripting.py:24
+msgid "Co-op Partner"
+msgstr "Koop-Partner"
+
+#: src/scripting/coop_scripting.py:28
+msgid "Co-op Rival 1"
+msgstr "Koop-Rivale 1"
+
+#: src/scripting/coop_scripting.py:32
+msgid "Co-op Rival 2"
+msgstr "Koop-Rivale 2"
+
+#: src/scripting/coop_scripting.py:37
+msgid "Our Team's Timer"
+msgstr "Der Timer unseres Teams"
+
+#: src/scripting/coop_scripting.py:41
+msgid "This text source will display your team's timer when you finish."
+msgstr "Diese Textquelle zeigt den Timer Ihres Teams an, wenn Sie fertig sind."
+
+#: src/scripting/coop_scripting.py:48
+msgid ""
+"This text source will be use to display your rival's timer when they "
+"finish"
+msgstr ""
+"Diese Textquelle wird verwendet, um den Timer Ihres Rivalen anzuzeigen, "
+"wenn er fertig ist"
+
+#: src/scripting/coop_scripting.py:53
+msgid "Winner Color:"
+msgstr "Gewinner Farbe:"
+
+#: src/scripting/coop_scripting.py:55
+msgid "Loser Color:"
+msgstr "Verlierer Farbe:"
+
+#: src/scripting/coop_scripting.py:57
+msgid "Winner Undetermined Color"
+msgstr "Gewinner Unbestimmte Farbe"
+
+#: src/scripting/media_player_scripting.py:37
+msgid "Enable sounds?"
+msgstr "Töne anschalten?"
+
+#: src/scripting/media_player_scripting.py:42
+msgid "Media Player Mode"
+msgstr "Media Player-Modus"
+
+#: src/scripting/media_player_scripting.py:50
+#: src/scripting/media_trigger_scripting.py:37
+msgid "Monitoring Type"
+msgstr "Überwachungstyp"
+
+#: src/scripting/media_player_scripting.py:53
+msgid "Listen Only"
+msgstr "Nur zuhören"
+
+#: src/scripting/media_player_scripting.py:57
+msgid "Stream Only"
+msgstr "Nur Stream"
+
+#: src/scripting/media_player_scripting.py:59
+#: src/scripting/media_trigger_scripting.py:44
+msgid "Listen and Stream"
+msgstr "Hören und streamen"
+
+#: src/scripting/media_player_scripting.py:62
+msgid "Chat Pings"
+msgstr "Chat-Pings"
+
+#: src/scripting/media_player_scripting.py:64
+msgid ""
+"Enable this and set choose a sound file to play when a bot posts or when "
+"someone @s you in racetime.gg chat"
+msgstr ""
+"Aktivieren Sie diese Option und wählen Sie eine Audiodatei aus, die "
+"abgespielt werden soll, wenn ein Bot Beiträge veröffentlicht oder wenn "
+"jemand Sie im racetime.gg-Chat @s"
+
+#: src/scripting/media_player_scripting.py:69
+msgid "Chat media file"
+msgstr "Chat-Mediendatei"
+
+#: src/scripting/media_player_scripting.py:74
+msgid "First Place Sound"
+msgstr "Erster Platz Sound"
+
+#: src/scripting/media_player_scripting.py:78
+msgid "Sound file to play when you finish first."
+msgstr "Sounddatei, die abgespielt werden soll, wenn Sie fertig sind."
+
+#: src/scripting/media_trigger_scripting.py:16
+msgid "Media Trigger #"
+msgstr "Medientrigger #"
+
+#: src/scripting/media_trigger_scripting.py:25
+msgid "Sound File"
+msgstr "Audiodatei"
+
+#: src/scripting/media_trigger_scripting.py:29
+msgid "Type of Trigger"
+msgstr "Art des Auslösers"
+
+#: src/scripting/media_trigger_scripting.py:32
+msgid "Chat"
+msgstr "Chat"
+
+#: src/scripting/media_trigger_scripting.py:33
+msgid "Finish Place"
+msgstr "Platz beenden"
+
+#: src/scripting/media_trigger_scripting.py:34
+msgid "Timer"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:40
+msgid "Only Listen"
+msgstr "Nur zuhören"
+
+#: src/scripting/media_trigger_scripting.py:42
+msgid "Only Stream"
+msgstr "Nur Stream"
+
+#: src/scripting/media_trigger_scripting.py:56
+msgid "Bot?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:58
+msgid "Highlighted?"
+msgstr "Hervorgehoben"
+
+#: src/scripting/media_trigger_scripting.py:60
+msgid "System?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:72
+msgid "Finish Place <="
+msgstr "Platz beenden <="
+
+#: src/scripting/media_trigger_scripting.py:75
+msgid "Num. Entrants >="
+msgstr "Num. Teilnehmer> ="
+
+#: src/scripting/media_trigger_scripting.py:85
+msgid "Start playing at "
+msgstr "Anfangen bei"
+
+#: src/scripting/qualifier_scripting.py:16
+msgid "Display race results as tournament qualifier?"
+msgstr "Rennergebnisse als Turnierqualifikation anzeigen?"
+
+#: src/scripting/qualifier_scripting.py:21
+msgid "Qualifier Mode"
+msgstr "Qualifizierungsmodus"
+
+#: src/scripting/qualifier_scripting.py:30
+msgid "Use Top X as par time, where X="
+msgstr "Verwenden Sie Top X als Par-Zeit, wobei X ="
+
+#: src/scripting/qualifier_scripting.py:35
+msgid "Qualifier Par Time Source"
+msgstr "Nach Zeitquelle qualifizieren"
+
+#: src/scripting/qualifier_scripting.py:43
+msgid "Qualifier Score Source"
+msgstr "Qualifier Score Source"
+
+#: src/scripting/setup_scripting.py:25
+msgid "Initial setup - Check to make changes"
+msgstr "Ersteinrichtung - Überprüfen Sie, ob Änderungen vorgenommen wurden"
+
+#: src/scripting/setup_scripting.py:29
+msgid "Text Source"
+msgstr "Textquelle"
+
+#: src/scripting/setup_scripting.py:34
+msgid "Username"
+msgstr "Nutzername"
+
+#: src/scripting/setup_scripting.py:36
+msgid "Enable logging"
+msgstr "Aktiviere das Logging"
+
+#: src/scripting/setup_scripting.py:38
+msgid "Log level"
+msgstr "Protokollstufe"
+
+#: src/scripting/setup_scripting.py:41
+msgid "Error"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:42
+msgid "Debug"
+msgstr "Debuggen"
+
+#: src/scripting/setup_scripting.py:43
+msgid "Info"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:45
+msgid ""
+"Generally, only log errors unless you are developing or are trying to "
+"find a specific problem."
+msgstr ""
+"Im Allgemeinen werden nur Fehler protokolliert, es sei denn, Sie entwickeln "
+"oder versuchen, ein bestimmtes Problem zu finden."
+
+#: src/scripting/setup_scripting.py:49
+msgid "Log to file?"
+msgstr "In Datei anmelden?"
+
+#: src/scripting/setup_scripting.py:51
+msgid "Log File"
+msgstr "Logdatei"
+
+#: src/scripting/setup_scripting.py:55
+msgid "Filter by Category"
+msgstr "Nach Kategorie filtern"
+
+#: src/scripting/setup_scripting.py:59
+msgid "Race"
+msgstr "Rennen"
+
+#: src/scripting/setup_scripting.py:69
+msgid "Race Desc"
+msgstr "Rennbeschreibung"
+
+#: src/scripting/timer_scripting.py:33
+msgid "Use custom color for podium finishes?"
+msgstr "Benutzerdefinierte Farbe für Podestplätze verwenden?"
+
+#: src/scripting/timer_scripting.py:37
+msgid "Podium Colors"
+msgstr "Podiumsfarben"
+
+#: src/scripting/timer_scripting.py:42
+msgid "Pre-race:"
+msgstr "Vor dem Rennen:"
+
+#: src/scripting/timer_scripting.py:44
+msgid "Still racing:"
+msgstr "Noch Rennen:"
+
+#: src/scripting/timer_scripting.py:45
+msgid "1st place:"
+msgstr "Platz 1:"
+
+#: src/scripting/timer_scripting.py:46
+msgid "2nd place:"
+msgstr "Platz 2:"
+
+#: src/scripting/timer_scripting.py:47
+msgid "3rd place:"
+msgstr "Platz 3:"
+
+#: src/scripting/timer_scripting.py:49
+msgid "After podium:"
+msgstr "Nach dem Podium:"
+
+#~ msgid ""
+#~ "Select a text source to use as "
+#~ "your timer and enter yourfull username"
+#~ " on racetime.gg (including discriminator). "
+#~ "This only needs to be done once."
+#~ "\n"
+#~ "\n"
+#~ "Then select the race room each "
+#~ "race you join and stop worrying "
+#~ "about whether you started your timer "
+#~ "or not."
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select a text source to use as "
+#~ "your timer and enter your full "
+#~ "username on racetime.gg (including "
+#~ "discriminator). This only needs to be"
+#~ " done once.\n"
+#~ "\n"
+#~ "Then select the race room each "
+#~ "race you join and stop worrying "
+#~ "about whether you started your timer "
+#~ "or not."
+#~ msgstr ""
+
diff --git a/src/locales/en/LC_MESSAGES/racetime-obs.po b/src/locales/en/LC_MESSAGES/racetime-obs.po
new file mode 100644
index 0000000..49c3ec0
--- /dev/null
+++ b/src/locales/en/LC_MESSAGES/racetime-obs.po
@@ -0,0 +1,340 @@
+# English translations for PROJECT.
+# Copyright (C) 2020 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# FIRST AUTHOR , 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2020-12-29 07:01-0500\n"
+"PO-Revision-Date: 2020-12-28 15:50-0500\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.9.0\n"
+
+#: src/racetime_client.py:22 src/rtgg_obs.py:24
+msgid ""
+"You've loaded the incorrect script.
Please remove this fileand "
+"add 'racetime_obs.py' instead
"
+msgstr ""
+
+#: src/racetime_obs.py:29
+msgid ""
+"Select a text source to use as your timer and enter your full username on"
+" racetime.gg (including discriminator). This only needs to be done once."
+" Then select the race room each race you join and stop worrying about "
+"whether you started your timer or not."
+msgstr ""
+
+#: src/racetime_obs.py:85
+msgid "Race info"
+msgstr ""
+
+#: src/racetime_obs.py:107
+msgid "Refresh"
+msgstr ""
+
+#: src/racetime_obs.py:161
+msgid "Race not found"
+msgstr ""
+
+#: src/scripting/__init__.py:33
+msgid "All"
+msgstr ""
+
+#: src/scripting/__init__.py:35
+msgid "None"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:15
+msgid "Display coop information?"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:19
+msgid "Co-op Mode"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:24
+msgid "Co-op Partner"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:28
+msgid "Co-op Rival 1"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:32
+msgid "Co-op Rival 2"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:37
+msgid "Our Team's Timer"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:41
+msgid "This text source will display your team's timer when you finish."
+msgstr ""
+
+#: src/scripting/coop_scripting.py:48
+msgid ""
+"This text source will be use to display your rival's timer when they "
+"finish"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:53
+msgid "Winner Color:"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:55
+msgid "Loser Color:"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:57
+msgid "Winner Undetermined Color"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:37
+msgid "Enable sounds?"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:42
+msgid "Media Player Mode"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:50
+#: src/scripting/media_trigger_scripting.py:37
+msgid "Monitoring Type"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:53
+msgid "Listen Only"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:57
+msgid "Stream Only"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:59
+#: src/scripting/media_trigger_scripting.py:44
+msgid "Listen and Stream"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:62
+msgid "Chat Pings"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:64
+msgid ""
+"Enable this and set choose a sound file to play when a bot posts or when "
+"someone @s you in racetime.gg chat"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:69
+msgid "Chat media file"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:74
+msgid "First Place Sound"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:78
+msgid "Sound file to play when you finish first."
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:16
+msgid "Media Trigger #"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:25
+msgid "Sound File"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:29
+msgid "Type of Trigger"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:32
+msgid "Chat"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:33
+msgid "Finish Place"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:34
+msgid "Timer"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:40
+msgid "Only Listen"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:42
+msgid "Only Stream"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:56
+msgid "Bot?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:58
+msgid "Highlighted?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:60
+msgid "System?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:72
+msgid "Finish Place <="
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:75
+msgid "Num. Entrants >="
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:85
+msgid "Start playing at "
+msgstr ""
+
+#: src/scripting/qualifier_scripting.py:16
+msgid "Display race results as tournament qualifier?"
+msgstr ""
+
+#: src/scripting/qualifier_scripting.py:21
+msgid "Qualifier Mode"
+msgstr ""
+
+#: src/scripting/qualifier_scripting.py:30
+msgid "Use Top X as par time, where X="
+msgstr ""
+
+#: src/scripting/qualifier_scripting.py:35
+msgid "Qualifier Par Time Source"
+msgstr ""
+
+#: src/scripting/qualifier_scripting.py:43
+msgid "Qualifier Score Source"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:25
+msgid "Initial setup - Check to make changes"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:29
+msgid "Text Source"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:34
+msgid "Username"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:36
+msgid "Enable logging"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:38
+msgid "Log level"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:41
+msgid "Error"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:42
+msgid "Debug"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:43
+msgid "Info"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:45
+msgid ""
+"Generally, only log errors unless you are developing or are trying to "
+"find a specific problem."
+msgstr ""
+
+#: src/scripting/setup_scripting.py:49
+msgid "Log to file?"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:51
+msgid "Log File"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:55
+msgid "Filter by Category"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:59
+msgid "Race"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:69
+msgid "Race Desc"
+msgstr ""
+
+#: src/scripting/timer_scripting.py:33
+msgid "Use custom color for podium finishes?"
+msgstr ""
+
+#: src/scripting/timer_scripting.py:37
+msgid "Podium Colors"
+msgstr ""
+
+#: src/scripting/timer_scripting.py:42
+msgid "Pre-race:"
+msgstr ""
+
+#: src/scripting/timer_scripting.py:44
+msgid "Still racing:"
+msgstr ""
+
+#: src/scripting/timer_scripting.py:45
+msgid "1st place:"
+msgstr ""
+
+#: src/scripting/timer_scripting.py:46
+msgid "2nd place:"
+msgstr ""
+
+#: src/scripting/timer_scripting.py:47
+msgid "3rd place:"
+msgstr ""
+
+#: src/scripting/timer_scripting.py:49
+msgid "After podium:"
+msgstr ""
+
+#~ msgid ""
+#~ "Select a text source to use as "
+#~ "your timer and enter yourfull username"
+#~ " on racetime.gg (including discriminator). "
+#~ "This only needs to be done once."
+#~ "\n"
+#~ "\n"
+#~ "Then select the race room each "
+#~ "race you join and stop worrying "
+#~ "about whether you started your timer "
+#~ "or not."
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select a text source to use as "
+#~ "your timer and enter your full "
+#~ "username on racetime.gg (including "
+#~ "discriminator). This only needs to be"
+#~ " done once.\n"
+#~ "\n"
+#~ "Then select the race room each "
+#~ "race you join and stop worrying "
+#~ "about whether you started your timer "
+#~ "or not."
+#~ msgstr ""
+
diff --git a/src/locales/es/LC_MESSAGES/racetime-obs.po b/src/locales/es/LC_MESSAGES/racetime-obs.po
new file mode 100644
index 0000000..d39b639
--- /dev/null
+++ b/src/locales/es/LC_MESSAGES/racetime-obs.po
@@ -0,0 +1,328 @@
+# Spanish translations for PROJECT.
+# Copyright (C) 2020 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# FIRST AUTHOR , 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2020-12-29 07:01-0500\n"
+"PO-Revision-Date: 2020-12-28 16:01-0500\n"
+"Last-Translator: FULL NAME \n"
+"Language: es\n"
+"Language-Team: es \n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.9.0\n"
+
+#: src/racetime_client.py:22 src/rtgg_obs.py:24
+msgid ""
+"You've loaded the incorrect script.
Please remove this fileand "
+"add 'racetime_obs.py' instead
"
+msgstr ""
+"Cargó la secuencia de comandos incorrecta.
Elimine este "
+"archivo y agregue 'racetime_obs.py' en su lugar
"
+
+#: src/racetime_obs.py:29
+#, fuzzy
+msgid ""
+"Select a text source to use as your timer and enter your full username on"
+" racetime.gg (including discriminator). This only needs to be done once."
+" Then select the race room each race you join and stop worrying about "
+"whether you started your timer or not."
+msgstr ""
+"Seleccione una fuente de texto para usar como su temporizador e ingrese "
+"su nombre de usuario completo enracetime.gg (incluido el discriminador). "
+"Esto solo debe hacerse una vez."
+"Luego, selecciona la sala de carreras en cada carrera a la que te unes y "
+"deja de preocuparteya sea que haya iniciado el temporizador o no."
+
+#: src/racetime_obs.py:85
+msgid "Race info"
+msgstr "Info de carrera"
+
+#: src/racetime_obs.py:107
+msgid "Refresh"
+msgstr "Actualizar"
+
+#: src/racetime_obs.py:161
+msgid "Race not found"
+msgstr "Carrera no encontrada"
+
+#: src/scripting/__init__.py:33
+msgid "All"
+msgstr "Todos"
+
+#: src/scripting/__init__.py:35
+msgid "None"
+msgstr "Ninguna"
+
+#: src/scripting/coop_scripting.py:15
+msgid "Display coop information?"
+msgstr "¿Mostrar información de la cooperativa?"
+
+#: src/scripting/coop_scripting.py:19
+msgid "Co-op Mode"
+msgstr "Modo cooperativo"
+
+#: src/scripting/coop_scripting.py:24
+msgid "Co-op Partner"
+msgstr "Socio cooperativo"
+
+#: src/scripting/coop_scripting.py:28
+msgid "Co-op Rival 1"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:32
+msgid "Co-op Rival 2"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:37
+msgid "Our Team's Timer"
+msgstr "Temporizador de nuestro equipo"
+
+#: src/scripting/coop_scripting.py:41
+msgid "This text source will display your team's timer when you finish."
+msgstr "Esta fuente de texto mostrará el cronómetro de tu equipo cuando termines."
+
+#: src/scripting/coop_scripting.py:48
+msgid ""
+"This text source will be use to display your rival's timer when they "
+"finish"
+msgstr ""
+"Esta fuente de texto se utilizará para mostrar el temporizador de tu "
+"rival cuando termine"
+
+#: src/scripting/coop_scripting.py:53
+msgid "Winner Color:"
+msgstr "Color del ganador"
+
+#: src/scripting/coop_scripting.py:55
+msgid "Loser Color:"
+msgstr "Color del perdedor"
+
+#: src/scripting/coop_scripting.py:57
+msgid "Winner Undetermined Color"
+msgstr "Color del ganador indeterminado"
+
+#: src/scripting/media_player_scripting.py:37
+msgid "Enable sounds?"
+msgstr "¿Activar sonidos?"
+
+#: src/scripting/media_player_scripting.py:42
+msgid "Media Player Mode"
+msgstr "Modo de reproductor multimedia"
+
+#: src/scripting/media_player_scripting.py:50
+#: src/scripting/media_trigger_scripting.py:37
+msgid "Monitoring Type"
+msgstr "Tipo de monitorización"
+
+#: src/scripting/media_player_scripting.py:53
+msgid "Listen Only"
+msgstr "Escuchar solo"
+
+#: src/scripting/media_player_scripting.py:57
+msgid "Stream Only"
+msgstr "Solo transmitir"
+
+#: src/scripting/media_player_scripting.py:59
+#: src/scripting/media_trigger_scripting.py:44
+msgid "Listen and Stream"
+msgstr "Escuchar y transmitir"
+
+#: src/scripting/media_player_scripting.py:62
+msgid "Chat Pings"
+msgstr "Pings de chat"
+
+#: src/scripting/media_player_scripting.py:64
+msgid ""
+"Enable this and set choose a sound file to play when a bot posts or when "
+"someone @s you in racetime.gg chat"
+msgstr ""
+"Habilite esto y configure elija un archivo de sonido para reproducir "
+"cuando un bot publique o cuando alguien lo @ en el chat racetime.gg"
+
+#: src/scripting/media_player_scripting.py:69
+msgid "Chat media file"
+msgstr "Archivo multimedia de chat"
+
+#: src/scripting/media_player_scripting.py:74
+msgid "First Place Sound"
+msgstr "Sonido de primer lugar"
+
+#: src/scripting/media_player_scripting.py:78
+msgid "Sound file to play when you finish first."
+msgstr "Archivo de sonido para reproducir cuando termines primero."
+
+#: src/scripting/media_trigger_scripting.py:16
+msgid "Media Trigger #"
+msgstr "Activador de medios #"
+
+#: src/scripting/media_trigger_scripting.py:25
+msgid "Sound File"
+msgstr "Archivo de sonido"
+
+#: src/scripting/media_trigger_scripting.py:29
+msgid "Type of Trigger"
+msgstr "Tipo de disparador"
+
+#: src/scripting/media_trigger_scripting.py:32
+msgid "Chat"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:33
+msgid "Finish Place"
+msgstr "Lugar de finalización"
+
+#: src/scripting/media_trigger_scripting.py:34
+msgid "Timer"
+msgstr "Temporizador"
+
+#: src/scripting/media_trigger_scripting.py:40
+msgid "Only Listen"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:42
+msgid "Only Stream"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:56
+msgid "Bot?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:58
+msgid "Highlighted?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:60
+msgid "System?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:72
+msgid "Finish Place <="
+msgstr "Lugar de finalización <="
+
+#: src/scripting/media_trigger_scripting.py:75
+msgid "Num. Entrants >="
+msgstr "Num. Participantes >="
+
+#: src/scripting/media_trigger_scripting.py:85
+msgid "Start playing at "
+msgstr "Empieza en"
+
+#: src/scripting/qualifier_scripting.py:16
+msgid "Display race results as tournament qualifier?"
+msgstr "¿Mostrar los resultados de la carrera como clasificatorio para el torneo?"
+
+#: src/scripting/qualifier_scripting.py:21
+msgid "Qualifier Mode"
+msgstr "Modo de calificación"
+
+#: src/scripting/qualifier_scripting.py:30
+msgid "Use Top X as par time, where X="
+msgstr "Utilice Top X como tiempo par, donde X ="
+
+#: src/scripting/qualifier_scripting.py:35
+msgid "Qualifier Par Time Source"
+msgstr "Calificar por fuente de tiempo"
+
+#: src/scripting/qualifier_scripting.py:43
+msgid "Qualifier Score Source"
+msgstr "Fuente de puntuación del calificador"
+
+#: src/scripting/setup_scripting.py:25
+msgid "Initial setup - Check to make changes"
+msgstr "Configuración inicial: marque para realizar cambios"
+
+#: src/scripting/setup_scripting.py:29
+msgid "Text Source"
+msgstr "Fuente de texto"
+
+#: src/scripting/setup_scripting.py:34
+msgid "Username"
+msgstr "Nombre de usuario"
+
+#: src/scripting/setup_scripting.py:36
+msgid "Enable logging"
+msgstr "Habilitar el registro"
+
+#: src/scripting/setup_scripting.py:38
+msgid "Log level"
+msgstr "Nivel de registro"
+
+#: src/scripting/setup_scripting.py:41
+msgid "Error"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:42
+msgid "Debug"
+msgstr "Depurar"
+
+#: src/scripting/setup_scripting.py:43
+msgid "Info"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:45
+msgid ""
+"Generally, only log errors unless you are developing or are trying to "
+"find a specific problem."
+msgstr ""
+"Por lo general, solo registre errores a menos que esté desarrollando o "
+"tratando de encontrar un problema específico."
+
+#: src/scripting/setup_scripting.py:49
+msgid "Log to file?"
+msgstr "¿Unido al expediente?"
+
+#: src/scripting/setup_scripting.py:51
+msgid "Log File"
+msgstr "Archivo de registro"
+
+#: src/scripting/setup_scripting.py:55
+msgid "Filter by Category"
+msgstr "Filtrar por categoría"
+
+#: src/scripting/setup_scripting.py:59
+msgid "Race"
+msgstr "Carrera"
+
+#: src/scripting/setup_scripting.py:69
+msgid "Race Desc"
+msgstr "Descripción de la carrera"
+
+#: src/scripting/timer_scripting.py:33
+msgid "Use custom color for podium finishes?"
+msgstr "¿Usar colores personalizados para los acabados del podio?"
+
+#: src/scripting/timer_scripting.py:37
+msgid "Podium Colors"
+msgstr "Colores del podio"
+
+#: src/scripting/timer_scripting.py:42
+msgid "Pre-race:"
+msgstr "Antes de la carrera:"
+
+#: src/scripting/timer_scripting.py:44
+msgid "Still racing:"
+msgstr "Todavía corriendo:"
+
+#: src/scripting/timer_scripting.py:45
+msgid "1st place:"
+msgstr "1er lugar"
+
+#: src/scripting/timer_scripting.py:46
+msgid "2nd place:"
+msgstr "2er lugar"
+
+#: src/scripting/timer_scripting.py:47
+msgid "3rd place:"
+msgstr "3er lugar"
+
+#: src/scripting/timer_scripting.py:49
+msgid "After podium:"
+msgstr "Después del podio:"
+
diff --git a/src/locales/fr/LC_MESSAGES/racetime-obs.po b/src/locales/fr/LC_MESSAGES/racetime-obs.po
new file mode 100644
index 0000000..ff7bc62
--- /dev/null
+++ b/src/locales/fr/LC_MESSAGES/racetime-obs.po
@@ -0,0 +1,355 @@
+# French translations for PROJECT.
+# Copyright (C) 2020 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# FIRST AUTHOR , 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2020-12-29 07:01-0500\n"
+"PO-Revision-Date: 2020-12-28 15:51-0500\n"
+"Last-Translator: FULL NAME \n"
+"Language: fr\n"
+"Language-Team: fr \n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.9.0\n"
+
+#: src/racetime_client.py:22 src/rtgg_obs.py:24
+msgid ""
+"You've loaded the incorrect script.
Please remove this fileand "
+"add 'racetime_obs.py' instead
"
+msgstr ""
+" Vous avez chargé le script incorrect.
Veuillez supprimer ce "
+"fichier et ajouter \"racetime_obs.py\" à la place
"
+
+#: src/racetime_obs.py:29
+msgid ""
+"Select a text source to use as your timer and enter your full username on"
+" racetime.gg (including discriminator). This only needs to be done once."
+" Then select the race room each race you join and stop worrying about "
+"whether you started your timer or not."
+msgstr ""
+"Sélectionnez une source de texte à utiliser comme minuterie et entrez votre "
+"nom d'utilisateur complet sur racetime.gg (y compris le discriminateur). "
+"Cela a seulement besoin d'être fait une fois. Ensuite, sélectionnez la "
+"salle de course à chaque course que vous rejoignez et arrêtez de vous "
+"soucier de savoir si vous avez démarré votre chronomètre ou non."
+
+#: src/racetime_obs.py:85
+msgid "Race info"
+msgstr "Infos course"
+
+#: src/racetime_obs.py:107
+msgid "Refresh"
+msgstr "Rafraîchir"
+
+#: src/racetime_obs.py:161
+msgid "Race not found"
+msgstr "Race introuvable"
+
+#: src/scripting/__init__.py:33
+msgid "All"
+msgstr "Toute"
+
+#: src/scripting/__init__.py:35
+msgid "None"
+msgstr "Aucune"
+
+#: src/scripting/coop_scripting.py:15
+msgid "Display coop information?"
+msgstr "Afficher les informations sur la coopérative"
+
+#: src/scripting/coop_scripting.py:19
+msgid "Co-op Mode"
+msgstr "Mode coopératif"
+
+#: src/scripting/coop_scripting.py:24
+msgid "Co-op Partner"
+msgstr "Partenaire coop"
+
+#: src/scripting/coop_scripting.py:28
+msgid "Co-op Rival 1"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:32
+msgid "Co-op Rival 2"
+msgstr ""
+
+#: src/scripting/coop_scripting.py:37
+msgid "Our Team's Timer"
+msgstr "Le chronomètre de notre équipe"
+
+#: src/scripting/coop_scripting.py:41
+msgid "This text source will display your team's timer when you finish."
+msgstr ""
+"Cette source de texte affichera le chronomètre de votre équipe lorsque "
+"vous aurez terminé."
+
+#: src/scripting/coop_scripting.py:48
+msgid ""
+"This text source will be use to display your rival's timer when they "
+"finish"
+msgstr ""
+"Cette source de texte sera utilisée pour afficher le chronomètre de votre "
+"rival lorsqu'il aura terminé"
+
+#: src/scripting/coop_scripting.py:53
+msgid "Winner Color:"
+msgstr "Couleur du gagnant:"
+
+#: src/scripting/coop_scripting.py:55
+msgid "Loser Color:"
+msgstr "Couleur du perdant:"
+
+#: src/scripting/coop_scripting.py:57
+msgid "Winner Undetermined Color"
+msgstr "Couleur indéterminée du gagnant"
+
+#: src/scripting/media_player_scripting.py:37
+msgid "Enable sounds?"
+msgstr "Activer les sons?"
+
+#: src/scripting/media_player_scripting.py:42
+msgid "Media Player Mode"
+msgstr "Mode lecteur multimédia"
+
+#: src/scripting/media_player_scripting.py:50
+#: src/scripting/media_trigger_scripting.py:37
+msgid "Monitoring Type"
+msgstr "Type de surveillance"
+
+#: src/scripting/media_player_scripting.py:53
+msgid "Listen Only"
+msgstr "Écoutez seulement"
+
+#: src/scripting/media_player_scripting.py:57
+msgid "Stream Only"
+msgstr "Diffuser uniquement"
+
+#: src/scripting/media_player_scripting.py:59
+#: src/scripting/media_trigger_scripting.py:44
+msgid "Listen and Stream"
+msgstr "Écoutez et diffusez"
+
+#: src/scripting/media_player_scripting.py:62
+msgid "Chat Pings"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:64
+msgid ""
+"Enable this and set choose a sound file to play when a bot posts or when "
+"someone @s you in racetime.gg chat"
+msgstr ""
+"Activez cette option et choisissez un fichier son à lire lorsqu'un bot "
+"publie ou lorsque quelqu'un vous @s dans le chat racetime.gg"
+
+#: src/scripting/media_player_scripting.py:69
+msgid "Chat media file"
+msgstr "Fichier multimédia de chat"
+
+#: src/scripting/media_player_scripting.py:74
+msgid "First Place Sound"
+msgstr "Premier son"
+
+#: src/scripting/media_player_scripting.py:78
+msgid "Sound file to play when you finish first."
+msgstr "Fichier son à lire lorsque vous avez terminé en premier."
+
+#: src/scripting/media_trigger_scripting.py:16
+msgid "Media Trigger #"
+msgstr "Déclencheur multimédia #"
+
+#: src/scripting/media_trigger_scripting.py:25
+msgid "Sound File"
+msgstr "Fichier audio"
+
+#: src/scripting/media_trigger_scripting.py:29
+msgid "Type of Trigger"
+msgstr "Type de déclencheur"
+
+#: src/scripting/media_trigger_scripting.py:32
+msgid "Chat"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:33
+msgid "Finish Place"
+msgstr "Endroit d'arrivée"
+
+#: src/scripting/media_trigger_scripting.py:34
+msgid "Timer"
+msgstr "chronomètre"
+
+#: src/scripting/media_trigger_scripting.py:40
+msgid "Only Listen"
+msgstr "Écoutez seulement"
+
+#: src/scripting/media_trigger_scripting.py:42
+msgid "Only Stream"
+msgstr "Écoutez et diffusez"
+
+#: src/scripting/media_trigger_scripting.py:56
+msgid "Bot?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:58
+msgid "Highlighted?"
+msgstr "Souligné?"
+
+#: src/scripting/media_trigger_scripting.py:60
+msgid "System?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:72
+msgid "Finish Place <="
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:75
+msgid "Num. Entrants >="
+msgstr "Nombre de participants> ="
+
+#: src/scripting/media_trigger_scripting.py:85
+msgid "Start playing at "
+msgstr "Commencer à "
+
+#: src/scripting/qualifier_scripting.py:16
+msgid "Display race results as tournament qualifier?"
+msgstr "Afficher les résultats de la course comme qualification du tournoi?"
+
+#: src/scripting/qualifier_scripting.py:21
+msgid "Qualifier Mode"
+msgstr "Mode qualificatif"
+
+#: src/scripting/qualifier_scripting.py:30
+msgid "Use Top X as par time, where X="
+msgstr "Utilisez Top X comme temps par, où X ="
+
+#: src/scripting/qualifier_scripting.py:35
+msgid "Qualifier Par Time Source"
+msgstr "Source de temps par qualificatif"
+
+#: src/scripting/qualifier_scripting.py:43
+msgid "Qualifier Score Source"
+msgstr "Source du score du qualificatif"
+
+#: src/scripting/setup_scripting.py:25
+msgid "Initial setup - Check to make changes"
+msgstr "Configuration initiale - Cochez pour apporter des modifications"
+
+#: src/scripting/setup_scripting.py:29
+msgid "Text Source"
+msgstr "Source du texte"
+
+#: src/scripting/setup_scripting.py:34
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: src/scripting/setup_scripting.py:36
+msgid "Enable logging"
+msgstr "Activer la journalisation"
+
+#: src/scripting/setup_scripting.py:38
+msgid "Log level"
+msgstr "Niveau de journal"
+
+#: src/scripting/setup_scripting.py:41
+msgid "Error"
+msgstr "Erreur"
+
+#: src/scripting/setup_scripting.py:42
+msgid "Debug"
+msgstr "Déboguer"
+
+#: src/scripting/setup_scripting.py:43
+msgid "Info"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:45
+msgid ""
+"Generally, only log errors unless you are developing or are trying to "
+"find a specific problem."
+msgstr ""
+"En règle générale, enregistrez uniquement les erreurs, sauf si vous "
+"développez ou essayez de trouver un problème spécifique."
+
+#: src/scripting/setup_scripting.py:49
+msgid "Log to file?"
+msgstr "Connectez-vous au fichier?"
+
+#: src/scripting/setup_scripting.py:51
+msgid "Log File"
+msgstr "Fichier journal"
+
+#: src/scripting/setup_scripting.py:55
+msgid "Filter by Category"
+msgstr ""
+
+#: src/scripting/setup_scripting.py:59
+msgid "Race"
+msgstr "Course"
+
+#: src/scripting/setup_scripting.py:69
+msgid "Race Desc"
+msgstr "Desc de course"
+
+#: src/scripting/timer_scripting.py:33
+msgid "Use custom color for podium finishes?"
+msgstr "Utiliser une couleur personnalisée pour les podiums?"
+
+#: src/scripting/timer_scripting.py:37
+msgid "Podium Colors"
+msgstr "Couleurs du podium"
+
+#: src/scripting/timer_scripting.py:42
+msgid "Pre-race:"
+msgstr "Avant la course:"
+
+#: src/scripting/timer_scripting.py:44
+msgid "Still racing:"
+msgstr "Toujours en course:"
+
+#: src/scripting/timer_scripting.py:45
+msgid "1st place:"
+msgstr "1ère place:"
+
+#: src/scripting/timer_scripting.py:46
+msgid "2nd place:"
+msgstr "2ème place:"
+
+#: src/scripting/timer_scripting.py:47
+msgid "3rd place:"
+msgstr "3ème place:"
+
+#: src/scripting/timer_scripting.py:49
+msgid "After podium:"
+msgstr "Après le podium:"
+
+#~ msgid ""
+#~ "Select a text source to use as "
+#~ "your timer and enter yourfull username"
+#~ " on racetime.gg (including discriminator). "
+#~ "This only needs to be done once."
+#~ "\n"
+#~ "\n"
+#~ "Then select the race room each "
+#~ "race you join and stop worrying "
+#~ "about whether you started your timer "
+#~ "or not."
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select a text source to use as "
+#~ "your timer and enter your full "
+#~ "username on racetime.gg (including "
+#~ "discriminator). This only needs to be"
+#~ " done once.\n"
+#~ "\n"
+#~ "Then select the race room each "
+#~ "race you join and stop worrying "
+#~ "about whether you started your timer "
+#~ "or not."
+#~ msgstr ""
+
diff --git a/src/locales/pt/LC_MESSAGES/racetime-obs.po b/src/locales/pt/LC_MESSAGES/racetime-obs.po
new file mode 100644
index 0000000..25e7e81
--- /dev/null
+++ b/src/locales/pt/LC_MESSAGES/racetime-obs.po
@@ -0,0 +1,354 @@
+# Portuguese translations for PROJECT.
+# Copyright (C) 2020 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# FIRST AUTHOR , 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2020-12-29 07:01-0500\n"
+"PO-Revision-Date: 2020-12-28 15:51-0500\n"
+"Last-Translator: FULL NAME \n"
+"Language: pt\n"
+"Language-Team: pt \n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.9.0\n"
+
+#: src/racetime_client.py:22 src/rtgg_obs.py:24
+msgid ""
+"You've loaded the incorrect script.
Please remove this fileand "
+"add 'racetime_obs.py' instead
"
+msgstr ""
+" Você carregou o script incorreto.
Remova este arquivo e "
+"adicione 'racetime_obs.py' em seu lugar
"
+
+#: src/racetime_obs.py:29
+msgid ""
+"Select a text source to use as your timer and enter your full username on"
+" racetime.gg (including discriminator). This only needs to be done once."
+" Then select the race room each race you join and stop worrying about "
+"whether you started your timer or not."
+msgstr ""
+"Selecione uma fonte de texto para usar como seu cronômetro e digite seu "
+"nome de usuário completo em racetime.gg (incluindo discriminador). Isso só "
+"precisa ser feito uma vez. Em seguida, selecione a sala de corrida de cada "
+"corrida em que você participa e pare de se preocupar se você iniciou o "
+"cronômetro ou não."
+
+#: src/racetime_obs.py:85
+msgid "Race info"
+msgstr "Informação da corrida"
+
+#: src/racetime_obs.py:107
+msgid "Refresh"
+msgstr "Atualizar"
+
+#: src/racetime_obs.py:161
+msgid "Race not found"
+msgstr "Raça não encontrada"
+
+#: src/scripting/__init__.py:33
+msgid "All"
+msgstr "Todos"
+
+#: src/scripting/__init__.py:35
+msgid "None"
+msgstr "Nenhum"
+
+#: src/scripting/coop_scripting.py:15
+msgid "Display coop information?"
+msgstr "Exibir informações da cooperativa?"
+
+#: src/scripting/coop_scripting.py:19
+msgid "Co-op Mode"
+msgstr "Modo Co-op"
+
+#: src/scripting/coop_scripting.py:24
+msgid "Co-op Partner"
+msgstr "Parceiro Co-op"
+
+#: src/scripting/coop_scripting.py:28
+msgid "Co-op Rival 1"
+msgstr "Rival Co-op 1"
+
+#: src/scripting/coop_scripting.py:32
+msgid "Co-op Rival 2"
+msgstr "Rival Co-op 2"
+
+#: src/scripting/coop_scripting.py:37
+msgid "Our Team's Timer"
+msgstr "Cronômetro de nossa equipe"
+
+#: src/scripting/coop_scripting.py:41
+msgid "This text source will display your team's timer when you finish."
+msgstr ""
+"Esta fonte de texto exibirá o cronômetro de sua equipe quando você terminar."
+
+#: src/scripting/coop_scripting.py:48
+msgid ""
+"This text source will be use to display your rival's timer when they "
+"finish"
+msgstr ""
+"Esta fonte de texto será usada para exibir o cronômetro do seu rival quando "
+"ele terminar"
+
+#: src/scripting/coop_scripting.py:53
+msgid "Winner Color:"
+msgstr "Cor do vencedor:"
+
+#: src/scripting/coop_scripting.py:55
+msgid "Loser Color:"
+msgstr "Cor do perdedor:"
+
+#: src/scripting/coop_scripting.py:57
+msgid "Winner Undetermined Color"
+msgstr "Cor Indeterminada do Vencedor"
+
+#: src/scripting/media_player_scripting.py:37
+msgid "Enable sounds?"
+msgstr "Habilitar sons?"
+
+#: src/scripting/media_player_scripting.py:42
+msgid "Media Player Mode"
+msgstr "Modo Media Player"
+
+#: src/scripting/media_player_scripting.py:50
+#: src/scripting/media_trigger_scripting.py:37
+msgid "Monitoring Type"
+msgstr "Tipo de Monitoramento"
+
+#: src/scripting/media_player_scripting.py:53
+msgid "Listen Only"
+msgstr "Ouvir apenas"
+
+#: src/scripting/media_player_scripting.py:57
+msgid "Stream Only"
+msgstr "Transmitir apenas"
+
+#: src/scripting/media_player_scripting.py:59
+#: src/scripting/media_trigger_scripting.py:44
+msgid "Listen and Stream"
+msgstr "Ouça e transmita"
+
+#: src/scripting/media_player_scripting.py:62
+msgid "Chat Pings"
+msgstr ""
+
+#: src/scripting/media_player_scripting.py:64
+msgid ""
+"Enable this and set choose a sound file to play when a bot posts or when "
+"someone @s you in racetime.gg chat"
+msgstr ""
+"Habilite isso e defina a escolha de um arquivo de som para tocar quando um "
+"bot postar ou quando alguém falar com você no chat racetime.gg"
+
+#: src/scripting/media_player_scripting.py:69
+msgid "Chat media file"
+msgstr "Arquivo de mídia de bate-papo"
+
+#: src/scripting/media_player_scripting.py:74
+msgid "First Place Sound"
+msgstr "Primeiro lugar de som"
+
+#: src/scripting/media_player_scripting.py:78
+msgid "Sound file to play when you finish first."
+msgstr "Arquivo de som a ser reproduzido quando você terminar primeiro."
+
+#: src/scripting/media_trigger_scripting.py:16
+msgid "Media Trigger #"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:25
+msgid "Sound File"
+msgstr "Arquivo de Som"
+
+#: src/scripting/media_trigger_scripting.py:29
+msgid "Type of Trigger"
+msgstr "Tipo de gatilho"
+
+#: src/scripting/media_trigger_scripting.py:32
+msgid "Chat"
+msgstr "Bate-papo"
+
+#: src/scripting/media_trigger_scripting.py:33
+msgid "Finish Place"
+msgstr "Terminar lugar"
+
+#: src/scripting/media_trigger_scripting.py:34
+msgid "Timer"
+msgstr "Cronômetro"
+
+#: src/scripting/media_trigger_scripting.py:40
+msgid "Only Listen"
+msgstr "Apenas escute"
+
+#: src/scripting/media_trigger_scripting.py:42
+msgid "Only Stream"
+msgstr "Apenas transmita"
+
+#: src/scripting/media_trigger_scripting.py:56
+msgid "Bot?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:58
+msgid "Highlighted?"
+msgstr "Em destaque?"
+
+#: src/scripting/media_trigger_scripting.py:60
+msgid "System?"
+msgstr ""
+
+#: src/scripting/media_trigger_scripting.py:72
+msgid "Finish Place <="
+msgstr "Terminar Lugar <="
+
+#: src/scripting/media_trigger_scripting.py:75
+msgid "Num. Entrants >="
+msgstr "Número de participantes >="
+
+#: src/scripting/media_trigger_scripting.py:85
+msgid "Start playing at "
+msgstr "Começa ás"
+
+#: src/scripting/qualifier_scripting.py:16
+msgid "Display race results as tournament qualifier?"
+msgstr "Exibir os resultados da corrida como qualificação do torneio?"
+
+#: src/scripting/qualifier_scripting.py:21
+msgid "Qualifier Mode"
+msgstr "Modo Qualificador"
+
+#: src/scripting/qualifier_scripting.py:30
+msgid "Use Top X as par time, where X="
+msgstr "Use o Top X como tempo nominal, onde X ="
+
+#: src/scripting/qualifier_scripting.py:35
+msgid "Qualifier Par Time Source"
+msgstr "Fonte de tempo par do qualificador"
+
+#: src/scripting/qualifier_scripting.py:43
+msgid "Qualifier Score Source"
+msgstr "Fonte de pontuação do qualificador"
+
+#: src/scripting/setup_scripting.py:25
+msgid "Initial setup - Check to make changes"
+msgstr "Configuração inicial - marque para fazer alterações"
+
+#: src/scripting/setup_scripting.py:29
+msgid "Text Source"
+msgstr "Fonte do Texto"
+
+#: src/scripting/setup_scripting.py:34
+msgid "Username"
+msgstr "Nome do usuário"
+
+#: src/scripting/setup_scripting.py:36
+msgid "Enable logging"
+msgstr "Habilitar registro"
+
+#: src/scripting/setup_scripting.py:38
+msgid "Log level"
+msgstr "Nível de registro"
+
+#: src/scripting/setup_scripting.py:41
+msgid "Error"
+msgstr "Erro"
+
+#: src/scripting/setup_scripting.py:42
+msgid "Debug"
+msgstr "Depurar"
+
+#: src/scripting/setup_scripting.py:43
+msgid "Info"
+msgstr "Informações"
+
+#: src/scripting/setup_scripting.py:45
+msgid ""
+"Generally, only log errors unless you are developing or are trying to "
+"find a specific problem."
+msgstr ""
+"Geralmente, apenas registre os erros, a menos que você esteja desenvolvendo "
+"ou tentando encontrar um problema específico."
+
+#: src/scripting/setup_scripting.py:49
+msgid "Log to file?"
+msgstr "Entrar no arquivo?"
+
+#: src/scripting/setup_scripting.py:51
+msgid "Log File"
+msgstr "Arquivo de log"
+
+#: src/scripting/setup_scripting.py:55
+msgid "Filter by Category"
+msgstr "Filtrar por categoria"
+
+#: src/scripting/setup_scripting.py:59
+msgid "Race"
+msgstr "Corrida"
+
+#: src/scripting/setup_scripting.py:69
+msgid "Race Desc"
+msgstr "Descrição da corrida"
+
+#: src/scripting/timer_scripting.py:33
+msgid "Use custom color for podium finishes?"
+msgstr "Usar cores personalizadas para acabamentos de pódio?"
+
+#: src/scripting/timer_scripting.py:37
+msgid "Podium Colors"
+msgstr "Cores do Pódio"
+
+#: src/scripting/timer_scripting.py:42
+msgid "Pre-race:"
+msgstr "Pré-corrida:"
+
+#: src/scripting/timer_scripting.py:44
+msgid "Still racing:"
+msgstr "Ainda correndo:"
+
+#: src/scripting/timer_scripting.py:45
+msgid "1st place:"
+msgstr "1 º lugar:"
+
+#: src/scripting/timer_scripting.py:46
+msgid "2nd place:"
+msgstr "2 º lugar:"
+
+#: src/scripting/timer_scripting.py:47
+msgid "3rd place:"
+msgstr "3 º lugar:"
+
+#: src/scripting/timer_scripting.py:49
+msgid "After podium:"
+msgstr "Depois do pódio:"
+
+#~ msgid ""
+#~ "Select a text source to use as "
+#~ "your timer and enter yourfull username"
+#~ " on racetime.gg (including discriminator). "
+#~ "This only needs to be done once."
+#~ "\n"
+#~ "\n"
+#~ "Then select the race room each "
+#~ "race you join and stop worrying "
+#~ "about whether you started your timer "
+#~ "or not."
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select a text source to use as "
+#~ "your timer and enter your full "
+#~ "username on racetime.gg (including "
+#~ "discriminator). This only needs to be"
+#~ " done once.\n"
+#~ "\n"
+#~ "Then select the race room each "
+#~ "race you join and stop worrying "
+#~ "about whether you started your timer "
+#~ "or not."
+#~ msgstr ""
+
diff --git a/src/racetime_obs.py b/src/racetime_obs.py
index 89509af..d2e1054 100644
--- a/src/racetime_obs.py
+++ b/src/racetime_obs.py
@@ -1,5 +1,7 @@
from threading import Thread
from gadgets.ladder_timer import LadderTimer
+import gettext
+import os
import obspython as obs
import clients.racetime_client as racetime_client
@@ -13,19 +15,30 @@
from scripting import fill_race_list, fill_source_list, set_source_text
from scripting import ScriptProperties as sp
+_ = None
rtgg_obs = RacetimeObs()
ladder_timer = LadderTimer(rtgg_obs.logger)
ladder_scripting.ladder_timer = ladder_timer
+def script_path():
+ # PLACEHOLDER
+ # this function gets injected by OBS with actual script path
+ pass
+
+
def script_description():
+ set_locale()
+ message = _(
+ "Select a text source to use as your timer and enter your "
+ "full username on racetime.gg (including discriminator). This "
+ "only needs to be done once. Then select the race room each "
+ "race you join and stop worrying about whether you started your "
+ "timer or not."
+ )
return (
"racetime-obs xxVERSIONxx
"
- "Select a text source to use as your timer and enter your"
- "full username on racetime.gg (including discriminator). This only"
- "needs to be done once.\n\nThen select the race room each race you "
- "join and stop worrying about whether you started your timer or not."
- "
"
+ "" + message + "
"
)
@@ -76,11 +89,22 @@ def script_update(settings):
def script_defaults(settings):
- obs.obs_data_set_default_string(settings, "race_info", "Race info")
+ set_locale()
+ obs.obs_data_set_default_string(settings, "race_info", _("Race info"))
obs.obs_data_set_default_string(settings, "race", "None")
obs.obs_data_set_default_int(settings, "qualifier_cutoff", 3)
+def set_locale():
+ global _
+ if _ is None:
+ os.environ['LOCALEDIR'] = script_path() + "locales"
+ os.environ['LANGUAGE'] = obs.obs_get_locale()[0:2]
+ lang = gettext.translation(
+ "racetime-obs", localedir=os.environ['LOCALEDIR'])
+ _ = lang.gettext
+
+
def script_properties():
props = obs.obs_properties_create()
setup_scripting.script_setup(
@@ -88,7 +112,7 @@ def script_properties():
)
refresh = obs.obs_properties_add_button(
- props, "button", "Refresh", lambda *props: None)
+ props, "button", _("Refresh"), lambda *props: None)
obs.obs_property_set_modified_callback(refresh, refresh_pressed)
timer_scripting.script_timer_settings(props, rtgg_obs,)
coop_scripting.script_coop_settings(props, rtgg_obs)
@@ -121,6 +145,7 @@ def refresh_pressed(props, prop, *args, **kwargs):
def new_race_selected(props, prop, settings):
+ set_locale()
rtgg_obs.race_changed = True
obs.timer_remove(update_sources)
@@ -151,7 +176,7 @@ def new_race_selected(props, prop, settings):
obs.timer_add(update_sources, 100)
else:
obs.obs_data_set_default_string(
- settings, "race_info", "Race not found")
+ settings, "race_info", _("Race not found"))
return True
diff --git a/src/rtgg_obs.py b/src/rtgg_obs.py
index de6eaa3..aabd353 100644
--- a/src/rtgg_obs.py
+++ b/src/rtgg_obs.py
@@ -3,6 +3,7 @@
import json
import logging
from datetime import datetime, timedelta, timezone
+import gettext
import dateutil
import websockets
@@ -18,11 +19,13 @@
from models.race import Race, race_from_dict
from models.chat_message import chat_message_from_dict
+_ = gettext.gettext
+
def script_description():
- return (
+ return (_(
"You've loaded the incorrect script.
Please remove this file"
- "and add 'racetime_obs.py' instead
"
+ "and add 'racetime_obs.py' instead")
)
diff --git a/src/scripting/__init__.py b/src/scripting/__init__.py
index 88fdab4..f7e647a 100644
--- a/src/scripting/__init__.py
+++ b/src/scripting/__init__.py
@@ -1,5 +1,7 @@
from enum import Enum, auto
+import os
from typing import List
+import gettext
from models.race import Race
import obspython as obs
from helpers.obs_context_manager import data_ar, source_ar, source_list_ar
@@ -33,11 +35,14 @@ def fill_source_list(p):
def fill_race_list(rtgg_obs: RacetimeObs, race_list, category_list):
+ lang = gettext.translation(
+ "racetime-obs", localedir=os.environ['LOCALEDIR'])
+ _ = lang.gettext
obs.obs_property_list_clear(race_list)
obs.obs_property_list_clear(category_list)
- obs.obs_property_list_add_string(category_list, "All", sp.all_category)
+ obs.obs_property_list_add_string(category_list, _("All"), sp.all_category)
- obs.obs_property_list_add_string(race_list, "None", "None")
+ obs.obs_property_list_add_string(race_list, _("None"), "None")
races = racetime_client.get_races()
if races is not None:
fill_category_list(category_list, races)
diff --git a/src/scripting/coop_scripting.py b/src/scripting/coop_scripting.py
index d9331f2..f24f09a 100644
--- a/src/scripting/coop_scripting.py
+++ b/src/scripting/coop_scripting.py
@@ -1,53 +1,60 @@
+import gettext
+import os
+
import obspython as obs
from rtgg_obs import RacetimeObs
from . import fill_source_list
def script_coop_settings(props, rtgg_obs: RacetimeObs):
+ lang = gettext.translation(
+ "racetime-obs", localedir=os.environ['LOCALEDIR'])
+ _ = lang.gettext
+
p = obs.obs_properties_add_bool(
- props, "use_coop", "Display coop information?")
+ props, "use_coop", _("Display coop information?"))
obs.obs_property_set_modified_callback(p, coop_toggled)
coop_group = obs.obs_properties_create()
obs.obs_properties_add_group(
- props, "coop_group", "Co-op Mode", obs.OBS_GROUP_NORMAL, coop_group
+ props, "coop_group", _("Co-op Mode"), obs.OBS_GROUP_NORMAL, coop_group
)
obs.obs_property_set_visible(
obs.obs_properties_get(props, "coop_group"), rtgg_obs.coop.enabled)
p = obs.obs_properties_add_list(
- coop_group, "coop_partner", "Co-op Partner",
+ coop_group, "coop_partner", _("Co-op Partner"),
obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING
)
p = obs.obs_properties_add_list(
- coop_group, "coop_opponent1", "Co-op Rival 1",
+ coop_group, "coop_opponent1", _("Co-op Rival 1"),
obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING
)
p = obs.obs_properties_add_list(
- coop_group, "coop_opponent2", "Co-op Rival 2",
+ coop_group, "coop_opponent2", _("Co-op Rival 2"),
obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING
)
fill_coop_entrant_lists(props, rtgg_obs)
p = obs.obs_properties_add_list(
- coop_group, "coop_our_source", "Our Team's Timer",
+ coop_group, "coop_our_source", _("Our Team's Timer"),
obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING
)
obs.obs_property_set_long_description(p, (
- "This text source will display your team's timer when you finish."
+ _("This text source will display your team's timer when you finish.")
))
fill_source_list(p)
p = obs.obs_properties_add_list(
coop_group, "coop_opponent_source", "Rival Team's Timer",
obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING
)
- obs.obs_property_set_long_description(p, (
- "This text source will be use to display your rival's timer when they"
- " finish"
+ obs.obs_property_set_long_description(p, (_(
+ "This text source will be use to display your rival's timer when "
+ "they finish")
))
obs.obs_properties_add_color(
- coop_group, "coop_winner_color", "Winner Color:")
+ coop_group, "coop_winner_color", _("Winner Color:"))
obs.obs_properties_add_color(
- coop_group, "coop_loser_color", "Loser Color:")
+ coop_group, "coop_loser_color", _("Loser Color:"))
obs.obs_properties_add_color(
- coop_group, "coop_undetermined_color", "Winner Undetermined Color")
+ coop_group, "coop_undetermined_color", _("Winner Undetermined Color"))
fill_source_list(p)
diff --git a/src/scripting/media_player_scripting.py b/src/scripting/media_player_scripting.py
index d74f66e..fd7733e 100644
--- a/src/scripting/media_player_scripting.py
+++ b/src/scripting/media_player_scripting.py
@@ -1,7 +1,12 @@
+import gettext
+import os
+
from helpers.obs_context_manager import media_source_ar
import obspython as obs
from rtgg_obs import RacetimeObs
+_ = gettext.gettext
+
def script_update_media_player_settings(settings, rtgg_obs: RacetimeObs):
rtgg_obs.media_player.play_media_callback = play_sound
@@ -24,13 +29,17 @@ def script_update_media_player_settings(settings, rtgg_obs: RacetimeObs):
def script_media_player_settings(
props, rtgg_obs: RacetimeObs, media_player_toggled
):
+ lang = gettext.translation(
+ "racetime-obs", localedir=os.environ['LOCALEDIR'])
+ _ = lang.gettext
+
p = obs.obs_properties_add_bool(
- props, "use_media_player", "Enable sounds?"
+ props, "use_media_player", _("Enable sounds?")
)
obs.obs_property_set_modified_callback(p, media_player_toggled)
media_player_group = obs.obs_properties_create()
obs.obs_properties_add_group(
- props, "media_player_group", "Media Player Mode",
+ props, "media_player_group", _("Media Player Mode"),
obs.OBS_GROUP_NORMAL, media_player_group
)
obs.obs_property_set_visible(
@@ -38,32 +47,35 @@ def script_media_player_settings(
rtgg_obs.media_player.enabled
)
monitoring_list = obs.obs_properties_add_list(
- media_player_group, "monitoring_type", "Monitoring Type",
+ media_player_group, "monitoring_type", _("Monitoring Type"),
obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_INT)
obs.obs_property_list_add_int(
- monitoring_list, "Listen Only", obs.OBS_MONITORING_TYPE_MONITOR_ONLY)
+ monitoring_list, _("Listen Only"),
+ obs.OBS_MONITORING_TYPE_MONITOR_ONLY
+ )
obs.obs_property_list_add_int(
- monitoring_list, "Stream Only", obs.OBS_MONITORING_TYPE_NONE)
+ monitoring_list, _("Stream Only"), obs.OBS_MONITORING_TYPE_NONE)
obs.obs_property_list_add_int(
- monitoring_list, "Listen and Stream",
+ monitoring_list, _("Listen and Stream"),
obs.OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT)
p = obs.obs_properties_add_bool(
- media_player_group, "use_chat_pings", "Chat Pings")
+ media_player_group, "use_chat_pings", _("Chat Pings"))
obs.obs_property_set_long_description(
- p, ("Enable this and set choose a sound file to play when a bot posts "
- "or when someone @s you in racetime.gg chat"))
+ p, _("Enable this and set choose a sound file to play when a bot posts"
+ " or when someone @s you in racetime.gg chat")
+ )
p = obs.obs_properties_add_path(
media_player_group, "chat_ping_sound",
- "Chat media file", obs.OBS_PATH_FILE,
+ _("Chat media file"), obs.OBS_PATH_FILE,
"Audio Files (*.mp3 *.aac *.wav *.wma)", None
)
obs.obs_properties_add_path(
media_player_group, "first_place_sound",
- "First Place Sound", obs.OBS_PATH_FILE,
+ _("First Place Sound"), obs.OBS_PATH_FILE,
"Audio Files (*.mp3 *.aac *.wav *.wma)", None
)
obs.obs_property_set_long_description(
- p, "Sound file to play when you finish first.")
+ p, _("Sound file to play when you finish first."))
def play_sound(media_path: str,
diff --git a/src/scripting/media_trigger_scripting.py b/src/scripting/media_trigger_scripting.py
index 1d89749..19ab671 100644
--- a/src/scripting/media_trigger_scripting.py
+++ b/src/scripting/media_trigger_scripting.py
@@ -1,12 +1,19 @@
+import gettext
+import os
+
import obspython as obs
from rtgg_obs import RacetimeObs
def media_trigger_settings(props, rtgg_obs: RacetimeObs, index: int):
+ lang = gettext.translation(
+ "racetime-obs", localedir=os.environ['LOCALEDIR'])
+ _ = lang.gettext
+
media_player_group = obs.obs_properties_create()
name = f"media_trigger_#{index}"
obs.obs_properties_add_group(
- props, name, f"Media Trigger #{index}",
+ props, name, _("Media Trigger #") + f"{index}",
obs.OBS_GROUP_NORMAL, media_player_group
)
obs.obs_property_set_visible(
@@ -15,26 +22,26 @@ def media_trigger_settings(props, rtgg_obs: RacetimeObs, index: int):
)
obs.obs_properties_add_path(
media_player_group, f"media_path_#{index}",
- "Sound File", obs.OBS_PATH_FILE,
+ _("Sound File"), obs.OBS_PATH_FILE,
"Audio Files (*.mp3 *.aac *.wav *.wma)", None
)
p = obs.obs_properties_add_list(
- media_player_group, f"trigger_type_#{index}", "Type of Trigger",
+ media_player_group, f"trigger_type_#{index}", _("Type of Trigger"),
obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING)
obs.obs_property_list_add_string(p, "", "")
- obs.obs_property_list_add_string(p, "Chat", "chat")
- obs.obs_property_list_add_string(p, "Finish Place", "finish")
- obs.obs_property_list_add_string(p, "Timer", "time")
+ obs.obs_property_list_add_string(p, _("Chat"), "chat")
+ obs.obs_property_list_add_string(p, _("Finish Place"), "finish")
+ obs.obs_property_list_add_string(p, _("Timer"), "time")
obs.obs_property_set_modified_callback(p, media_type_changed)
p = obs.obs_properties_add_list(
- media_player_group, f"monitoring_type_#{index}", "Monitoring Type",
+ media_player_group, f"monitoring_type_#{index}", _("Monitoring Type"),
obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_INT)
obs.obs_property_list_add_int(
- p, "Only Listen", obs.OBS_MONITORING_TYPE_MONITOR_ONLY)
+ p, _("Only Listen"), obs.OBS_MONITORING_TYPE_MONITOR_ONLY)
obs.obs_property_list_add_int(
- p, "Only Stream", obs.OBS_MONITORING_TYPE_NONE)
+ p, _("Only Stream"), obs.OBS_MONITORING_TYPE_NONE)
obs.obs_property_list_add_int(
- p, "Listen and Stream", obs.OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT)
+ p, _("Listen and Stream"), obs.OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT)
def media_type_changed(props, prop, settings):
@@ -42,25 +49,38 @@ def media_type_changed(props, prop, settings):
def chat_media_trigger_settings(props, index: int):
- obs.obs_properties_add_bool(props, f"trigger_chat_bot_#{index}", "Bot?")
+ lang = gettext.translation(
+ "racetime-obs", localedir=os.environ['LOCALEDIR'])
+ _ = lang.gettext
+
+ obs.obs_properties_add_bool(props, f"trigger_chat_bot_#{index}", _("Bot?"))
obs.obs_properties_add_bool(
- props, f"trigger_chat_highlight_#{index}", "Highlighted?")
+ props, f"trigger_chat_highlight_#{index}", _("Highlighted?"))
obs.obs_properties_add_bool(
- props, f"trigger_chat_system_#{index}", "System?")
+ props, f"trigger_chat_system_#{index}", _("System?"))
def finish_media_trigger_settings(props, index: int):
"""
Settings for a media trigger based on what place the entrant finishes
"""
+ lang = gettext.translation(
+ "racetime-obs", localedir=os.environ['LOCALEDIR'])
+ _ = lang.gettext
+
obs.obs_properties_add_int(
- props, f"trigger_finish_place_#{index}", "Finish Place <=", 1, 10, 1)
+ props, f"trigger_finish_place_#{index}", _("Finish Place <="),
+ 1, 10, 1)
obs.obs_properties_add_int(
- props, f"trigger_finish_entrants_#{index}", "Num. Entrants >=",
+ props, f"trigger_finish_entrants_#{index}", _("Num. Entrants >="),
2, 255, 1)
def timer_media_trigger_settings(props, index: int):
+ lang = gettext.translation(
+ "racetime-obs", localedir=os.environ['LOCALEDIR'])
+ _ = lang.gettext
+
obs.obs_properties_add_float_slider(
- props, f"trigger_timer_time_#{index}", "Start playing at ",
+ props, f"trigger_timer_time_#{index}", _("Start playing at "),
-15.0, 60, 0.1)
diff --git a/src/scripting/qualifier_scripting.py b/src/scripting/qualifier_scripting.py
index 3730c78..38af32d 100644
--- a/src/scripting/qualifier_scripting.py
+++ b/src/scripting/qualifier_scripting.py
@@ -1,17 +1,24 @@
+import gettext
+import os
+
import obspython as obs
from rtgg_obs import RacetimeObs
from . import fill_source_list
def script_qualifier_settings(props, rtgg_obs: RacetimeObs):
+ lang = gettext.translation(
+ "racetime-obs", localedir=os.environ['LOCALEDIR'])
+ _ = lang.gettext
+
p = obs.obs_properties_add_bool(
props, "use_qualifier",
- "Display race results as tournament qualifier?"
+ _("Display race results as tournament qualifier?")
)
obs.obs_property_set_modified_callback(p, qualifier_toggled)
qualifier_group = obs.obs_properties_create()
obs.obs_properties_add_group(
- props, "qualifier_group", "Qualifier Mode",
+ props, "qualifier_group", _("Qualifier Mode"),
obs.OBS_GROUP_NORMAL, qualifier_group
)
obs.obs_property_set_visible(
@@ -20,12 +27,12 @@ def script_qualifier_settings(props, rtgg_obs: RacetimeObs):
)
p = obs.obs_properties_add_int_slider(
qualifier_group, "qualifier_cutoff",
- "Use Top X as par time, where X=", 3, 10, 1
+ _("Use Top X as par time, where X="), 3, 10, 1
)
p = obs.obs_properties_add_list(
qualifier_group,
"qualifier_par_source",
- "Qualifier Par Time Source",
+ _("Qualifier Par Time Source"),
obs.OBS_COMBO_TYPE_EDITABLE,
obs.OBS_COMBO_FORMAT_STRING
)
@@ -33,7 +40,7 @@ def script_qualifier_settings(props, rtgg_obs: RacetimeObs):
p = obs.obs_properties_add_list(
qualifier_group,
"qualifier_score_source",
- "Qualifier Score Source",
+ _("Qualifier Score Source"),
obs.OBS_COMBO_TYPE_EDITABLE,
obs.OBS_COMBO_FORMAT_STRING
)
diff --git a/src/scripting/setup_scripting.py b/src/scripting/setup_scripting.py
index 1623c2d..a03329b 100644
--- a/src/scripting/setup_scripting.py
+++ b/src/scripting/setup_scripting.py
@@ -1,3 +1,7 @@
+import gettext
+
+import os
+
import obspython as obs
from rtgg_obs import RacetimeObs
from scripting import fill_source_list
@@ -14,34 +18,41 @@ def script_update_setup_settings(settings, rtgg_obs: RacetimeObs):
def script_setup(props, new_race_selected, new_category_selected):
+ lang = gettext.translation(
+ "racetime-obs", localedir=os.environ['LOCALEDIR'])
+ _ = lang.gettext
+
setup_group = obs.obs_properties_create()
obs.obs_properties_add_group(
- props, "initial_setup", "Initial setup - Check to make changes",
+ props, "initial_setup", _("Initial setup - Check to make changes"),
obs.OBS_GROUP_CHECKABLE, setup_group
)
p = obs.obs_properties_add_list(
- setup_group, "source", "Text Source", obs.OBS_COMBO_TYPE_EDITABLE,
+ setup_group, "source", _("Text Source"), obs.OBS_COMBO_TYPE_EDITABLE,
obs.OBS_COMBO_FORMAT_STRING
)
fill_source_list(p)
obs.obs_properties_add_text(
- setup_group, "username", "Username", obs.OBS_TEXT_DEFAULT)
+ setup_group, "username", _("Username"), obs.OBS_TEXT_DEFAULT)
logging = obs.obs_properties_add_bool(
- setup_group, "enable_log", "Enable logging")
+ setup_group, "enable_log", _("Enable logging"))
log_levels = obs.obs_properties_add_list(
- setup_group, "log_level", "Log lever", obs.OBS_COMBO_TYPE_LIST,
+ setup_group, "log_level", _("Log level"), obs.OBS_COMBO_TYPE_LIST,
obs.OBS_COMBO_FORMAT_STRING
)
- obs.obs_property_list_add_string(log_levels, "Error", "Error")
- obs.obs_property_list_add_string(log_levels, "Debug", "Debug")
- obs.obs_property_list_add_string(log_levels, "Info", "Info")
+ obs.obs_property_list_add_string(log_levels, _("Error"), "error")
+ obs.obs_property_list_add_string(log_levels, _("Debug"), "debug")
+ obs.obs_property_list_add_string(log_levels, _("Info"), "info")
obs.obs_property_set_long_description(
- logging, "Generally, only log errors unless you are developing or are "
- "trying to find a specific problem."
+ logging, _(
+ "Generally, only log errors unless you are developing or are "
+ "trying to find a specific problem.")
)
- obs.obs_properties_add_bool(setup_group, "log_to_file", "Log to file?")
+ obs.obs_properties_add_bool(setup_group, "log_to_file", _("Log to file?"))
obs.obs_properties_add_path(
- setup_group, "log_file", "Log File", obs.OBS_PATH_FILE_SAVE, "*", None)
+ setup_group, "log_file", _("Log File"), obs.OBS_PATH_FILE_SAVE, "*",
+ None
+ )
preview = obs.obs_properties_add_bool(
setup_group, "preview_mode", "Preview Mode")
@@ -50,11 +61,11 @@ def script_setup(props, new_race_selected, new_category_selected):
"each component's text source to help arrange up your layout.")
category_list = obs.obs_properties_add_list(
- props, "category_filter", "Filter by Category",
+ props, "category_filter", _("Filter by Category"),
obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING
)
race_list = obs.obs_properties_add_list(
- props, "race", "Race",
+ props, "race", _("Race"),
obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING
)
obs.obs_property_set_modified_callback(
@@ -64,5 +75,5 @@ def script_setup(props, new_race_selected, new_category_selected):
category_list, new_category_selected)
p = obs.obs_properties_add_text(
- props, "race_info", "Race Desc", obs.OBS_TEXT_MULTILINE)
+ props, "race_info", _("Race Desc"), obs.OBS_TEXT_MULTILINE)
obs.obs_property_set_enabled(p, False)
diff --git a/src/scripting/timer_scripting.py b/src/scripting/timer_scripting.py
index e6624b7..6cd02be 100644
--- a/src/scripting/timer_scripting.py
+++ b/src/scripting/timer_scripting.py
@@ -1,3 +1,6 @@
+import gettext
+import os
+
import obspython as obs
from rtgg_obs import RacetimeObs
@@ -22,23 +25,28 @@ def script_update_timer_settings(
def script_timer_settings(props, rtgg_obs: RacetimeObs):
+ lang = gettext.translation(
+ "racetime-obs", localedir=os.environ['LOCALEDIR'])
+ _ = lang.gettext
+
p = obs.obs_properties_add_bool(
- props, "use_podium", "Use custom color for podium finishes?")
+ props, "use_podium", _("Use custom color for podium finishes?"))
obs.obs_property_set_modified_callback(p, podium_toggled)
podium_group = obs.obs_properties_create()
obs.obs_properties_add_group(
- props, "podium_group", "Podium Colors",
+ props, "podium_group", _("Podium Colors"),
obs.OBS_GROUP_NORMAL, podium_group
)
obs.obs_property_set_visible(obs.obs_properties_get(
props, "podium_group"), rtgg_obs.timer.use_podium_colors)
- obs.obs_properties_add_color(podium_group, "pre_color", "Pre-race:")
- obs.obs_properties_add_color(podium_group, "racing_color", "Still racing:")
- obs.obs_properties_add_color(podium_group, "first_color", "1st place:")
- obs.obs_properties_add_color(podium_group, "second_color", "2nd place:")
- obs.obs_properties_add_color(podium_group, "third_color", "3rd place:")
+ obs.obs_properties_add_color(podium_group, "pre_color", _("Pre-race:"))
+ obs.obs_properties_add_color(
+ podium_group, "racing_color", _("Still racing:"))
+ obs.obs_properties_add_color(podium_group, "first_color", _("1st place:"))
+ obs.obs_properties_add_color(podium_group, "second_color", _("2nd place:"))
+ obs.obs_properties_add_color(podium_group, "third_color", _("3rd place:"))
obs.obs_properties_add_color(
- podium_group, "finished_color", "After podium:")
+ podium_group, "finished_color", _("After podium:"))
def podium_toggled(props, prop, settings):