Add site-to-site export and import of translation relationships, so language assignments and translation groups survive a WordPress (WXR) content move.
0.3.2
Add cross-language 404 fallback resolution.
0.3.1
Add per-block language scope override to Query Loop.
Add WPGraphQL companion adapter for translation graph.
Pin Free AI translation spike findings for Cloudflare Workers AI.
0.3.0
Declarative content schema: extensions can now declare, per post meta key and block attribute, whether a value should be copied, translated manually, or ignored when a translation draft is created — through the wakalang_content_schema filter or a theme’s wpml-config.xml. Unknown or unsafe declarations are ignored and reported, secret/authentication meta is never copied, and with nothing declared the existing draft behavior is unchanged. See docs/HOOKS.md.
hreflang x-default now auto-derives from the current page’s default-language URL when x_default_url is left empty and enable_x_default is on. Sites that explicitly set x_default_url keep the previous fixed-URL behavior.
0.2.6
Block themes: assign a different navigation per language for each navigation your site uses. Header and footer (or any separate Navigation blocks) can now each be mapped independently — on a non-default-language page the navigation you chose for that language is shown in its place. Configure it under WakaLang → Settings → Navigation menus, where each navigation your site references appears as its own row; the default language keeps the original.
Optionally scope secondary post listings to the current language. When enabled under WakaLang → Settings, Recent Posts widgets, Latest Posts blocks and other secondary queries on a language page (e.g. /en/) show only that language’s posts, matching the main archive. Off by default; a theme can keep a specific query showing every language with the wakalang_filter_secondary_queries filter.
0.2.5
Avoid duplicating the plugin “View details” link.
0.2.4
Assign a different navigation menu per language to each theme menu location: on a non-default-language page (e.g. /en/) the menu you assigned for that language is shown in place of the theme’s default, so labels, items and order can differ per language. Configure it under WakaLang → Settings → Navigation menus; the default language keeps the theme’s own assignment. Only menus shown through a theme menu location are affected, and the feature can be turned off.
0.2.1
Agent-assisted migration from Polylang and WPML: import existing language assignments and translation groups into WakaLang locally (no external requests), via the WakaLang → Tools screen, the wp wakalang migrate polylang|wpml command, or the import-from-polylang / import-from-wpml abilities. Post content and slugs are never moved; imports default to a dry-run preview and are bounded per run.
Expose WakaLang’s agent abilities on the core WordPress Abilities REST API (WP 6.9+) via meta.show_in_rest. Read-safe abilities (list languages, get settings, diagnose, …) are reachable over REST; writes stay behind authentication and capability checks.
Languages screen: reject adding a language whose URL prefix is already used by another language (previously only a duplicate code was caught, so two languages could share a URL prefix). Code and URL-prefix conflicts now show an error notice, matching the REST/CLI behavior.
0.2.0
Exclude pro scope commits from the free changelog.
Replace wporg screenshot placeholders.
0.1.1
Settings and “View details” action links on the Plugins list row.
0.1.0
Language registry (option-backed) with an admin Languages screen: each language carries a code, locale, name, native name, URL prefix, default flag and enabled flag.
URL-prefix rewrite routing (/ja/…, /en/…) — the prefix is the source of truth for the current language; rewrite rules flush on activation/deactivation.
Current-language context service and public template functions (wakalang_get_current_language(), wakalang_get_supported_languages(), …), with optional root-request browser-language detection and a preferred-language cookie (both off-by-default-friendly and configurable).
Settings screen for URL mode, fallback behaviour, hreflang, x-default, cookie/browser-detection toggles and uninstall data handling.
Translation linking: a custom wp_wakalang_translations table and a post-editor meta box to set a post’s language, link it into a translation group, see the other-language versions, and create a draft translation. Rows are removed when a post is permanently deleted; group changes fire the wakalang_translation_group_updated action.
Translation repository served through the WordPress object cache (negative lookups cached, writes purge touched entries); merge_groups() folds one translation group into another, refused on a same-language collision.
Language switcher via the [wakalang_switcher] shortcode, the wakalang_language_switcher() / wakalang_get_language_switcher() template functions, and an editor block. The current language renders as a non-link with aria-current; output passes through wp_kses().
Language switcher display options: a flags mode (name / flag / flag_and_name) rendering each language’s flag as a Unicode emoji from its locale (no bundled images, no external requests), a global show/hide toggle, and automatic header (wp_body_open) or footer (wp_footer) placement.
hreflang <link rel=”alternate” hreflang=”…”> tags in wp_head for a page’s language variants, plus an optional x-default. Filterable via wakalang_hreflang_entries.
Language-preserving links: post_link / page_link / post_type_link / term_link, nav-menu item URLs, home_url() output, and block-theme/FSE navigation links keep the current language’s URL prefix. External links, anchors, mailto:/tel:, /wp-admin/, REST and feeds are left untouched.
Query language scoping: archive, search and feed (RSS/Atom) queries, plus the core wp-sitemap.xml (split per language), are filtered to the current language via shared posts_clauses / terms_clauses SQL with cache invalidation.
Taxonomy translation: categories, tags and public custom taxonomy terms carry per-language name/slug and link into translation groups, with a term-editor field and a Translations column in term lists.
SEO title and meta description per translation, stored in WakaLang-owned post meta and passed to WordPress core and the Yoast / Rank Math public filters (their own meta is never read or written).
Per-language site title and tagline translation (overriding option_blogname / option_blogdescription on the front end without going through gettext).
Admin locale follows the URL language via determine_locale.
Admin post-list language filtering and an untranslated-coverage report on the Tools screen, alongside rewrite flush, relationship/orphan checks and settings export/import.
Markdown Renderer for GitHub cooperation: WakaLang owns the site-wide language spine and suppresses GFMR’s own switcher via its gfmr_language_switcher_enabled hook, avoiding a duplicate switcher.
Extension API surface for add-ons (the wakalang_loaded action and the add-on registry) plus free-edition licensing stubs and a feature gate.
Plugin bootstrap, activation/deactivation, uninstall handling, a privacy-policy suggestion, and full internationalization (bundled .pot + Japanese .po/.mo and block-editor JS translations).