This expanded troubleshooting section covers the most commonly reported issues, their typical causes, and step-by-step solutions. Work through the relevant section before contacting support — most issues can be resolved in a few minutes.
Tooltip Help Opens the Homepage Instead of the Article
Symptoms: Clicking the small? help icon in Lang Forge admin opens the Lang Forge landing page or docs homepage instead of the specific article for that setting.
Fix: Update Lang Forge to the current build. Admin help links now route to exact User Guide or Developer Guide section URLs. If a cached admin page still has the old link, hard-refresh the page once.
Forge Suite Deactivate on a Clone Affects Another Site
Symptoms: You cloned or restored a WordPress site, then clicked Forge Suite > Deactivate on the clone. Another site using the same license appeared to lose PRO or Connect state. Cause: Older builds trusted the Freemius install id stored infs_accounts. A cloned database can carry the original site’s install id and URL, so even an install-scoped Freemius deactivation can target the original remote install.
Fix: Update Lang Forge to the latest build. Forge Suite now compares the stored Freemius site URL with the current WordPress site_url() / home_url() before any remote deactivation. If the state belongs to another site, it skips the remote Freemius call and only clears local license state for the current WordPress install. Reconnect the clone through Lang Forge > License > Connect to Avakode when you want it to be licensed again.
Standalone License Activates the Wrong Forge Plugins
Symptoms: You paste a single-plugin license key into Forge Suite > License and more than that plugin appears to become PRO, or a Bundle key shows an incorrect activation counter. Fix: Update Lang Forge and the other Forge Suite plugins together. Current shared dashboard builds verify the pasted key with Avakode before calling Freemius activation: a Bundle key activates all installed Forge plugins and reports the full installed-plugin count, while a standalone key activates only the matching plugin. If the key belongs to a plugin that is already PRO or is not installed on the site, the dashboard shows that no matching activation target is available instead of trying the key against every plugin. License/account buttons should open the Avakode dashboard license page instead of plugin-local Freemius account screens, so a stale or wrong local account page cannot imply ownership of another plugin.Free Trial Shows Active but PRO Features Stay Locked
Symptoms: The Forge Suite header says the 14-day trial is active, but Lang Forge PRO screens such as Visual Editor, Translation Memory, Analytics, or AI actions still show a lock/upgrade state. On another plugin, clicking Start free trial may show a generic internal server error even though a trial already exists for the site. Fix: Update all active Forge Suite plugins together. Current builds store the Avakode trial token with both expiry fields, treat a non-expired Worker trial token as plantrial, and unlock the same PRO feature gates used by paid Pro while the trial is valid. The shared credits chip now shows remaining trial credits and days left. If the Worker reports that a trial already exists, the plugin returns a clear already-started state instead of a generic 500.
Free Install Looks PRO After Removing the PRO Add-on
Symptoms: Only the Free Lang Forge plugin is active, but the License page, sidebar, or AI buttons look as if PRO is still connected. This can happen after testing a PRO build on the same database because Freemius and Forge Suite cache license state. What should happen now: A Free-only install stays Free even if oldfs_accounts, langforge_license_data, or forge_license_last_pro_at values are still in the database. PRO menu entries are explicitly marked with a PRO badge and open the locked upgrade page. AI buttons stay disabled or hidden with a PRO hint; even if a browser extension or DevTools removes disabled, the AJAX handlers return “AI translation requires an active Lang Forge Pro license” and do not start the translation. The post/page metabox also hides Check Quality unless the Translation QA gate and an AI-capable Pro/trial credential are both active.
All saved languages stay active after a downgrade: Free and PRO both support an unlimited number of active languages, so the runtime switcher, routing, REST writes, and AJAX translation-link actions continue to use the full active language list whether or not a PRO license is current. Losing PRO only disables the PRO features (AI, Visual Editor, Translation Memory, Content Diff, Analytics, import/export), not languages, the Glossary, or WooCommerce translation.
Step-by-step fix:- Confirm
langforge-pro/langforge-pro.phpis not active in Plugins. - Hard-refresh Lang Forge > String Translation and the License page.
- If you are testing locally, delete
forge_e2e_planand ageforge_license_last_pro_atbeyond 24 hours to simulate expiry. Current builds treat an aged timestamp as Free under either the localFORGE_SKIP_LICENSE_REVALIDATIONbypass or FreemiusWP_FS__DEV_MODE. - If the UI still appears PRO, update both
langforgeandlangforge-proto the current builds so the Free plugin and PRO add-on share the same split-gate logic.
Credits Pricing Fails with CORS on Localhost
Symptoms: The browser console shows a CORS error forhttps://api.avakode.com/credits/pricing while testing Lang Forge from http://localhost:8888, and credit badges stay on fallback prices.
Fix: Update the PRO add-on. Current builds no longer fetch pricing from the browser directly. The credits widget posts to WordPress admin-ajax.php action forge_credits_pricing with a per-action nonce; WordPress fetches the Worker pricing table server-side and returns the normalized action costs to the page. No DEV_CORS_LOCALHOST flag is required for normal plugin admin pages.
Lang Forge Pro Update Does Not Appear in wp-admin
Symptoms:langforge-pro is active, but WordPress does not show an available PRO add-on update even though the Avakode release manifest has a newer PRO version.
Fix: Update to Lang Forge Pro 1.0.1 or newer. Current builds ask the Avakode Worker for the base product update channel (/updates/langforge?tier=pro) and receive a protected PRO package URL. Older builds used the add-on slug in the update request, which the Worker does not distribute.
Move License Banner Still Shows After a Successful Move
Symptoms: After you confirm Move license to this site in the Avakode dashboard, the target WordPress admin still shows This license is already active on another site and keeps the old Move license to this site button visible. What should happen now: The dashboard returns you to a clean Forge Suite screen that says License moved successfully. Click Connect to finish activation on this site. The old SITE_MISMATCH banner should not remain clickable after the transfer succeeds. Step-by-step fix:- Hard-refresh the WordPress admin page.
- Check the browser address bar. It should not contain
forge_connect_error,forge_connect_code, orforge_connect_move_urlafter a successful move. - A normal post-move URL contains
forge_connect_moved=1. - Click Connect to Avakode again on the target site to finish activation.
- If the old banner still appears after a hard refresh, clear the page/CDN cache and retry Connect.
String Translation Adds Extra Backslashes
Symptoms: A string value such asC:UsersTest shows as C:\Users\Test after saving, and each extra save adds more backslashes.
What should happen now: String Translation normalizes WordPress-slashed form input before sanitizing and saving. Re-saving the same value keeps it stable instead of double-escaping it.
Step-by-step fix:
- Open Lang Forge > String Translation and select the affected domain.
- Replace the over-escaped value with the intended text, for example
C:UsersTest. - Click Save Translations.
- Refresh the page and save again if needed. The value should remain unchanged.
Polylang Migration Shows the Wrong Language or Unexpected Counts
Symptoms: After migrating from Polylang, translated posts are assigned to the default language, the migration summary count looks lower than the detected count, or a language appears to have been created for a post that did not have that Polylang translation. Cause: Older builds could leave stale Lang Forge rows from a previous activation or migration run. If those rows used the default language, the status table could show every migrated item as that language even though Polylang’slanguage taxonomy and post_translations groups had the correct mapping.
What should happen now: The Polylang migration reads each post’s real Polylang language relationship and each group’s actual post_translations mapping. Re-running migration cleans the Lang Forge rows for those posts first, then writes only the real Polylang languages. If a Polylang group has az, ru, and en but no uz, Lang Forge keeps that group without uz instead of creating a fake missing translation.
Step-by-step fix:
- Update Lang Forge to the current version.
- Run Lang Forge > Tools > Migration > Polylang again.
- Open Lang Forge > Translation Status and check that language columns match the old Polylang posts.
- For any intentionally incomplete group, leave the missing language untranslated or create it manually from the source post.
LearnDash Topic Is Missing Its Course or Lesson After Translation
Symptoms: A translated LearnDash topic opens, but LearnDash does not attach it to the translated course or lesson even though the serialized_sfwd-topic settings look correct.
What should happen now: Lang Forge validates both conditions after creating a LearnDash translation: old source-language IDs must be gone, and required top-level relationship meta such as course_id and lesson_id must exist on the translated post.
Step-by-step fix:
- Update Lang Forge to the current version.
- Open the affected translated topic and click Update.
- If you are translating a whole course, translate or update the parent course and lesson first, then update the topic so Lang Forge can resolve target-language siblings.
- Reopen the topic in LearnDash. It should now be attached to the translated course and lesson.
LearnDash Course Editor Shows Duplicate or Missing Language Box
Symptoms: On a LearnDash Course edit screen, the Course page tab shows two Lang Forge Language boxes, while Dashboard, Builder, Extend Access, or Settings show no Language box in the sidebar. Cause: LearnDash hides generic WordPress sidebar postboxes on non-Page course tabs. Older Lang Forge builds worked around that by rendering a second inline Language box above the editor, which made the Course page tab show duplicates. What should happen now: The Course editor shows exactly one Language metabox, in the standard right sidebar, on every LearnDash Course tab. Lang Forge no longer renders the extra inline Course Page copy. The translations list in that sidebar uses compact language labels such asEn, Ru, and O'zb while preserving the full language name in the hover/accessible label, so long locale names and localized action buttons do not overflow the box.
Step-by-step fix:
- Update Lang Forge to the current version.
- Open a LearnDash Course edit screen.
- Switch between Course page, Dashboard, Builder, Extend Access, and Settings.
- Confirm the right sidebar contains one Language metabox on each tab.
404 Errors on Translated Pages
Symptoms: Clicking a link to a translated page (likeyoursite.com/es/about/) shows a “Page Not Found” error. The original language version of the page works fine.
Common causes:
- WordPress permalink rewrite rules are stale and do not include Lang Forge’s language routes.
- A server configuration issue prevents URL rewriting from working.
- The translated page URL slug was changed manually and no longer matches.
- Go to Settings > Permalinks in your WordPress admin
- Do not change any settings. Simply click Save Changes to force WordPress to regenerate its rewrite rules
- Visit the translated page again in an incognito browser window
- If the issue persists, check your web server configuration. Apache servers need
mod_rewriteenabled and an.htaccessfile in the WordPress root. Nginx servers need atry_filesdirective in their configuration - If you are on shared hosting and cannot access server configuration, contact your hosting provider and ask them to confirm that URL rewriting is enabled for your site
- As a last resort, switch to the Parameter URL format temporarily (Lang Forge > Settings > URL Settings). If Parameter format works but Directory does not, the issue is definitely a server-side rewrite configuration problem
Wrong Language Displayed on a Page
Symptoms: A visitor navigates to a translated URL but sees content in the wrong language. For example, visiting/fr/about/ shows English content instead of French.
Common causes:
- The translation post exists but is not properly linked to the original in the translation group.
- A caching plugin or CDN is serving a stale cached version of the page.
- The translation post’s language metadata was accidentally changed.
- Open the original post in the WordPress editor
- Check the Language & Translations metabox in the sidebar. Verify that the correct translation is listed for the affected language
- If the translation is not linked, click Link Existing and search for the translation post to reconnect them
- Open the translation post itself and verify that its language is set correctly in the Language & Translations metabox
- Clear all caches: go to your caching plugin’s settings and purge the entire cache. If you use a CDN, purge the CDN cache as well
- Test in an incognito browser window to eliminate browser-side caching
Translated Page Content Is Correct but SEO Title or Canonical Uses the Source Page
Symptoms: A translated page opens at the right language URL and the visible page content is translated, but the browser title, meta description, Open Graph tags, or canonical URL still come from the source-language page. This is most likely on manually translated pages that intentionally reuse the same slug as the original. Why it happens: WordPress can resolve a same-slug translated URL to the correct post in The Loop while still keeping the source post as the queried object. SEO plugins and canonical generators usually read from the queried object, so metadata can lag behind the actual rendered translation. What the current version does: Lang Forge normalizes the main singular query after WordPress resolves the translated post. The queried object, queried object ID, global post, and first loop post are aligned to the translated post before SEO metadata is generated. If you still see it after upgrading:- Flush permalinks once: Settings > Permalinks, click Save Changes
- Clear object/page/CDN caches
- Confirm the translated post has the expected
_lf_languagevalue and is linked to the source post in the Language & Translations metabox - If another plugin overrides
WP_Querylate in the request, temporarily deactivate it to isolate the conflict
Translation Not Appearing for Visitors
Symptoms: You created a translation and can see it in the admin, but visitors do not see a language switcher option for that language, or clicking the language in the switcher does not show the translated content. Common causes:- The translation post is still in Draft or Pending status.
- The language was removed from the Active Languages list.
- The translation is not linked to the original post.
- Open the translation post and check its publication status in the Publish panel. Change it to Published if it is set to Draft or Pending
- Go to Lang Forge > Languages and confirm the target language is in the Active Languages list. If it is missing, add it back
- Open the original post and check the Language & Translations metabox. Verify the translation appears as a linked item. If it does not, use Link Existing to reconnect
- Clear all caches (caching plugin, CDN, browser)
- Visit the page in an incognito window and check whether the language switcher now includes the expected language
AI Quality Check Issues
Symptoms: The QA Check button returns a score but no issues, or you clicked “Apply fix” and are unsure whether it worked. What to expect:- A score of 90+ with an empty issue list means the AI found no concrete problems worth flagging. Your translation is probably publish-ready.
- When you click “Apply fix” on an issue, the corresponding segment in the right panel updates instantly and the Save indicator shows unsaved changes. Review the new text and click Save.
- If the flagged segment lives in a field that is not shown in the Visual Editor (for example, the post excerpt when you are editing the main content), the fix still applies to the post on the server and a “Reload editor” link appears. Click it to refresh the editor and see the updated field.
- If Check Quality is missing from a post/page translation metabox, the site is Free, the Pro add-on is not active, the Translation QA feature is locked, or the AI credential/trial token is not connected. This is intentional; the button should not appear and then fail with an AI-not-configured error.
- Check your browser console for JavaScript errors — an ad-blocker or security extension may be interfering with the AJAX request
- Make sure your AI credit balance is not zero — each fix consumes credits and an empty balance silently skips the operation
- Reload the Visual Editor and run QA Check again. If the same issue reappears with the same suggestion, try editing the segment manually instead
AI Translation Failures
Symptoms: Clicking the AI Translate button results in an error message, a spinning indicator that never completes, or a partial translation. Common causes:- The server cannot make outgoing HTTPS requests to the Forge API.
- The PRO license has expired or is not activated.
- AI credits are exhausted.
- A PHP timeout occurs during translation of very long content.
- Go to Lang Forge > License and verify your license status is Active and your credit balance is above zero
- If the license shows as Inactive, click Connect to Avakode (or Reconnect) to re-sync — there is no key-entry field
- If credits are at zero, purchase an add-on credit pack — credits never reset automatically (there is no monthly allowance), so buying a pack is the only way to top up
- Test outgoing connections: go to Lang Forge > Tools > System Check. This page runs a connectivity test to the Forge API and reports the result. If it fails, contact your hosting provider and ask them to allow outgoing HTTPS connections to
api.forgesuite.io - For very long posts (5,000+ words), the AI translation may time out on hosts with a low PHP execution time limit. Ask your hosting provider to increase the
max_execution_timePHP setting to at least 120 seconds, or translate the post section by section using the Visual Editor’s per-segment AI Translate button
Domain URL mode doesn’t resolve a language
Symptoms: You picked the Domain URL format but every URL loads as the default language, or Lang Forge ignores the domain entirely. Cause: Thelf_domain_map option is empty. Before the LF-102 fix the UI had no way to fill it, so Domain mode was effectively dead.
Fix:
- Go to Lang Forge → Settings → URL Settings.
- Pick the Domain option — a Per-language Domains block appears with one input per active language.
- Fill in the host (no
https://, no trailing slash) for each language, for example:
ru → example.com
– en → example.en
- Save settings. In the database
lf_domain_mapnow contains the mapping. - Make sure those domains actually point at the same WordPress install (A-records / CNAMEs in DNS). Lang Forge uses the
HTTP_HOSTof the request to pick the language, so the wrong DNS will break language detection silently.
One-Click Site Duplication progress bar stuck at “29 / 10”
Symptoms: You ran Site Duplication + AI Translate in Background mode. The progress bar shows a small denominator (e.g.29 / 10) or the numerator is larger than the denominator.
Cause and fix (v1.0.x+): This happened when 10 new jobs were added to a queue that already contained 29 completed jobs from a previous run — the UI rendered r.data.total (scheduled-now = 10) as the denominator and then only updated the numerator from polling.
Fixed in LF-100. On newer builds the denominator updates from each forge_queue_status poll response. If the issue still reproduces, hard-reload the Settings page (Shift-F5) to make sure you’re running the latest JS.
String Translation “AI Translate All” only translated some rows
Symptoms: You clicked AI Translate All on String Translation with a domain selected, AI completed, but only 25 strings (one visible page) got translations. Cause and fix (v1.0.x+): The old implementation iterated only the currently visible page of the paginated table, so it capped the translation atper_page.
Fixed in LF-104. The new behaviour runs the whole job server-side, writes directly to the database, and reloads the page on completion — no manual Save, no per-page cap. If you see the old behaviour, hard-reload to pick up the new JS.
String Translation “AI Translate All” button is visible but disabled
Symptoms: You picked a domain on the String Translation page, but AI Translate All is disabled and a hint appears next to it. Cause and fix (v1.0.1+): The button now stays visible even when AI translation is unavailable, so you get an explicit reason instead of the control disappearing. There are only two valid causes:- No specific Domain is selected in the filter yet.
- The active install does not have the Lang Forge PRO add-on with an active AI-capable license or trial.
Pick a Domain first. If the Domain is already selected, install/activate the PRO add-on and complete the Lang Forge license / Connect flow. Once the AI path is available, reload the page and the button becomes clickable. Enabling the button manually in DevTools will not bypass the server-side license check.
Language Switcher Not Showing or Showing Incorrectly
Symptoms: The language switcher does not appear on the frontend, appears but shows no language options, or shows languages that should not be visible. Common causes:- The switcher widget or shortcode was not added to the theme.
- No published translations exist for the current page.
- A theme or plugin conflict is overriding the switcher output.
- Verify the switcher is placed: check Appearance > Widgets for the Lang Forge Language Switcher widget, or search your page content for the
shortcode - If using the menu item method, go to Appearance > Menus and confirm the Lang Forge Language Switcher item is present in your menu
- Remember that the switcher only shows languages that have a published translation for the current page. Create and publish a translation to see the language option appear
- If the switcher appears in the admin bar but not on the frontend, the issue is likely with widget placement. Try adding the shortcode directly to a page’s content to test whether the switcher renders
- Check for JavaScript errors in your browser’s developer console (press F12). Some theme or plugin conflicts can cause JavaScript errors that prevent the switcher dropdown from functioning
Menu Translation Problems
Symptoms: The translated menu shows the same items as the original language menu, menu items point to original-language pages instead of translations, or the translated menu does not appear at all. Common causes:- A separate menu was not created and assigned to the language-specific menu location.
- Menu items in the translated menu were linked to the original-language pages instead of the translated pages.
- Go to Appearance > Menus and check the dropdown at the top for the list of existing menus. You should have a separate menu for each language (for example, “Main Menu,” “Main Menu – Spanish,” “Main Menu – French”)
- If a translated menu does not exist, create one: click Create a new menu, name it clearly (e.g., “Main Menu – Spanish”), and add the translated pages to it
- Assign the new menu to the correct language-specific menu location. Scroll to Menu Settings at the bottom and check the box for the appropriate location (e.g., “Primary Menu – Spanish”)
- Verify that each menu item points to the translated page, not the original. Edit the menu item and check the URL or linked page
- Save the menu and test on the frontend by switching to the target language
WooCommerce Translation Issues
Symptoms: Product pages are not translated, the cart shows original-language product names after switching languages, or checkout labels remain in the default language. Common causes:- WooCommerce Products are not enabled as a translatable content type.
- WooCommerce string translations are missing.
- The WooCommerce core pages (Shop, Cart, Checkout) do not have linked translations.
- WooCommerce was activated after Lang Forge and the old request did not register WooCommerce-specific translation hooks yet.
- Go to Lang Forge > Settings and scroll to Translatable Content. Make sure “Products” is checked. Save if you made changes
- Check that translations exist for the WooCommerce core pages: go to Pages > All Pages and look for the Shop, Cart, Checkout, and My Account pages. Each should have linked translations
- Translate WooCommerce strings: go to Lang Forge > String Translation, filter by Source “WooCommerce,” and translate all key strings (or use AI Translate All on PRO)
- For product categories and attributes, go to Products > Categories and Products > Attributes and create translations for each term
- If SKU, price, or product type did not copy to a new product translation, reload wp-admin once after activating WooCommerce and confirm Products is checked in Translatable Content. Current versions retry WooCommerce hook registration when WooCommerce becomes available and force-include the
productpost type, so newly created translations copy product meta and product type terms. - Clear all caches and test the store in an incognito window
- If the store uses paid WooCommerce extensions (Subscriptions, Bookings, custom checkout fields, payment-provider emails, shipping calculators), verify those flows manually; they are extension-specific compatibility scope.
WooCommerce Products List — Language Column Breaks Layout
Symptoms: On WooCommerce > Products, the Language column adds a horizontal scrollbar to the whole products table, row heights inflate to 200+ pixels, or the Language pills stack vertically one per row. Why it happens: WooCommerce’s product list usestable-layout: fixed and gives every core column an explicit width. When you have 6+ active languages and the Language column did not specify its own width, the browser collapsed the column to zero and wrapped every translation pill onto its own line. A historical fix that forced width: 140px solved the stacking but pushed the overall table past the viewport on a typical 1280–1400 pixel laptop — hence the horizontal scroll.
What the current version does: The Language column is scoped to 92 pixels on the product screen specifically (Posts and Pages keep the previous sizing). Pills on the product screen use a compact 18-pixel height with a smaller font. The dashed “+create” placeholder pills are hidden on the product list only — existing-translation pills stay visible as the at-a-glance cue, and admins still create translations from the post-edit metabox.
If you still see issues:
- Hard-refresh the products page (Cmd+Shift+R or Ctrl+F5) to bypass cached CSS
- Confirm you are on the latest Lang Forge — the compact layout shipped in 2026-04
- If you run a custom admin theme that forces
td { white-space: normal; }globally, the compact pills may still wrap. Add.post-type-product .lf-lang-cell { white-space: nowrap; }to your admin stylesheet
Translated Product URL Redirects to the Default Language
Symptoms: A WooCommerce product has both RU and EN translations with the same slug (for example,product-4). Visiting /en/products/product-4/ returns HTTP 301 to /products/product-4/ and shows the default-language product.
Why it happens: WordPress issues a “canonical redirect” after it resolves a post, trying to send the visitor to the canonical URL computed from the post’s permalink. If another plugin registers a permalink filter that ignores Lang Forge’s language context (WooCommerce’s own woocommerce_product_get_permalink is a common source), the canonical URL loses the /lang/ prefix, and WordPress happily 301s the visitor away from the language they asked for.
What the current version does: Lang Forge’s prevent_language_root_redirect now inspects the canonical URL before letting it through. If the canonical still carries /lang/, the redirect is allowed (legitimate slug-change redirects still work). If the canonical dropped the language prefix, the redirect is cancelled. Legitimate WordPress slug-change redirects on non-translated URLs are unaffected.
If you still see it after upgrading:
- Flush permalinks once: Settings > Permalinks, click Save Changes (no changes required)
- Clear every cache layer: object cache, page cache, CDN, browser
- Confirm both products share the same
translation_groupand that each has the correct_lf_languagemeta — a missing_lf_languageon one side leaves the pair half-linked - Check that no other plugin is registering its own
redirect_canonicalfilter with higher priority — WPML compatibility mode is the most common culprit
WooCommerce /product/slug/ URLs Redirect to the Homepage
Symptoms: Visiting a product URL such as /product/organic-green-tea-collection/ redirects to the site homepage, while /products/organic-green-tea-collection/ works.
Why it happens: Some sites and public WooCommerce examples use the singular /product/ base, while a test site or theme may register the product post type with /products/. WordPress then treats /product/... as a generic page path (pagename=product/...), fails to find a page, and Lang Forge’s missing-translation fallback can send the visitor to the language homepage.
What the current version does: Lang Forge registers a narrow WooCommerce-compatible /product/ alias for the product post type when the active rewrite slug differs. The alias resolves product content directly and keeps language-prefixed product routes ahead of the generic page catch-all.
If you still see it after upgrading:
- Flush permalinks once: Settings > Permalinks, click Save Changes
- Confirm the
productpost type is public and has rewrite rules enabled - Check that the product itself is published and has the expected
_lf_languagemeta
LearnDash Translations Lose Parent Course or Lesson Links
Symptoms: After translating a LearnDash Lesson, Topic, or Quiz, the translated entity is no longer attached to its parent course or lesson. LearnDash’s breadcrumbs show the untranslated parent, or the course progress bar breaks on the translated side. Why it happens: LearnDash stores the parent-child relationship in a set of top-level post meta keys (course_id, lesson_id, quiz_id, topic_id) that do not carry the usual _sfwd- or ld_ prefix. Older copy routines filtered meta keys by prefix and silently skipped these four — translated lessons ended up pointing to the original-language course, or to NULL when the meta was not present on the translation.
What the current version does: On every new translation creation, Lang Forge copies those four meta keys and remaps each ID through the translation table — so EN Lesson’s course_id points to the EN Course, not the RU original. Two more safeguards were added:
- Back-fill on the source side: if the original post is missing
_lf_languagemeta (LearnDash’s AJAX builder sometimes creates posts through save paths that skip the usual hook), Lang Forge reads the language from its own translation table and restores the meta - Sibling back-fill: if you translated a Lesson before its parent Course, the Lesson’s
course_idtemporarily points to the RU course. When you later translate the Course, Lang Forge scans target-language entities that still reference the source course and re-points them to the new translation
auth_callbacks on its CPTs through register_post_meta, and a sufficiently strict callback can silently no-op an update_post_meta() call coming from a hook context. Lang Forge v1.0.10+ writes the relationship keys via direct $wpdb insert/update after the standard update_post_meta call, so the auth filter chain can no longer block the write. A defense-in-depth save_post listener at priority 99999 also re-asserts the values once after the create — if a third-party plugin clobbers them on its own save_post hook, our listener rewrites them back via direct DB write. No action required from the editor; the next translation create automatically benefits.
WPML Migration Did Not Carry the “Hide Default Language” Setting
Symptoms: Before the migration, WPML’s URL Format was set to “Use directory for languages” with the “Use directory for default language” checkbox off — so URLs on the default language were at/ (no /en/ prefix). After migrating to Lang Forge, the default language suddenly has the prefix again: every old link to /about/ now 404s or redirects to /en/about/.
Why it happens: Lang Forge’s original WPML migration read default_language and active_languages from icl_sitepress_settings but did not read the URL-format ancillary keys. The admin’s “Hide default language in URL” checkbox stayed at its Lang Forge default (off), overriding the migration.
What the current version does: Migration now reads two extra keys from icl_sitepress_settings:
language_negotiation_type→ mapped tolf_url_format(1=directory, 2=subdomain, 3=parameter)urls.directory_for_default_language→ inverted intolf_hide_default_language(WPML’s “use directory for default = off” maps to Lang Forge’s “hide default = on”). Legacy WPML versions usingurls.show_on_rootare also supported
Elementor and Divi Content Not Translating
Symptoms: When you create a translation of a page built with Elementor or Divi, the translated post opens in the page builder with the original text. Editing and saving the translated text works in the admin but does not appear correctly on the frontend. Common causes:- The page builder’s internal data structure was not fully copied during translation creation.
- A caching layer within the page builder is serving stale content.
- For Elementor pages edited through Lang Forge’s Visual Editor, Lang Forge now clears Elementor’s per-post rendered element cache whenever widget text is saved, so the frontend should show the updated translated widgets immediately.
- Open the translation post in the page builder (Elementor or Divi)
- Verify that the page structure (sections, rows, columns) matches the original. If the layout is missing, delete the translation draft and create a new one using the Create Translation button in the Language & Translations metabox — this ensures the page builder data is properly copied
- Edit the text in each widget or module. Make sure you edit within the page builder interface, not in the WordPress text editor
- Save and publish from within the page builder
- Clear all site-level caches. Elementor’s per-post rendered element cache is cleared automatically when Lang Forge updates translated widget text; if styling still looks stale, use Elementor’s Regenerate CSS option under Elementor > Tools. Divi has a Clear Static CSS File Generation option under Divi > Theme Options > Builder > Advanced
- Test on the frontend in an incognito browser window
SEO Hreflang Tag Issues
Symptoms: Google Search Console reports hreflang errors, such as missing return links, conflicting hreflang values, or pages without hreflang annotations. Common causes:- Some translations are in Draft status and are excluded from hreflang output.
- Translation links between posts are broken or incomplete.
- Another SEO plugin is outputting conflicting hreflang tags.
- View the page source of the affected page (right-click, View Page Source) and search for “hreflang” to see what tags Lang Forge is generating
- Verify that all translations of the page are Published — draft translations are intentionally excluded from hreflang
- Check that every translation has a return link. Open each translation and verify it is linked back to the original and to all sibling translations in the Language & Translations metabox
- If you use Yoast SEO or another SEO plugin that also generates hreflang, check whether duplicate tags appear. Lang Forge integrates with Yoast to prevent duplicates, but less common SEO plugins might produce conflicts. Disable the hreflang feature in the other plugin if it conflicts
- Submit the hreflang sitemap (
/sitemap-hreflang.xml) to Google Search Console and wait for the next crawl cycle to see updated validation results
Performance Problems on Multilingual Sites
Symptoms: Pages load slowly after adding Lang Forge, the admin dashboard is sluggish, or the database grows significantly. Common causes:- Object caching is not enabled, causing repeated database queries.
- An extremely large number of translations (tens of thousands of posts) without database optimization.
- A conflict with another plugin that runs heavy queries on every page load.
- Install an object cache plugin (Redis Object Cache or Memcached) if your hosting supports it. Object caching eliminates repeated database queries for language detection and translation mapping
- Go to Lang Forge > Tools > System Check and review the performance section. It reports the number of translation pairs, database table sizes, and query counts per request
- If you have more than 10,000 translated posts, run the database optimization tool at Lang Forge > Tools > Optimize Database. This rebuilds indexes and removes orphaned translation metadata
- Use the Query Monitor plugin to identify which specific queries are slow. Look for queries from Lang Forge and report them to support if optimization does not resolve the issue
- Make sure you are running a caching plugin (WP Rocket, LiteSpeed Cache, or similar) to serve cached HTML to visitors and reduce server-side processing
Import and Export Errors
Symptoms: Importing an XLIFF or CSV file fails, shows a “parsing error,” or reports that most translations could not be matched to existing posts. Common causes:- The import file is malformed or was edited with a text editor that changed the encoding.
- The original content has changed since the export, so content fingerprints no longer match.
- The file was exported from a different site where post content differs.
- Verify the file encoding: XLIFF and CSV files must be saved as UTF-8. If you edited the file in Excel, re-save it as “CSV UTF-8” from the Save As dialog
- For XLIFF files, validate the XML structure using an online XML validator before importing. Common issues include unclosed tags and invalid characters
- If translations are not matching, open the import preview and check the “Unmatched” tab. It shows why each unmatched entry failed — usually because the original content was modified after export. Re-export the current content, translate it, and re-import
- For large files (1,000+ entries), increase the PHP
upload_max_filesizeandpost_max_sizesettings. Ask your hosting provider for help if you cannot access PHP settings - Try importing in smaller batches by splitting the file into groups of 100 to 200 entries
Conflicts with Other Plugins
Symptoms: After activating Lang Forge, another plugin stops working correctly, shows errors, or behaves differently on translated pages. Common causes:- The other plugin uses hardcoded URLs that do not account for language prefixes.
- The other plugin registers its own URL rewrite rules that conflict with Lang Forge’s language routing.
- JavaScript from the other plugin does not handle the language parameter in AJAX requests.
- Identify the conflicting plugin by deactivating plugins one at a time and testing after each deactivation
- Once identified, check whether the conflicting plugin has a “multilingual” or “WPML compatible” setting — enable it, as Lang Forge’s WPML compatibility layer often resolves the issue
- Clear all caches after changing plugin settings
- If the conflict involves URL routing, try switching to the Parameter URL format temporarily. If the issue resolves, the conflict is specifically with URL rewriting
- Report the conflict to Lang Forge support with the names and versions of both plugins. We maintain a compatibility database and may already have a known fix or workaround
—