Skip to content

Commit 50990a7

Browse files
authored
Bugfix/misc (#1397)
* add missing locales * log missing locale on debut log level
1 parent 610fe0c commit 50990a7

File tree

3 files changed

+111
-3
lines changed

3 files changed

+111
-3
lines changed

resources/lang/de.json

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1041,5 +1041,50 @@
10411041
"video:video_enabled": "Kurzvideos erlauben",
10421042
"video:video_gif": "Video als GIF",
10431043
"video:video_qr": "QR für Video",
1044-
"wait_message": "Bitte warten..."
1044+
"wait_message": "Bitte warten...",
1045+
"theme_export": "Theme exportieren",
1046+
"theme_import": "Theme importieren",
1047+
"manual:collage:collage_background_color": "Farbe hinter Collage-Bildern, wenn kein Hintergrundbild gesetzt ist.",
1048+
"manual:collage:collage_dashedline_color": "Farbe der Trennlinie für 2x4 Collage-Layouts als Schnittmarke.",
1049+
"manual:collage:generator:add_image": "Fügt im Generator einen weiteren Platzhalter zur Layout-Vorschau hinzu.",
1050+
"manual:collage:generator:configuration_saved": "Meldung, wenn die erzeugte Layout-JSON erfolgreich gespeichert wurde.",
1051+
"manual:collage:generator:configuration_saving_error": "Meldung, wenn die Layout-JSON nicht gespeichert werden konnte (Schreibrechte prüfen).",
1052+
"manual:collage:generator:general_settings": "Allgemeine Einstellungen für Größe und Rotation des generierten Collage-Layouts.",
1053+
"manual:collage:generator:load_current_configuration": "Lädt deine aktuelle Collage-Konfiguration in das Generator-Formular.",
1054+
"manual:collage:generator:placeholder_settings": "Positions- und Größen-Einstellungen für den ausgewählten Platzhalter.",
1055+
"manual:collage:generator:please_enable_write": "Erscheint, wenn der Generator die Konfigurationsdatei nicht schreiben kann – Schreibzugriff aktivieren.",
1056+
"manual:collage:generator:save_config_manually": "Speichere die generierte Layout-JSON manuell, falls Auto-Speichern fehlschlägt.",
1057+
"manual:collage:generator:text_settings": "Text-Overlay-Einstellungen für generierte Layouts.",
1058+
"manual:collage:collage_allow_selection": "Wenn aktiviert, erscheint auf der Startseite eine Schaltfläche zur Auswahl eines Collage-Layouts.",
1059+
"manual:collage:collage_layouts_enabled": "Nur diese Layouts stehen dann in der Layout-Auswahl auf der Startseite zur Verfügung.",
1060+
"manual:magic_greenscreen:rembg_backgroundMode": "Legt fest, wie das Hintergrundbild skaliert oder zugeschnitten wird. Scale Fill (empfohlen) füllt die Fläche ohne Verzerrung, Scale Fit behält das Seitenverhältnis (ggf. Balken), Crop Center schneidet mittig, Stretch verzerrt, None übernimmt ohne Skalierung.",
1061+
"manual:theme_title": "Nutze die Themes-Box, um aktuelle Theme-Felder zu speichern, ein anderes zu laden, ein ZIP (Konfig + referenzierte Bilder) zu exportieren oder zu importieren. Import/Speichern überschreibt ein vorhandenes Theme mit gleichem Namen.",
1062+
"general:theme_manager": "Themes",
1063+
"collage:collage_limit": "Collage-Limit",
1064+
"general:webserver_url": "Webserver-URL",
1065+
"manual:collage:collage_limit": "Internes Limit für die Anzahl der Collagen; normalerweise unverändert lassen.",
1066+
"manual:general:theme_manager": "Themes-Verwaltung: speichern, laden, exportieren oder importieren von Themes.",
1067+
"manual:general:webserver_url": "Basis-URL des integrierten Webservers; wird automatisch gesetzt.",
1068+
"manual:keying:keying_seriouslyjs_color": "Farbe für die Chroma-Key-Überlagerung bei seriously.js Effekten.",
1069+
"manual:sound:sound_enabled": "Globaler Schalter für sämtliche UI-Sounds.",
1070+
"manual:userinterface:colors_background_countdown": "Hintergrundfarbe des Countdowns.",
1071+
"manual:userinterface:colors_border": "Rahmenfarbe für UI-Elemente.",
1072+
"manual:userinterface:colors_box": "Box-/Kartenfarbe für Panels.",
1073+
"manual:userinterface:colors_button_font": "Schriftfarbe der Buttons.",
1074+
"manual:userinterface:colors_cheese": "Farbe des „Cheese“-Hinweises.",
1075+
"manual:userinterface:colors_countdown": "Farbe der Countdown-Zahlen.",
1076+
"manual:userinterface:colors_font": "Primäre Schriftfarbe.",
1077+
"manual:userinterface:colors_font_secondary": "Sekundäre Schriftfarbe (z.B. Untertitel).",
1078+
"manual:userinterface:colors_gallery_button": "Buttonfarbe in der Galerie.",
1079+
"manual:userinterface:colors_highlight": "Highlight-Farbe für moderne Buttons.",
1080+
"manual:userinterface:colors_panel": "Hintergrundfarbe des Admin/Login-Panels.",
1081+
"manual:userinterface:colors_primary": "Primäre Akzentfarbe.",
1082+
"manual:userinterface:colors_primary_light": "Helle Variante der Primärfarbe.",
1083+
"manual:userinterface:colors_secondary": "Sekundäre Akzentfarbe.",
1084+
"manual:userinterface:colors_start_font": "Schriftfarbe auf dem Startbildschirm.",
1085+
"collage:collage_allow_selection": "Layoutauswahl erlauben",
1086+
"collage:collage_layouts_enabled": "Verfügbare Layouts für die Auswahl",
1087+
"magic_greenscreen:rembg_backgroundMode": "Hintergrund-Skalierungsmodus",
1088+
"px": "px",
1089+
"%": "%"
10451090
}

