Skip to main content

A client asks for "the site in French too", and the first search turns up language packs, a language filter, associations, switchers and translation extensions, each explained as if the others did not exist. You have built Joomla sites in one language for years, and none of it says where to begin.

Begin by splitting the work in two. The first job is telling Joomla which languages the site speaks: it is built in, and it is the same on every site. The second is putting translated words on each page, and for that there are two models: a copy of each item per language, linked by associations, or one item with its fields translated in place. Pick the model by what the site's content is made of, not by habit, because changing it later means doing the translations again.

Job one: telling Joomla which languages the site speaks

Language packs and content languages are different things

A language pack translates Joomla's own interface: the labels, buttons and messages that come with Joomla, and with an extension that ships its own files for that language. You install packs under System → Install → Languages.

A content language is a language the site's content comes in, with the short code that goes in its addresses (/fr/) and the flag the switcher shows. You manage them under System → Manage → Content Languages. A multilingual site needs both: Joomla offers visitors a content language only when its language pack is installed for the site too.

The language filter

The System - Language Filter plugin is what makes a site multilingual for visitors. Once it is on, every address carries its language code, each language's pages show the content set to that language and the content set to All, and the plugin decides which language a first-time visitor gets. Its options, as the plugin names them:

  • Language Selection for new Visitors: the site's default language, or the language of the visitor's browser.
  • Remove URL Language Code: takes the code out of the default language's addresses, so /en/rooms becomes /rooms while French stays /fr/chambres.
  • Item Associations: switches Joomla's associations on or off.
  • Add Alternate Meta Tags, Add x-default Meta Tag and x-default Language: the links that tell search engines about a page's other languages, covered below.

Decide two of them before the site goes live: Remove URL Language Code, because it changes every address in the default language, and Language Selection for new Visitors, because it decides what most first-time visitors see.

Home pages, the switcher and the status module

In Joomla's own model each content language has a home page of its own: a home menu item set to that language, usually in a menu of its own. The Language Switcher module lists the content languages and links each one to the same page in that language when there is one, or to that language's home page when there is not, and it leaves out a language that has no home page.

The Multilingual Status module in the administrator's header checks the set-up and says what is missing, such as a language without a published home page. On a site with no content yet, the Multilingual Sample Data on the Home Dashboard does the whole set-up: it enables the filter, publishes the switcher and the content languages, and builds a menu, a home page and associated sample articles for each language.

With Speedy Translate: on a site that already has its content, the dashboard opens on a setup check that does the same steps one click each. It installs and publishes the languages, downloading the packs from Joomla's language server, turns on the language filter and its hreflang links, and publishes a language switcher. How to configure Speedy Translate walks through it.

Job two: two ways to translate the content

One item per language, linked by associations. This is Joomla's own model, and the one its sample data builds. The French article is a separate article, set to French, with its own title, text, alias and category, and an association tells Joomla that it and the English article are the same page. Menu items, categories, contacts and news feeds work the same way, and from Joomla 6.1 site modules can be associated too. The Multilingual Associations component lets you edit an item and its translation side by side.

One item, translated in place. The article stays one article, set to All. Its French title, text and alias are stored beside it, and the French pages show them in place of the English. A field left untranslated shows the original. Joomla has no such model of its own: a translation extension provides it.

The two ways to translate a Joomla site, side by side
Associations Translated in place
What you edit A separate item for each language One item, with a tab per language under each field
Adding a language A new copy of every page, menu item and module, each associated with the others A new tab on every item; until it is filled, the page shows the original
Menus A menu per language, each with its own home page, the items associated One menu, each item's title and alias translated
Modules A copy per language, each set to its language One module, its title, text and options translated
Custom fields Each copy holds its own values; a field's label is one text for every language unless it is a language key The labels and each item's values translated in the same tabs
An extension's own data Only where the extension supports associations Wherever the translation extension knows the extension's tables
A page in one language only Make it in that language and give it no copies Set the item to that language instead of All
Knowing a translation is behind Nothing tells you; you compare the copies A translation is marked outdated when its original changes
Deleting an item The other languages' copies stay, to be deleted one by one Its translations go with it
What it needs Joomla alone A translation extension

Neither column wins every row. Associations give each language complete freedom, at the price of keeping several copies of everything in step by hand. Translating in place keeps one structure for every language and tells you what is out of date, at the price of an extension, and of a site whose languages share that one structure.

