set_custom_path('abece-booking',dirname(__DIR__,2).'/languages'); add_filter('get_available_languages',static fn(array $locales):array=>array_values(array_unique([...$locales,...self::SUPPORTED]))); // Standard loader hooks preserve existing site/custom catalogs whenever present. add_filter('load_textdomain_mofile',static function(string $file,string $domain):string { if($domain!=='abece-booking')return $file; $locale=self::resolve(determine_locale());$bundled=dirname(__DIR__,2).'/languages/'; // WordPress 6.2's JIT registry can select the bundled path last; site packs still win. $site=WP_LANG_DIR.'/plugins/abece-booking-'.$locale.'.mo'; if(str_starts_with($file,$bundled)&&is_readable($site))return $site; if(is_readable($file))return $file; $fallback=$bundled.'abece-booking-'.$locale.'.mo';return is_readable($fallback)?$fallback:$file; },10,2); add_filter('load_script_translation_file',static function(string|false $file,string $handle,string $domain):string|false { if($domain!=='abece-booking'||!in_array($handle,['abece-booking-admin','abece-booking-public'],true)||($file&&is_readable($file)))return $file; $fallback=dirname(__DIR__,2).'/languages/abece-booking-'.self::resolve(determine_locale()).'-'.$handle.'.json';return is_readable($fallback)?$fallback:$file; },10,3); } /** Evaluate literal gettext calls in the selected locale, then restore the caller's locale. */ public static function withLocale(string $locale,callable $callback): mixed { $target=self::resolve($locale);$switched=switch_to_locale($target);try{return $callback();}finally{if($switched)restore_previous_locale();} } }