resources/lang/en.json

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1050,5 +1050,43 @@
10501050
"video:video_enabled": "Allow taking short videos",
10511051
"video:video_gif": "Video as GIF",
10521052
"video:video_qr": "Show video QR code",
1053-
"wait_message": "Please wait..."
1053+
"wait_message": "Please wait...",
1054+
"theme_export": "Export theme",
1055+
"theme_import": "Import theme",
1056+
"manual:collage:collage_background_color": "Color used behind collage images when no background image is set.",
1057+
"manual:collage:collage_dashedline_color": "Cutting line color for 2x4 collage layouts to guide trimming.",
1058+
"manual:collage:generator:add_image": "Add another placeholder image block to the collage layout preview.",
1059+
"manual:collage:generator:configuration_saved": "Shown when the generated layout JSON was written successfully.",
1060+
"manual:collage:generator:configuration_saving_error": "Shown when the layout JSON could not be written (check write permissions).",
1061+
"manual:collage:generator:general_settings": "Common settings for generated collage layout size and rotation.",
1062+
"manual:collage:generator:load_current_configuration": "Loads your current collage config into the generator form.",
1063+
"manual:collage:generator:placeholder_settings": "Position/size settings for the selected placeholder image.",
1064+
"manual:collage:generator:please_enable_write": "Appears when the generator cannot write the config file—enable write access.",
1065+
"manual:collage:generator:save_config_manually": "Save the generated layout JSON manually if auto-save fails.",
1066+
"manual:collage:generator:text_settings": "Text overlay settings for generated layouts.",
1067+
"general:theme_manager": "Themes",
1068+
"collage:collage_limit": "Collage limit",
1069+
"general:webserver_url": "Webserver URL",
1070+
"manual:collage:collage_limit": "Internal limit for number of collages; leave the default.",
1071+
"manual:general:theme_manager": "Theme management: save, load, export or import themes.",
1072+
"manual:general:webserver_url": "Base URL for the built-in webserver; managed automatically.",
1073+
"manual:keying:keying_seriouslyjs_color": "Color used for the chroma key overlay when using seriously.js effects.",
1074+
"manual:sound:sound_enabled": "Global toggle for all UI sounds.",
1075+
"manual:userinterface:colors_background_countdown": "Background color of the countdown screen.",
1076+
"manual:userinterface:colors_border": "Border color used for UI elements.",
1077+
"manual:userinterface:colors_box": "Box/panel color.",
1078+
"manual:userinterface:colors_button_font": "Font color of buttons.",
1079+
"manual:userinterface:colors_cheese": "Color of the “cheese” prompt.",
1080+
"manual:userinterface:colors_countdown": "Color of the countdown numbers.",
1081+
"manual:userinterface:colors_font": "Primary font color.",
1082+
"manual:userinterface:colors_font_secondary": "Secondary font color (e.g., subtitles).",
1083+
"manual:userinterface:colors_gallery_button": "Button color in the gallery.",
1084+
"manual:userinterface:colors_highlight": "Highlight color for modern buttons.",
1085+
"manual:userinterface:colors_panel": "Background color of admin/login panels.",
1086+
"manual:userinterface:colors_primary": "Primary accent color.",
1087+
"manual:userinterface:colors_primary_light": "Light variant of the primary color.",
1088+
"manual:userinterface:colors_secondary": "Secondary accent color.",
1089+
"manual:userinterface:colors_start_font": "Font color on the start screen.",
1090+
"px": "px",
1091+
"%": "%"
10541092
}

src/Service/LanguageService.php

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@
33
namespace Photobooth\Service;
44

55
use Photobooth\Enum\FolderEnum;
6+
use Photobooth\Logger\NamedLogger;
67
use Photobooth\Utility\PathUtility;
8+
use Symfony\Component\Translation\MessageCatalogueInterface;
79
use Symfony\Component\Translation\Loader\JsonFileLoader;
810
use Symfony\Component\Translation\Translator;
911

1012
class LanguageService
1113
{
1214
private string $locale;
1315
private Translator $translator;
16+
private ?MessageCatalogueInterface $catalogue = null;
17+
private NamedLogger $logger;
18+
/** @var array<string,bool> */
19+
private array $missingLogged = [];
1420

1521
public function __construct()
1622
{
@@ -31,11 +37,30 @@ public function __construct()
3137
}
3238

3339
$this->translator = $translator;
40+
$this->logger = LoggerService::getInstance()->getLogger('i18n');
41+
42+
// Only keep the catalogue cached when debug logging is enabled to avoid overhead in production
43+
if ($this->logger->getLevel() >= 2) {
44+
$this->catalogue = $translator->getCatalogue($this->locale);
45+
}
3446
}
3547

3648
public function translate(string $id): string
3749
{
38-
return $this->translator->trans($id, [], 'photobooth');
50+
$translated = $this->translator->trans($id, [], 'photobooth');
51+
52+
// Detect locale-specific misses even if a fallback string was returned
53+
$isDefinedInLocale = $this->catalogue?->defines($id, 'photobooth') ?? true;
54+
55+
if (!$isDefinedInLocale && !isset($this->missingLogged[$id])) {
56+
$this->missingLogged[$id] = true;
57+
$this->logger->debug('Missing translation', [
58+
'key' => $id,
59+
'locale' => $this->locale,
60+
]);
61+
}
62+
63+
return $translated;
3964
}
4065

4166
public function all(): array

0 commit comments

Comments
 (0)