Multilingual SEO in nopCommerce: URLs, meta tags, hreflang
nopCommerce gives every language its own URL and its own meta fields, but it does not output hreflang tags. Search engines treat each language as a separate site, so all three layers below need attention: URLs, meta tags and hreflang.
URLs
Turn on SEO friendly URLs with multiple languages enabled in the Localization settings and restart the application (documentation). Each language then gets a prefix built from its Unique SEO code, such as /en/ or /fr/. Without this setting all languages share one URL, and search engines see only one version of each page.
Pages opened without a prefix are redirected to the prefixed URL with a temporary (302) redirect, so internal links and the sitemap should be updated.
Each language can also have its own page name in the URL (the Search engine friendly page name). If it is left empty, the default-language name is used. The simplest approach is to keep the same name in all languages and translate it only for categories and top products.
Meta tags
Titles and descriptions are what searchers read before clicking, and nopCommerce stores them per language:
- Home page title and description: set per language on the store.
- Meta title and meta description: set on the language tabs of every product, category, manufacturer, topic and blog post.
A field left empty in one language normally falls back to the default language, so the French page shows English text. Descriptions should stay within about 160 characters after translation.
The built-in Pretranslate feature in 4.90 covers products, categories and manufacturers. It also translates the Search engine friendly page name, but no other SEO fields, so meta title, meta description and meta keywords still have to be translated separately.
hreflang and canonical
hreflang tells search engines which pages are the same content in different languages. nopCommerce 4.90 writes a canonical link in the page header but no hreflang tags, so they have to be added with a plugin or by a developer in the theme header.
The rules are simple. Every page lists all its language versions, including itself, plus one x-default. Every listed page links back. Each language page uses itself as its canonical URL. With identical page names across languages this is easy to generate. With translated page names, each page's address in every language has to be looked up.
Checklist
- Each language has the correct Language culture and a unique Unique SEO code
- Language URLs are enabled, the application was restarted, and internal links and the sitemap use the prefixed URLs
- Home page title and description are translated in every language, with no placeholder text such as "Your store. Home page title"
- Meta title and description are filled in every language for categories, top products and topic pages
- Descriptions fit in about 160 characters after translation
- Names in non-Latin scripts (Greek, Cyrillic, Arabic) produce proper page names, not empty ones
- Enable canonical URLs is on, and each language page points to itself
- Every page has hreflang tags that link back to each other, with no links to pages that do not exist
- A changed page name redirects the old address with a 301
Missing translations are the slow part of this list. EasyTranslate shows what is still empty in each language and fills it with Google, Azure or DeepSeek, including the meta fields that the built-in Pretranslate leaves out. Every translation can be reviewed before saving.
Sources
SEO settings, Localization, nopCommerce 4.90.0 source: page header, language redirect, home page view, and the forum thread on adding hreflang.