Site multilingue

Il existe de nombreux tutoriels pour la création de sites multilingues, mais le meilleur est sans conteste celui du père de TYPO3, Kasper Skårhøj :

Néanmoins, voici en bref un résumé de ce dont il faut se rappeler…


Très important avec TemplaVoilà : assurez-vous que l’extension static_info_tables a bien été chargée, sinon vous ne verrez pas l’onglet de traduction dans le module Web > Page.

Langue par défaut

TYPO3 stocke la langue par défaut sous l’id sys_language_uid = 0. La langue par défaut est complètement arbitraire mais il est néanmoins pratique de lui donner un nom et un drapeau dans le backend. Cela se passe dans le pageTS de la page racine du site :

	# Default language
mod.SHARED {
	defaultLanguageFlag = gb.gif
	defaultLanguageLabel = English
}
 
	# Translation must be bound 1-1 to the default content
mod.web_layout.defLangBinding = 1

Rendu Frontend

Pour le rendu en frontend, voici le code TypoScript à placer dans le template. Je pars du principe que le site est généré en UTF-8 :

	# English as default language
config {
	sys_language_uid = 0
	language = en
	locale_all = en_GB
}
 
page {
	config.htmlTag_langKey = en
	meta.language = en
}

Il y a un détail important ici. La valeur de locale_all est directement dépendente des locales installées sur le serveur.

Voici comment, sous Linux, obtenir la liste des locales installées :

# locale -a
C
de_CH.utf8
en_US.utf8
fr_CH
fr_CH.iso88591
fr_CH.utf8
POSIX

Pour en ajouter de nouvelles, éditez le fichier /etc/locale.gen:

en_US.UTF-8 UTF-8
fr_CH.UTF-8 UTF-8
de_CH.UTF-8 UTF-8
fr_CH ISO-8859-1

Puis exécutez la commande de génération des locales :

# locale-gen
Generating locales (this might take a while)…
en_US.UTF-8… done
fr_CH.UTF-8… done
de_CH.UTF-8… done
fr_CH.ISO-8859-1… done
Generation complete.

Support d'autres langues

Si vous souhaitez traduire votre site, il suffit de créer autant de langues additionnelles que vous le souhaitez en utilisant le mode Web > List et en ajoutant des enregistrements de type sys_language. Notez bien l’id généré pour chaque langue, il vous sera utile par la suite.

[globalVar = GP:L=1]
	config {
		sys_language_uid = 1
		language = de
		locale_all = de_CH.utf8
	}
	page {
		config.htmlTag_langKey = de
		meta.language = de
	}
 
[globalVar = GP:L=2]
	config {
		sys_language_uid = 2
		language = fr
		locale_all = fr_CH.utf8
	}
	page {
		config.htmlTag_langKey = fr
		meta.language = fr
	}
 
...
[global]
 
config.linkVars = L
 
	# Best practice
config.sys_language_mode = content_fallback
 
	# Translation must be bound 1-1 to the default content
config.sys_language_overlay = 1

Choix de la langue (exemple)

lib.links.languages = HMENU
lib.links.languages {
	special = language
 
	special.value = 1,0,2,3
	special.normalWhenNoLanguage = 0
 
	1 = TMENU
	1 {
		noBlur = 1
 
		NO = 1
		NO {
			allWrap = <li>|</li>
			stdWrap.setCurrent = DE || EN || FR || IT
			stdWrap.current = 1
			ATagTitle (
				Diese Seite auf Deutsch zeigen  ||
				Show this page in English       ||
				Afficher cette page en français ||
				Visualizza questa pagina in italiano
			)
			ATagParams (
				lang="de" xml:lang="de" ||
				lang="en" xml:lang="en" ||
				lang="fr" xml:lang="fr" ||
				lang="it" xml:lang="it"
			)
		}
 
		ACT < .NO
		ACT {
			stdWrap.setCurrent (
				<span class="current">DE</span> ||
				<span class="current">EN</span> ||
				<span class="current">FR</span> ||
				<span class="current">IT</span>
			)
 
			doNotLinkIt = 1
		}
 
			# Non-translated pages should be "active" anyway
		USERDEF2 < .ACT
	}
}

Flexible Content Element

Si vous souhaitez pouvoir traduire les champs d’un flexible content element, il faut modifier la structure XML de ce dernier (au début de la définition) :

<T3DataStructure>
	<meta type="array">
<langChildren>1</langChildren>
<langDisable>0</langDisable>
</meta>

Désormais, lorsque vous éditez un tel bloc de contenu, vous pouvez en traduire les différents champs. Si un champ n’est pas traduit, le contenu d’origine est automatiquement utilisé :

Flattr