that language's home, a page * or post -> its published translation. Anything else (other sites, files, * wp-admin, archives, posts without a translation) comes back unchanged. */ declare( strict_types = 1 ); namespace AddBlack\Lang\Routing; defined( 'ABSPATH' ) || exit; use AddBlack\Lang\Settings\SettingsRepository; use AddBlack\Lang\Translation\PostTranslations; final class UrlLocalizer { public function __construct( private readonly Urls $urls, private readonly Raw $raw, private readonly SettingsRepository $settings, private readonly PostTranslations $posts ) {} public function localize( string $url, string $lang ): string { if ( '' === $url || ! $this->urls->pretty() || ! $this->settings->get()->is_language( $lang ) || preg_match( '#^(\#|mailto:|tel:|javascript:|data:)#i', $url ) ) { return $url; } $home = $this->urls->raw_home(); $parts = wp_parse_url( $url ); if ( false === $parts ) { return $url; } if ( isset( $parts['host'] ) && strtolower( $parts['host'] ) !== strtolower( (string) wp_parse_url( $home, PHP_URL_HOST ) ) ) { return $url; // Another site. } $path = $parts['path'] ?? ''; $suffix = ( isset( $parts['query'] ) ? '?' . $parts['query'] : '' ) . ( isset( $parts['fragment'] ) ? '#' . $parts['fragment'] : '' ); $home_dir = '/' . trim( (string) wp_parse_url( $home, PHP_URL_PATH ), '/' ); $rel = '/' . ltrim( '/' === $home_dir ? $path : ( str_starts_with( $path, $home_dir ) ? substr( $path, strlen( $home_dir ) ) : $path ), '/' ); if ( preg_match( '#^/(wp-admin|wp-json|wp-content|wp-includes|wp-login\.php|feed)(/|$)#', $rel ) || preg_match( '#\.[a-z0-9]{2,5}$#i', $rel ) ) { return $url; } $first = explode( '/', trim( $rel, '/' ) )[0]; if ( '' !== $first && $this->urls->lang_by_slug( $first ) ) { return $url; // Already has a language prefix. } if ( '/' === $rel ) { return $this->urls->lang_home( $lang ) . ltrim( $suffix, '/' ); } $post_id = (int) $this->raw->run( static fn() => url_to_postid( $home . $rel ) ); if ( ! $post_id ) { return $url; } $target = $this->posts->published_in( $post_id, $lang ); return $target ? (string) get_permalink( $target ) . $suffix : $url; } }