@@ -95,18 +95,15 @@ public function render()
9595 $ languages = $ this ->baseQuery ()
9696 ->get (['language ' ])
9797 ->flatMap (function ($ event ) {
98- return $ event ->languages ?? [];
99- })
100- ->filter (function ($ language ) {
101- return ! empty ($ language );
98+ return $ this ->normalizedLanguagesForEvent ($ event );
10299 })
103100 ->unique ()
104101 ->sort ()
105102 ->values ()
106103 ->map (function ($ language ) {
107104 return [
108105 'id ' => $ language ,
109- 'name ' => __ (" base.languages. { $ language}" ),
106+ 'name ' => __ (' base.languages. ' . $ language ),
110107 ];
111108 })
112109 ->prepend ([
@@ -115,10 +112,14 @@ public function render()
115112 ])
116113 ->toArray ();
117114
115+ $ totalUpcoming = $ this ->baseQuery ()->count ();
116+
118117 return view ('livewire.online-calendar ' , [
119118 'countryNames ' => $ this ->getCountryNamesFromEvents ($ events ),
120119 'languages ' => $ languages ,
121120 'filteredEvents ' => $ filteredEvents ->paginate (50 ),
121+ 'totalUpcoming ' => $ totalUpcoming ,
122+ 'visibleCount ' => $ filteredEvents ->count (),
122123 ]);
123124 }
124125
@@ -134,17 +135,81 @@ private function baseQuery()
134135
135136 private function eventMatchesLanguage ($ event , string $ selectedLanguage ): bool
136137 {
137- $ languages = $ event -> languages ?? [] ;
138+ $ selected = $ this -> normalizeLanguageCode ( $ selectedLanguage ) ;
138139
139- if (! is_array ( $ languages ) ) {
140- return strtolower (( string ) $ languages ) === strtolower ( $ selectedLanguage ) ;
140+ if ($ selected === null ) {
141+ return false ;
141142 }
142143
143- $ normalized = array_map (static function ($ language ) {
144- return strtolower ((string ) $ language );
145- }, $ languages );
144+ return in_array ($ selected , $ this ->normalizedLanguagesForEvent ($ event ), true );
145+ }
146+
147+ private function normalizedLanguagesForEvent ($ event ): array
148+ {
149+ $ raw = $ event ->languages ?? $ event ->language ?? [];
150+
151+ if (is_string ($ raw )) {
152+ $ trimmed = trim ($ raw );
153+ if ($ trimmed === '' ) {
154+ return [];
155+ }
156+
157+ if (str_starts_with ($ trimmed , '[ ' )) {
158+ $ decoded = json_decode ($ trimmed , true );
159+ $ raw = is_array ($ decoded ) ? $ decoded : preg_split ('/\s*,\s*/ ' , $ trimmed );
160+ } else {
161+ $ raw = preg_split ('/\s*,\s*/ ' , $ trimmed );
162+ }
163+ }
164+
165+ if (! is_array ($ raw )) {
166+ $ raw = [$ raw ];
167+ }
168+
169+ return collect ($ raw )
170+ ->map (fn ($ language ) => $ this ->normalizeLanguageCode (is_string ($ language ) ? $ language : null ))
171+ ->filter ()
172+ ->unique ()
173+ ->values ()
174+ ->all ();
175+ }
176+
177+ private function normalizeLanguageCode (?string $ code ): ?string
178+ {
179+ if ($ code === null ) {
180+ return null ;
181+ }
182+
183+ $ code = strtolower (trim ($ code ));
184+ $ code = trim ($ code , "\"'[] " );
185+
186+ if ($ code === '' ) {
187+ return null ;
188+ }
189+
190+ $ aliases = [
191+ 'eng ' => 'en ' ,
192+ 'deu ' => 'de ' ,
193+ 'ger ' => 'de ' ,
194+ 'fra ' => 'fr ' ,
195+ 'fre ' => 'fr ' ,
196+ 'spa ' => 'es ' ,
197+ 'ita ' => 'it ' ,
198+ 'nld ' => 'nl ' ,
199+ 'dut ' => 'nl ' ,
200+ 'pol ' => 'pl ' ,
201+ 'tur ' => 'tr ' ,
202+ 'ell ' => 'el ' ,
203+ 'gre ' => 'el ' ,
204+ ];
205+
206+ $ code = $ aliases [$ code ] ?? $ code ;
207+
208+ if (! trans ()->has ('base.languages. ' .$ code )) {
209+ return null ;
210+ }
146211
147- return in_array ( strtolower ( $ selectedLanguage ), $ normalized , true ) ;
212+ return $ code ;
148213 }
149214
150215 private function getCountryNamesFromEvents ($ events )
0 commit comments