Skip to content
wiki.fftac.org

Localerepository - Source Excerpt 04

Back to Localerepository

Summary

This source excerpt preserves a bounded section of Antichrist.net/wp-content/plugins/uaix-locale-router/src/LocaleRepository.php so readers can inspect the evidence without opening the full source file.

**Source path:** Antichrist.net/wp-content/plugins/uaix-locale-router/src/LocaleRepository.php

return (string) preg_replace( '/[^a-z0-9]+/', '', $label );
	}

	/**
	 * Parse a browser Accept-Language header into preferred locale tags.
	 *
	 * @param string $accept_language Header value.
	 * @return array
	 */
	public static function parse_accept_language_header( $accept_language ) {
		$accept_language = trim( (string) $accept_language );

		if ( '' === $accept_language || strlen( $accept_language ) > 512 ) {
			return array();
		}

		$preferences = array();
		$parts       = array_slice( explode( ',', $accept_language ), 0, 20 );

		foreach ( $parts as $index => $part ) {
			$part = trim( (string) $part );

			if ( '' === $part || '*' === $part ) {
				continue;
			}

			if ( preg_match( '/[\x00-\x1F\x7F]/', $part ) ) {
				continue;
			}

			$segments = array_map( 'trim', explode( ';', $part ) );
			$tag      = isset( $segments[0] ) ? LocaleValidator::canonicalize_tag( $segments[0] ) : '';

			if ( '' === $tag || ! LocaleValidator::is_valid_locale_tag( $tag ) ) {
				continue;
			}

			$quality = 1.0;

			foreach ( array_slice( $segments, 1, 4 ) as $parameter ) {
				if ( 0 === strpos( strtolower( $parameter ), 'q=' ) ) {
					$q_value = trim( substr( $parameter, 2 ) );

					if ( ! preg_match( '/^(?:0(?:\.\d{0,3})?|1(?:\.0{0,3})?)$/', $q_value ) ) {
						$quality = 0.0;
						break;
					}

					$quality = (float) $q_value;
					break;
				}
			}

			if ( $quality <= 0.0 ) {
				continue;
			}

			$preferences[] = array(
				'tag'     => $tag,
				'quality' => $quality,
				'index'   => (int) $index,
			);
		}

		usort(
			$preferences,
			static function ( $left, $right ) {
				if ( $left['quality'] === $right['quality'] ) {
					return $left['index'] <=> $right['index'];
				}

				return ( $left['quality'] > $right['quality'] ) ? -1 : 1;
			}
		);

		return array_values(
			array_map(
				static function ( $preference ) {
					return $preference['tag'];
				},
				$preferences
			)
		);
	}

	/**
	 * Match a preferred locale against enabled locales.
	 *
	 * Tries an exact locale match first, then falls back to language-only
	 * matching so a browser preference like en-GB can use an enabled en-US locale.
	 *
	 * @param string $preferred_tag Preferred locale tag.
	 * @param array  $enabled_locales Enabled locale records.
	 * @return array
	 */
	private static function match_enabled_locale_by_preference( $preferred_tag, array $enabled_locales ) {
		$preferred_tag      = LocaleValidator::canonicalize_tag( $preferred_tag );
		$preferred_language = strtolower( strtok( $preferred_tag, '-' ) );

		foreach ( $enabled_locales as $record ) {
			if ( ! empty( $record['tag'] ) && $record['tag'] === $preferred_tag ) {
				return $record;
			}
		}

		if ( '' === $preferred_language ) {
			return array();
		}

		foreach ( $enabled_locales as $record ) {
			$record_language = strtolower( strtok( $record['tag'], '-' ) );

			if ( '' !== $record_language && $record_language === $preferred_language ) {
				return $record;
			}
		}

		return array();
	}

	/**
	 * Reset request-local caches.
	 *
	 * @return void
	 */
	public static function reset_cache() {
		self::$catalog            = null;
		self::$supported_locales = null;
	}
}