Meertalige koppelingen in Joomla
Je hebt je website in twee talen gebouwd. Een bezoeker leest je Engelse "Over ons"-pagina, klikt op de taalwisselaar om die in het Nederlands te lezen, en belandt op de Nederlandse startpagina in plaats van op de Nederlandse "Over ons"-pagina. Precies die kleine, irritante sprong lossen meertalige associaties op.
Een associatie is een koppeling die Joomla vertelt: dit Engelse artikel en dat Nederlandse artikel zijn dezelfde pagina in twee talen. Zodra Joomla dat weet, houdt de taalwisselaar de lezer op dezelfde inhoud, en leren zoekmachines welke pagina's vertalingen van elkaar zijn.
Associaties zijn de lijm die van losse pagina's in een enkele taal een stuk inhoud met meerdere gezichten maken.
Dit artikel begint bij de basis voor eigenaren en redacteuren, gaat daarna verder met het instelwerk voor beheerders en eindigt met de database, de PHP-API en de SEO-details voor ontwikkelaars. Het doel is eenvoudig: je associaties goed genoeg laten begrijpen om een meertalige Joomla-site te bouwen die zich correct gedraagt.
1. De basis
1.1 Wat een associatie is
Een associatie is een record dat de gelijkwaardige versies van een item over je geïnstalleerde talen groepeert. Heb je een Engels artikel, een Nederlands artikel en een Duits artikel die hetzelfde vertellen, dan bindt een associatie die drie samen tot één logische pagina.
De kerngedachte: associaties vertalen niets. Je schrijft elke vertaling nog steeds zelf, als een apart artikel in de eigen taal. De associatie legt alleen vast dat "deze bij elkaar horen", zodat de rest van Joomla op die kennis kan reageren.
Een associatie is geen vertaling. Het is een vaststelling dat twee of meer items al vertalingen van elkaar zijn.
1.2 Het probleem dat ze oplossen
Op een meertalige site moet de taalwisselaar bij elke klik één vraag beantwoorden: "Waar staat deze zelfde pagina in de andere taal?" Zonder associaties kan Joomla dat niet beantwoorden, en doet het het enige veilige: het stuurt de bezoeker naar de startpagina van die taal.
Bezoeker op /en/about-us
klikt "Nederlands"
|
v
bestaat er een associatie?
+----------------+------------------+
ja nee
| |
ga naar /nl/over-ons ga naar /nl/ (de Nederlandse startpagina)
(zelfde pagina, andere taal) (bezoeker is de weg kwijt)
1.3 Wat je kunt associëren
Standaard ondersteunt Joomla associaties voor de kerninhoudstypen. Elk wordt op dezelfde manier aan zijn equivalenten gekoppeld:
| Itemtype | Component |
|---|---|
| Artikelen | com_content |
| Categorieën | com_categories (gebruikt door inhoud, contacten, nieuwsfeeds, banners) |
| Contacten | com_contact |
| Nieuwsfeeds | com_newsfeeds |
| Menu-items | com_menus |
| Site-modules | com_modules |
Elk van deze typen registreert zich bij het meertalige framework, dus ze koppelen vertalingen allemaal op dezelfde manier. Tags en aangepaste velden worden niet geassocieerd: ze kunnen wel een taal dragen, maar Joomla groepeert ze niet tot vertaalsets. Modules zijn een bijzonder geval, behandeld in sectie 4: ze worden vooral via taaltoewijzing gestuurd, maar site-modules kunnen ook worden geassocieerd.
1.4 Drie woorden die mensen door elkaar halen
Meertalig Joomla kent drie termen die op elkaar lijken. Ze uit elkaar houden voorkomt veel verwarring:
| Term | Betekenis |
|---|---|
| Taalpakket | De vertaling van de interface (knoppen, labels). Bestanden op schijf. |
| Inhoudstaal | Een taal waarin je inhoud geschreven kan zijn (een rij in #__languages). |
| Associatie | Een koppeling die zegt dat twee inhoudsitems dezelfde pagina in verschillende talen zijn. |
Dit artikel gaat over de derde. Het gaat ervan uit dat de eerste twee al bestaan.
Naar boven2. Vereisten: een meertalige site
Associaties verschijnen en werken alleen wanneer de site is ingericht voor meerdere talen. Vier dingen moeten eerst geregeld zijn.
2.1 Installeer inhoudstalen
Installeer onder Systeem → Installeren → Talen elk taalpakket dat je nodig hebt. Maak vervolgens onder Systeem → Beheren → Inhoudstalen per taal één inhoudstaal aan en publiceer die. De inhoudstaal draagt de URL-code (de sef, zoals en of nl), de taaltag (en-GB, nl-NL) en de vlagafbeelding.
Systeem → Beheren → Inhoudstalen
├─ English (en-GB) sef: en gepubliceerd
└─ Nederlands (nl-NL) sef: nl gepubliceerd
2.2 Schakel de Taalfilter-plugin in
De systeemplugin plg_system_languagefilter is de motor van het hele meertalige systeem. Schakel die in onder Systeem → Plugins. Staat hij uit, dan is er geen taalwisselaar, geen taal-URL-prefix en nergens een tabblad Associaties.
2.3 Wijs inhoud aan een taal toe
Elk artikel, elke categorie, elk menu-item en elke module heeft een veld Taal. Om aan een associatie deel te nemen, moet een item op één specifieke taal staan, niet op de bijzondere waarde Alle.
| Taalinstelling | Gedrag |
|---|---|
Alle |
Wordt in elke taal getoond. Kan niet worden geassocieerd, en hoeft dat ook niet. |
English (en-GB) |
Wordt alleen in het Engels getoond. Kan met een Nederlands en een Duits item worden geassocieerd. |
Gebruik Alle voor dingen die in elke taal identiek zijn (een logomodule, een contact-e-mailadres). Gebruik een specifieke taal voor alles wat je daadwerkelijk vertaalt.
2.4 Zet "Itemassociaties" aan
Open de Taalfilter-plugin en controleer de parameter Itemassociaties. Zet die op Ja. Deze ene schakelaar bepaalt of de wisselaar en de hreflang-tags überhaupt associaties gebruiken:
Taalfilter-plugin
├─ Itemassociaties: Ja → wisselaar volgt associaties, hreflang-tags worden toegevoegd
└─ Itemassociaties: Nee → wisselaar springt altijd naar de startpagina
Naar boven3. Associaties maken en beheren
Je bouwt associaties op twee plekken: binnen het bewerkscherm van een item, en binnen de aparte component Meertalige associaties. Beide schrijven naar dezelfde plek.
3.1 Het tabblad Associaties
Open een associeerbaar item (bijvoorbeeld een artikel) en zoek het tabblad Associaties. Het toont één rij per andere inhoudstaal. Per taal kies je een bestaand item of maak je een nieuwe vertaling:
Artikel bewerken "Over ons" (Engels)
└─ tabblad Associaties
Nederlands (nl-NL): [ Kies of maak de Nederlandse versie ]
Deutsch (de-DE): [ Kies of maak de Duitse versie ]
Ontbreekt het tabblad Associaties, dan is aan een van de vier vereisten uit sectie 2 niet voldaan, bijna altijd de Taalfilter-plugin of het feit dat de taal van het item op Alle staat.
3.2 De component Meertalige associaties
Voor echt vertaalwerk is het tabblad traag. Het aparte hulpmiddel onder Systeem → Beheren → Meertalige associaties (de component com_associations) geeft je een editor met twee kolommen naast elkaar:
Meertalige associaties
├─ Itemtype: Artikelen
├─ Brontaal: English (en-GB)
└─ Doeltaal: Nederlands (nl-NL)
+-------------------------+ +-------------------------+
| Engels artikel | | Nederlands artikel |
| (alleen-lezen referentie)| | (hier bewerken/maken) |
+-------------------------+ +-------------------------+
Je kiest een itemtype en twee talen, klikt links op een bronitem en bewerkt of maakt rechts de tegenhanger. Dit is de snelste manier om een hele sitesectie te vertalen zonder je plek kwijt te raken.
3.3 Eén item per taal, één groep
Twee regels gelden voor elke associatiegroep:
- Een associatiegroep bevat hoogstens één item per taal. Je kunt geen twee Engelse artikelen aan elkaar koppelen.
- Een item hoort bij één associatiegroep per type. Bij het aansluiten op een nieuwe groep verlaat het de oude.
4. Menu's, startpagina's en modules
Artikelen zijn het makkelijke deel. De navigatie eromheen vraagt meer zorg, en dit is waar de meeste meertalige sites stuklopen.
4.1 Eén menu per taal
Het nette patroon is één menu per taal: een "Hoofdmenu (Engels)" en een "Hoofdmenu (Nederlands)". De items van elk menu staan op die taal. Vervolgens associeer je gelijkwaardige menu-items over de menu's heen, net als bij artikelen, op het tabblad Associaties van het menu-item.
4.2 Een startpagina per taal (verplicht)
Elke inhoudstaal moet zijn eigen standaard menu-item (zijn startpagina) hebben, ingesteld op die taal. Dit is niet optioneel. Heeft de standaardtaal geen startpagina-menu-item, dan toont de voorkant een harde fout:
Error: there is no home menu item for the default language.
Een tweetalige site heeft dus twee "Home"-menu-items, elk gemarkeerd als Standaard, elk in de eigen taal, en de twee aan elkaar geassocieerd.
4.3 Modules: eerst toegewezen via taal
Bij modules doet de waarde Taal het zware werk. Joomla publiceert alleen de modules die bij de actieve taal passen, dus in de praktijk stuur je modules door ze een taal toe te wijzen in plaats van ze te associëren. Een veelvoorkomende opzet:
| Module | Taal | Resultaat |
|---|---|---|
| Logo / bannerafbeelding | Alle |
Eén module, overal getoond |
| Welcome text (Engels) | en-GB |
Alleen op Engelse pagina's getoond |
| Welkomstekst (Nederlands) | nl-NL |
Alleen op Nederlandse pagina's getoond |
Dat gezegd hebbende: Joomla 6 ondersteunt module-associaties wél voor site-modules. Wanneer de Taalfilter actief is, toont de editor van een site-module een knop Associaties in de werkbalk, en verschijnt het type "Modules" in de component Meertalige associaties. Gebruik dit wanneer je het systeem wilt laten bijhouden welke modules vertalingen van elkaar zijn; beheerdersmodules kunnen niet worden geassocieerd.
4.4 De module Taalwisselaar
Publiceer de module Taalwisselaar (mod_languages) zodat bezoekers van taal kunnen wisselen. Zet de taal van de module zelf op Alle zodat hij op elke pagina verschijnt. Het is deze module, gecombineerd met associaties, die de ervaring uit sectie 1.2 levert.
5. De taalwisselaar en het terugvalgedrag
Het helpt om precies te weten wat de wisselaar doet wanneer een bezoeker op een andere taal klikt, want het gedrag verandert met je instellingen.
5.1 De beslissing die de wisselaar neemt
Bezoeker klikt op een andere taal
|
v
Itemassociaties = Ja ?
+-----------------+-----------------+
nee ja
| |
ga naar de startpagina bestaat er een associatie voor DIT item ?
van die taal +---------------+--------------+
ja nee
| |
ga naar het geassocieerde ga naar de startpagina
item (zelfde pagina) van die taal
5.2 Waarom een wissel op de startpagina belandt
Belandt een klik altijd op de startpagina terwijl associaties aan staan, dan heeft de huidige pagina simpelweg nog geen associatie voor de doeltaal. De oplossing is de ontbrekende vertaling maken en associëren. De wisselaar is alleen zo compleet als je associaties zijn.
5.3 Items op "Alle"
Een item waarvan de taal Alle is, verschijnt in elke taal, dus er is niets om naartoe te wisselen. De wisselaar blijft op dezelfde URL. Dat is correct gedrag, geen fout.
6. Associaties en de router
De taalwisselaar bepaalt naar welk item je gaat. De router bepaalt hoe de URL eruitziet. Dit zijn twee verschillende taken, en die scheiding zien maakt routeringsproblemen veel makkelijker op te lossen.
6.1 Twee taken, twee subsystemen
| Vraag | Beantwoord door |
|---|---|
| Waar staat deze pagina in de andere taal? | Associaties (de gedeelde key) |
| Wat is de nette URL voor die pagina? | De SEF-router + Taalfilter-plugin |
6.2 De stroom bij een taalwissel
Bezoeker op /en/about-us (artikel id 5)
|
v
associatie opzoeken → nl-NL-item is artikel id 8
|
v
router bouwt de URL voor id 8 in nl-NL
|
v
/nl/over-ons (sef-prefix "nl" komt van de inhoudstaal)
De URL-prefix /nl/ staat niet in de associatie. Hij komt van de sef-code van de inhoudstaal (sectie 2.1), die de Taalfilter-plugin aan elke voorkant-URL toevoegt. De associatie levert alleen de doel-id; de router maakt van die id het pad.
6.3 Waarom menu-associaties de routering sturen
De router bouwt een URL het liefst vanuit een menu-item, omdat het menu-item het routesegment bepaalt. Heeft een artikel geen geassocieerd menu-item in de doeltaal, dan moet de router terugvallen op een generieke route, die vaak lelijker is of op de verkeerde pagina uitkomt. Daarom doen menu-items associëren (sectie 4) er net zoveel toe als artikelen associëren: het geeft de router in elke taal een net ankerpunt.
Naar boven7. Onder de motorkap: de tabel #__associations
Alle associaties, voor elk inhoudstype, staan in één bedrieglijk kleine tabel: #__associations. De drie kolommen begrijpen verklaart de hele functie.
| Kolom | Bevat |
|---|---|
id |
De id van het geassocieerde item (voor een artikel de #__content.id). |
context |
Wat voor item het is, zoals com_content.item (zie sectie 8). |
key |
Een hash van 32 tekens die hetzelfde is voor elk item in één groep. |
7.1 De key is de lijm
Er is geen "paren"-tabel en geen links/rechts-kolommen. Items horen bij elkaar omdat ze dezelfde key-hash delen. Joomla berekent die hash wanneer je een associatie opslaat, en elk lid van de groep bewaart hem:
id context key
--- ---------------- --------------------------------
5 com_content.item 1a79a4d60de6718e8e5b326e338ae533 <- Engels artikel (id 5)
8 com_content.item 1a79a4d60de6718e8e5b326e338ae533 <- Nederlands artikel (id 8)
12 com_content.item 1a79a4d60de6718e8e5b326e338ae533 <- Duits artikel (id 12)
Om de vertalingen van artikel 5 te vinden, leest Joomla zijn key en selecteert vervolgens elke andere rij met diezelfde key en context. Drie artikelen, drie rijen, één gedeelde hash.
7.2 De primaire sleutel
De primaire sleutel is het paar (context, id), met een index op key. Die samengestelde sleutel handhaaft regel 3.3: een item komt één keer per context voor, dus het kan nooit tegelijk in twee associatiegroepen zitten.
SELECT id
FROM #__associations
WHERE context = 'com_content.item'
AND key = (
SELECT key FROM #__associations
WHERE context = 'com_content.item' AND id = 5
);
-- geeft 5, 8, 12 : de hele vertaalset
7.3 Wat hier NIET staat
De tabel bewaart alleen ids, contexten en hashes. De daadwerkelijke artikeltaal staat in #__content.language; de titel staat in #__content.title. De associatietabel is een pure index van relaties, niets meer.
8. Associatiecontexten
De kolom context is hoe één tabel tegelijk elk inhoudstype bedient. Elk associeerbaar type registreert een contextstring, en Joomla vergelijkt alleen ooit rijen die dezelfde context delen.
| Context | Itemtype |
|---|---|
com_content.item |
Artikelen |
com_categories.item |
Categorieën (alle componenten die categorieën gebruiken) |
com_contact.item |
Contacten |
com_newsfeeds.item |
Nieuwsfeeds |
com_menus.item |
Menu-items |
com_modules.item |
Site-modules |
Omdat de vergelijking tot een context beperkt blijft, botsen een artikel (id 5, com_content.item) en een menu-item (id 5, com_menus.item) nooit, ook al delen ze hetzelfde getal als id. De context houdt elk type in zijn eigen naamruimte binnen één tabel.
9. De PHP-API
Ontwikkelaars raken #__associations zelden rechtstreeks aan. Joomla biedt een kleine helperklasse plus helpers per component die kant-en-klare gegevens teruggeven.
9.1 Staat de functie eigenlijk aan?
Controleer vóór het lezen van associaties of de site ervoor is ingesteld. De controle vouwt "is de Taalfilter-plugin ingeschakeld" en "staat Itemassociaties op Ja" samen:
use Joomla\CMS\Language\Associations;
if (Associations::isEnabled()) {
// associaties zijn actief op deze site
}
9.2 Een groep lezen
De kernhelper geeft de vertalingen van één item terug, gesleuteld op taalcode:
use Joomla\CMS\Language\Associations;
$associations = Associations::getAssociations(
'com_content', // de extensie
'#__content', // de tabel van het item
'com_content.item', // de associatiecontext
$articleId // de id van het huidige item
);
// $associations is gesleuteld op taaltag:
// [ 'nl-NL' => (object) ['id' => 8, ...],
// 'de-DE' => (object) ['id' => 12, ...] ]
9.3 De voorkant-helper (kant-en-klare URL's)
Voor het bouwen van een wisselaar of een lijst "lees dit in een andere taal"-links levert elk component een helper die SEF-URL's teruggeeft, niet alleen ids:
use Joomla\Component\Content\Site\Helper\AssociationHelper;
$links = AssociationHelper::getAssociations($articleId, 'article');
// [ 'nl-NL' => 'index.php?option=com_content&view=article&id=8&lang=nl-NL',
// 'de-DE' => 'index.php?option=com_content&view=article&id=12&lang=de-DE' ]
Dit is precies wat de module Taalwisselaar onder de motorkap aanroept om van elke vlag een werkende link te maken.
Naar boven10. Associaties toevoegen aan je eigen component
Bouw je een component met vertaalbare items, dan kun je aansluiten op hetzelfde systeem. De component Meertalige associaties ontdekt ondersteuning automatisch door naar één helperklasse te zoeken.
10.1 Lever een AssociationsHelper-klasse mee
Lever een klasse genaamd AssociationsHelper in de Helper-naamruimte van de beheerderskant van je component. Die breidt de abstracte basisklasse AssociationExtensionHelper uit, die AssociationExtensionInterface al voor je implementeert. Joomla vindt hem op conventie:
namespace Joomla\Component\Example\Administrator\Helper;
use Joomla\CMS\Association\AssociationExtensionHelper;
class AssociationsHelper extends AssociationExtensionHelper
{
protected $extension = 'com_example';
protected $itemTypes = ['item'];
protected $associationsSupport = true;
public function getType($typeName = '')
{
// beschrijf het type 'item': zijn tabellen, velden en views
}
public function getAssociationsForItem($id = 0, $view = null)
{
// geef de associatiegroep voor één item terug, gesleuteld op taal
}
}
De interface zelf vereist slechts twee methoden: hasAssociationsSupport() (de basisklasse beantwoordt die vanuit $associationsSupport) en getAssociationsForItem(). De methode getType() beschrijft de tabellen en velden van je item, zodat de editor met twee kolommen ze kan tonen.
10.2 De koppelingen opslaan en bewaren
Wanneer je bewerkformulier een veld associations bevat, schrijft het framework de #__associations-rijen bij het opslaan voor je weg, met je componentnaam als contextbasis (bijvoorbeeld com_example.item). Je berekent de hash niet zelf; de tabelklasse doet dat.
10.3 Gebruik het gedrag, geen ruwe SQL
Lees associaties via Associations::getAssociations() in plaats van de tabel rechtstreeks te bevragen. De helper regelt de context, de gepubliceerde status, het toegangsniveau en de terugval naar de standaardtaal, die je met de hand allemaal makkelijk verkeerd doet.
11. Prestaties op grote sites
Een zorg op grote meertalige sites is dat al dit opzoekwerk pagina's vertraagt. In de praktijk zijn associaties een van de goedkopere onderdelen van het systeem, dankzij de manier waarop de tabel is opgebouwd.
11.1 De zoekopdracht is één geïndexeerde leesactie
De vertalingen van een item vinden is twee geïndexeerde queries, geen scan. De primaire sleutel (context, id) vindt de key van het item meteen, en de index idx_key vindt elk ander lid van de groep:
indexen van #__associations
├─ PRIMARY (context, id) → vind de key van DIT item
└─ idx_key (key) → vind de rest van de groep
Zelfs met honderdduizenden rijen raakt elke zoekopdracht alleen de paar rijen die één key delen. De kosten groeien met de omvang van één vertaalgroep (een handvol talen), niet met de omvang van de hele site.
11.2 Wat wél tijd kost
- Het renderen van elke taal-URL: het routerwerk uit sectie 6 is zwaarder dan het lezen van de associatie. Joomla cachet gebouwde routes om dit te verzachten.
- Menu's per taal: één menu per taal houdt elk menu klein, wat de menu- en routecaches efficiënt houdt.
- Veel talen: tien talen betekent tot tien rijen per groep. Dat vermenigvuldigt het aantal rijen, maar niet de zoekkosten, omdat de index nog steeds rechtstreeks naar één groep springt.
11.3 Praktisch advies
Laat de standaardindexen op hun plek, schakel Joomla's caching in, en bevraag #__associations niet in een lus. Heb je de associaties van veel items tegelijk nodig, verzamel dan eerst de ids en lees ze in zo weinig mogelijk aanroepen in plaats van één aanroep per item.
12. Webservices-API en headless
Dit is een veelgestelde vraag voor headless en ontkoppelde opzetten, en het eerlijke antwoord is dat associaties vooral een redactionele en runtime-aangelegenheid zijn.
- Er is geen apart openbaar
com_associations-REST-eindpunt in de Joomla-kern. Het scherm Meertalige associaties is een bewerkhulpmiddel aan de beheerderskant, geen data-API. - Je leest vertaalde inhoud via de normale componenteindpunten, één taal per keer, bijvoorbeeld:
curl -H "X-Joomla-Token: <token>" \
"https://example.test/api/index.php/v1/content/articles/8"
Om de relaties in een headless voorkant te reconstrueren, is de betrouwbaarste bron de tabel #__associations zelf: selecteer de rijen die binnen een context een key delen, en haal vervolgens elk item op id op via zijn componenteindpunt. Behandel de tabel als de bron van waarheid en koppel op de key.
13. SEO en metadata
Associaties zijn niet alleen een navigatiegemak. Ze zijn het belangrijkste meertalige SEO-signaal dat Joomla produceert.
13.1 hreflang-alternatieve links
Wanneer Itemassociaties aan staan en een pagina associaties heeft, voegt Joomla hreflang-alternatieve links toe aan de paginakop. Die vertellen Google welke URL's vertalingen van elkaar zijn, zodat de juiste taalversie in de resultaten van het juiste land verschijnt:
<link rel="alternate" hreflang="en-GB" href="https://example.test/en/about-us">
<link rel="alternate" hreflang="nl-NL" href="https://example.test/nl/over-ons">
<link rel="alternate" hreflang="x-default" href="https://example.test/en/about-us">
De x-default-vermelding wijst naar je standaardtaal en is de versie die wordt getoond aan bezoekers wier taal je niet bedient. Joomla voegt die automatisch toe.
13.2 Geen associaties betekent geen hreflang
Heeft een pagina geen associaties, dan krijgt hij geen alternatieve links. Zoekmachines behandelen je Engelse en Nederlandse pagina's dan als ongerelateerd, en kunnen bijna-gelijke vertalingen zelfs als dubbele inhoud lezen. Volledige associaties zijn hoe je dat voorkomt.
13.3 Nette URL's per taal
De Taalfilter-plugin geeft elke taal een eigen URL-prefix (/en/, /nl/) uit de sef-code van de inhoudstaal. Associaties zorgen dat de wisselaar tussen die nette URL's linkt in plaats van gebruikers bij de wortel te dumpen, wat zowel bezoekers als crawlers op samenhangende paden houdt.
14. Aandachtspunten bij migratie
Wanneer je een site naar Joomla 6 verhuist vanuit een oudere versie, overleven associaties de database-upgrade meestal ongeschonden. De meeste meldingen van "verloren vertalingen" na een migratie zijn configuratieproblemen, geen dataverlies. Loop deze checklist langs voordat je aanneemt dat de gegevens kapot zijn.
14.1 Wat te controleren na een migratie
| Controle | Waarom het wisselen breekt |
|---|---|
| Taalfilter-plugin ingeschakeld | Staat hij uit, dan verschijnen er helemaal geen wisselaar en geen tabblad Associaties. |
| Itemassociaties = Ja | Teruggezet op Nee, dan springt elke wissel naar de startpagina. |
| Taaltoewijzingen van items | Items die op Alle zijn teruggezet, vallen stilzwijgend uit hun groep. |
| Eén standaard startpagina per taal | Een ontbrekende standaardstartpagina geeft een fatale fout op de voorkant. |
| Menu-associaties | Ontbrekende menukoppelingen duwen de router naar terugvalroutes. |
| Associatiehelpers van derden | Extensies moeten AssociationExtensionHelper uitbreiden voor de moderne API. |
14.2 De gegevens zijn waarschijnlijk in orde
De tabel #__associations gaat ongewijzigd mee, dus de key-groepen van je oude site bestaan nog. Een snelle controle bevestigt dat:
SELECT context, COUNT(*) AS rows, COUNT(DISTINCT key) AS groups
FROM #__associations
GROUP BY context;
-- gezond: elke context toont meerdere rijen per groep, niet één rij per groep
Toont een context bijna evenveel groepen als rijen, dan hebben veel groepen maar één lid, wat betekent dat associaties zijn gemaakt maar dat hun partners tijdens de verhuizing hun taaltoewijzing kwijtraakten. Herstel de taalvelden en de bestaande keys koppelen weer aan elkaar.
Naar boven15. Veelgemaakte fouten en valkuilen
15.1 Geen tabblad Associaties
Symptoom: het bewerkscherm van een artikel heeft geen tabblad Associaties.
Oplossing: schakel de Taalfilter-plugin in, zorg voor minstens twee gepubliceerde inhoudstalen en zet de taal van het item op een specifieke taal in plaats van Alle.
15.2 Wisselaar gaat altijd naar Home
Symptoom: op een andere taal klikken belandt altijd op de startpagina.
Oplossing: zet Itemassociaties op Ja in de Taalfilter-plugin, maak vervolgens de ontbrekende vertaling en associeer die met de huidige pagina.
15.3 "No home menu item for the default language"
Symptoom: de voorkant toont een fatale fout over een ontbrekende standaardstartpagina.
Oplossing: maak per inhoudstaal één standaard startpagina-menu-item, elk op de eigen taal, en associeer ze met elkaar.
15.4 Inhoud op "Alle"
Symptoom: een item kan niet worden geassocieerd, of dezelfde tekst verschijnt in elke taal.
Oplossing: gebruik Alle alleen voor echt gedeelde items. Alles wat je vertaalt, moet op een specifieke taal staan zodat het bij een associatiegroep kan horen.
15.5 Niet-gepubliceerde of beperkte items associëren
Symptoom: de wisselaarlink bestaat maar leidt naar een 404 of een pagina met geweigerde toegang.
Oplossing: zorg dat elk item in een associatiegroep gepubliceerd is en een openbaar toegangsniveau deelt. De helper verbergt associaties die de bezoeker niet mag zien.
15.6 De tabel met de hand bewerken
Symptoom: met de hand ingevoerde rijen met een geraden key koppelen items niet.
Oplossing: laat Joomla de key berekenen via het tabblad Associaties of de component. Een niet-passende hash breekt de groep stilzwijgend.
16. Best practices
Onthoud je maar een paar dingen uit dit artikel, onthoud dan deze:
- Leg eerst het fundament: inhoudstalen, de Taalfilter-plugin en Itemassociaties = Ja, vóór je inhoud maakt.
- Eén menu en één standaard startpagina per taal, allemaal geassocieerd. Dit voorkomt de meestgemaakte meertalige fout.
- Associeer terwijl je vertaalt, met de component Meertalige associaties. Een onvertaalde pagina is een doodlopend spoor voor de wisselaar.
- Reserveer "Alle" voor echt gedeelde items zoals een logo of een globale module. Alles wat je vertaalt, krijgt een specifieke taal.
- Vertrouw op de hulpmiddelen: bewerk
#__associationsnooit met de hand. Laat Joomla dekeyberekenen. - Controleer de hreflang-uitvoer op een paar pagina's. Ontbreken de alternatieve links, dan zijn je associaties onvolledig en lekt je meertalige SEO weg.
17. In het kort
VEREISTEN Taalfilter-plugin AAN + 2 gepubliceerde inhoudstalen
ZET AAN Taalfilter-plugin -> Itemassociaties: Ja
ASSOCIEER open item -> tabblad Associaties -> kies/maak per taal
BULK BEWERKEN Systeem -> Beheren -> Meertalige associaties (com_associations)
STARTPAGINA'S per taal een standaard menu-item, geassocieerd
MODULES toegewezen via Taal; site-modules kunnen ook geassocieerd
WISSELAAR publiceer mod_languages (Taal: Alle)
ROUTER associatie vindt de id ; router bouwt de /xx/-URL
DATABASE #__associations (id, context, key) ; zelfde key = een groep
CONTEXTEN com_content.item, com_menus.item, com_categories.item, ...
PHP-CONTROLE Associations::isEnabled()
PHP-LEZEN Associations::getAssociations('com_content','#__content',
'com_content.item', $id)
VOORKANT-URLS AssociationHelper::getAssociations($id, 'article')
SEO associaties -> hreflang-alternate + x-default-links
REGEL een item per taal per groep ; een groep per item
Naar boven18. Samenvatting
Meertalige associaties zijn de laag die van een stapel items in één taal een samenhangende meertalige website maken. Ze vertalen je inhoud niet; ze leggen vast dat je vertalingen bij elkaar horen, en daarna gebruikt Joomla die kennis overal:
- Voor bezoekers: de taalwisselaar houdt ze op dezelfde pagina in plaats van ze op de startpagina te dumpen.
- Voor redacteuren: het tabblad Associaties en de component Meertalige associaties maken het koppelen van vertalingen snel.
- Voor beheerders: de Taalfilter-plugin, menu's per taal en één standaard startpagina per taal houden het systeem bij elkaar.
- Voor ontwikkelaars: één tabel
#__associations, afgebakend per context en gegroepeerd op een gedeeldekey, plus de helperklasseAssociations, ontsluiten alles netjes. - Voor SEO: volledige associaties produceren de
hreflang-alternatieve links die zoekmachines vertellen welke pagina's vertalingen van elkaar zijn.
Zodra je de vereisten, het tabblad Associaties, de gedeelde key in de database en de rol van de Taalfilter-plugin begrijpt, kun je met vertrouwen een meertalige Joomla-site bouwen en debuggen.
Blijft je taalwisselaar bezoekers naar de startpagina sturen, of missen je vertaalde pagina's hun hreflang-tags, dan ligt de oorzaak bijna altijd in deze laag. Het loont om associaties vroeg goed te krijgen, want ze bepalen stilletjes of je meertalige site aanvoelt als één website of als meerdere losse.


Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.


