@@ -320,8 +320,33 @@ protected function get_installed_languages( $slug = 'default' ) {
320320 /**
321321 * @var array<string, array<string, array<string, mixed>>> $available
322322 */
323- $ available = wp_get_installed_translations ( $ this ->obj_type );
324- $ available = ! empty ( $ available [ $ slug ] ) ? array_keys ( $ available [ $ slug ] ) : array ();
323+ $ available = wp_get_installed_translations ( $ this ->obj_type );
324+
325+ // For plugins and themes, check if the text domain differs from the slug.
326+ $ text_domain = $ slug ;
327+ if ( 'default ' !== $ slug ) {
328+ if ( 'plugins ' === $ this ->obj_type ) {
329+ $ plugins = get_plugins ( '/ ' . $ slug );
330+ if ( ! empty ( $ plugins ) ) {
331+ $ plugin_data = array_shift ( $ plugins );
332+ // Use the TextDomain header if available, otherwise fall back to slug.
333+ if ( ! empty ( $ plugin_data ['TextDomain ' ] ) ) {
334+ $ text_domain = $ plugin_data ['TextDomain ' ];
335+ }
336+ }
337+ } elseif ( 'themes ' === $ this ->obj_type ) {
338+ $ theme_data = wp_get_theme ( $ slug );
339+ if ( $ theme_data ->exists () ) {
340+ // Use the TextDomain property if available, otherwise fall back to slug.
341+ $ theme_text_domain = $ theme_data ->get ( 'TextDomain ' );
342+ if ( ! empty ( $ theme_text_domain ) ) {
343+ $ text_domain = $ theme_text_domain ;
344+ }
345+ }
346+ }
347+ }
348+
349+ $ available = ! empty ( $ available [ $ text_domain ] ) ? array_keys ( $ available [ $ text_domain ] ) : array ();
325350 $ available [] = 'en_US ' ;
326351
327352 return $ available ;
0 commit comments