diff --git a/app/Event.php b/app/Event.php index 5d42b3c4a..93adc2562 100644 --- a/app/Event.php +++ b/app/Event.php @@ -139,6 +139,61 @@ public function getLanguagesAttribute() { return $this->language; } + /** + * Language codes that have a translation, so views never print raw keys + * such as "base.languages.eng" for legacy 3-letter codes. + */ + public function getDisplayLanguagesAttribute(): array + { + $raw = $this->languages ?? []; + + if (is_string($raw)) { + $raw = str_starts_with(trim($raw), '[') + ? (json_decode($raw, true) ?: []) + : explode(',', $raw); + } + + return collect(is_array($raw) ? $raw : [$raw]) + ->map(fn ($language) => self::normalizeLanguageCode(is_string($language) ? $language : null)) + ->filter() + ->unique() + ->values() + ->all(); + } + + public static function normalizeLanguageCode(?string $code): ?string + { + if ($code === null) { + return null; + } + + $code = strtolower(trim($code, " \t\n\r\0\x0B\"'[]")); + + if ($code === '') { + return null; + } + + $aliases = [ + 'eng' => 'en', + 'deu' => 'de', + 'ger' => 'de', + 'fra' => 'fr', + 'fre' => 'fr', + 'spa' => 'es', + 'ita' => 'it', + 'nld' => 'nl', + 'dut' => 'nl', + 'pol' => 'pl', + 'tur' => 'tr', + 'ell' => 'el', + 'gre' => 'el', + ]; + + $code = $aliases[$code] ?? $code; + + return trans()->has('base.languages.'.$code) ? $code : null; + } + public function getUrlAttribute() { if (!empty($this->slug)) { return route('view_event', [ diff --git a/app/Livewire/OnlineCalendar.php b/app/Livewire/OnlineCalendar.php index 9a122927b..57e65d30f 100644 --- a/app/Livewire/OnlineCalendar.php +++ b/app/Livewire/OnlineCalendar.php @@ -90,7 +90,7 @@ public function render() $languages = $this->baseQuery() ->get(['language']) ->flatMap(function ($event) { - return $this->normalizedLanguagesForEvent($event); + return $event->display_languages; }) ->unique() ->sort() @@ -134,81 +134,13 @@ private function baseQuery() private function eventMatchesLanguage($event, string $selectedLanguage): bool { - $selected = $this->normalizeLanguageCode($selectedLanguage); + $selected = Event::normalizeLanguageCode($selectedLanguage); if ($selected === null) { return false; } - return in_array($selected, $this->normalizedLanguagesForEvent($event), true); - } - - private function normalizedLanguagesForEvent($event): array - { - $raw = $event->languages ?? $event->language ?? []; - - if (is_string($raw)) { - $trimmed = trim($raw); - if ($trimmed === '') { - return []; - } - - if (str_starts_with($trimmed, '[')) { - $decoded = json_decode($trimmed, true); - $raw = is_array($decoded) ? $decoded : preg_split('/\s*,\s*/', $trimmed); - } else { - $raw = preg_split('/\s*,\s*/', $trimmed); - } - } - - if (! is_array($raw)) { - $raw = [$raw]; - } - - return collect($raw) - ->map(fn ($language) => $this->normalizeLanguageCode(is_string($language) ? $language : null)) - ->filter() - ->unique() - ->values() - ->all(); - } - - private function normalizeLanguageCode(?string $code): ?string - { - if ($code === null) { - return null; - } - - $code = strtolower(trim($code)); - $code = trim($code, "\"'[] "); - - if ($code === '') { - return null; - } - - $aliases = [ - 'eng' => 'en', - 'deu' => 'de', - 'ger' => 'de', - 'fra' => 'fr', - 'fre' => 'fr', - 'spa' => 'es', - 'ita' => 'it', - 'nld' => 'nl', - 'dut' => 'nl', - 'pol' => 'pl', - 'tur' => 'tr', - 'ell' => 'el', - 'gre' => 'el', - ]; - - $code = $aliases[$code] ?? $code; - - if (! trans()->has('base.languages.'.$code)) { - return null; - } - - return $code; + return in_array($selected, $event->display_languages, true); } private function getCountryNamesFromEvents($events) diff --git a/resources/views/livewire/online-calendar.blade.php b/resources/views/livewire/online-calendar.blade.php index 777c88905..c9dfe1557 100644 --- a/resources/views/livewire/online-calendar.blade.php +++ b/resources/views/livewire/online-calendar.blade.php @@ -1,4 +1,3 @@ -
@@ -37,13 +36,13 @@ class="w-full appearance-none rounded-full border border-slate-200 bg-white py-3
-
-
- - - +
+
+ + +
-
+

Showing {{ $visibleCount }} of {{ $totalUpcoming }} upcoming open online activities for {{ $monthLabel }} diff --git a/resources/views/online-calendar/_oc-event-simple.blade.php b/resources/views/online-calendar/_oc-event-simple.blade.php index e3f5f3b52..f47e3d979 100644 --- a/resources/views/online-calendar/_oc-event-simple.blade.php +++ b/resources/views/online-calendar/_oc-event-simple.blade.php @@ -13,13 +13,11 @@

- @if($event->language) - @foreach($event->languages as $language) - - {{__("base.languages.{$language}")}} - - @endforeach - @endif + @foreach($event->display_languages as $language) + + {{__("base.languages.{$language}")}} + + @endforeach