The public integration point is the Free-owned facade:
if (function_exists('hotel_booking')) {
$navigation = hotel_booking()->languages();
$items = $navigation->available();
}
The LanguageNavigationInterface exposes current(), available(), url(), state(), provider() and snapshot(). A normalized item contains code, locale, label, native_label, direction, url, current and switchable. Render only items whose switchable flag is true and escape the returned URL with the normal WordPress attribute helper.
State and route rules
The state can be ready, single_language, unavailable, locked or provider_error. A theme should present a quiet single-language or unavailable state instead of inventing a vendor fallback. url() returns an empty string for sensitive confirmation, payment, customer, review, password-reset, nonce and token routes. Do not derive a switch URL by copying query strings.
Core owns provider detection, normalization, current language, available languages, switch URLs, security and cache-safe state. Aurelia owns markup, placement, responsive behavior, accessibility and display format. Pro delegates to this contract and must not fork it. The theme must not call WPML, Polylang, repositories, license code or internal services.
Test ordinary pages, /rooms/ and /search-availability/ virtual routes in both directions. Confirm custom menus are assigned at the provider level and that no booking or payment secret is present in output.