With Speedy Translate: it works in either model, from the same language tabs under the fields of Joomla's own edit forms. Its Multilingual mode option chooses. Speedy, the recommended mode, translates in place; Joomla! Multilingual Associations makes the copies and associates them for you as you fill in the tabs. Bulk translation, XLIFF and the coverage figures, all three in Pro, work only in the Speedy mode. So choosing a model is not choosing a tool, but it is choosing how the translations are stored, and that is what to settle before the first translation is saved. The multilingual modes of the translation guide compare the two.

Which model fits which site

Associations are enough when:

  • the site is small, with two languages and one editor, and its content is articles and menus;
  • the structure differs from one language to the next: a different menu for each market, or pages that exist for one country only;
  • you would rather add nothing to the site that Joomla does not ship.

Translating in place fits when:

  • the content that matters lives in an extension's own tables: a shop's products, a booking site's rooms, a directory's listings;
  • the site has many modules and menus, which associations would multiply by the number of languages;
  • someone needs to see which translations have fallen behind their original;
  • the site has more than two or three languages, or will add them over time.

With Solidres: a booking site is the clearest case for the second list. The property, its rooms, the extras, the rate plans and the facilities are the booking extension's own data, and Speedy Translate Lite translates them in the same tabs as an article. A booking site in the guest's language follows a whole booking site through, from the booking engine's own words to the confirmation email.

Addresses and search engines

Each language needs addresses of its own, so that a search engine can show the French page to someone searching in French: the language code, and ideally an alias in the language, /fr/voyages/paris-au-printemps rather than /fr/travel/paris-in-spring. Then each page should name its other languages in its <head>, where visitors never see them:

<link href="https://example.com/fr/voyages/paris-au-printemps" rel="alternate" hreflang="fr-FR">
<link href="https://example.com/travel/paris-in-spring" rel="alternate" hreflang="en-GB">
<link href="https://example.com/travel/paris-in-spring" rel="alternate" hreflang="x-default">

These are the hreflang links. They tell a search engine which page to show to whom; they do not make a page rank. The x-default link names the page for visitors whose language the site does not have. In the language filter, Add Alternate Meta Tags turns them on, and the two x-default options choose that page.

Joomla writes them on two kinds of page: the home pages, which link each other, and pages that have associations, which link their associated pages. A page without associations gets none, and a language without a home page of its own is left out. So in Joomla's model the links are only as complete as the associations: a French copy that was never associated with its English original is, as far as a search engine can tell, a different page.

With Speedy Translate: in the Speedy mode it writes the links itself, on every page, whether or not the switcher is on it, in place of the language filter's, which would find no associations to follow. It still follows the filter's Add Alternate Meta Tags and x-default settings, and the setup check offers to turn the links on when the filter is on without them. Each link is the page's address in that language, made from the aliases typed in each language's alias tab, and a menu item's address is its own translated alias after its parents', the way Joomla reads an address. The language switcher, SEO and Smart Search guide has the details.

What neither model does for you

  • The extensions' own words. The buttons and messages an extension shows come from its language packs, whichever model you choose. A word that does not suit the site is changed with a language override, under System → Manage → Language Overrides, and the override survives updates. With Speedy Translate: Lite searches and overrides language strings from its own screen, and Pro adds translation in context, by clicking a string on the site. See Language strings in Speedy Translate.
  • Machine translation is a draft. Someone who reads the language checks it before it goes live, and a person checks legal pages, prices and anything with a number in it. With Speedy Translate: nothing is sent to a provider until you press Translate in a language tab, and the account is your own: Google, DeepL or Yandex in Lite, with ChatGPT, Claude and Gemini added in Pro, each billed by the provider at its own price. See Machine translation in Speedy Translate.
  • Words inside images and files. Neither model translates the text in a picture or in an uploaded PDF. Both let you choose a different image or file for each language, but someone has to make it.
  • Keeping up. Every language is one more copy of the site's words to keep current. Two well-kept languages serve visitors better than five stale ones.

And if every visitor reads the same language, none of this is needed: the afternoon is better spent on the content itself.

Where to start

Choose the model first: associations for a small site whose languages differ in shape, translation in place for a site whose content lives in extensions or whose languages should stay in step. Then set up the languages, the filter and the switcher, by hand or with the setup check in How to configure Speedy Translate. Speedy Translate Lite works in either model, translates Joomla's own content and Solidres, and is free, with no backlink and no limit on languages.

All the things you need to make your work easier. Did you like Solidres?