<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://dansunegalaxie.ca/index.php?action=history&amp;feed=atom&amp;title=Module%3ALangue</id>
	<title>Module:Langue - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://dansunegalaxie.ca/index.php?action=history&amp;feed=atom&amp;title=Module%3ALangue"/>
	<link rel="alternate" type="text/html" href="https://dansunegalaxie.ca/index.php?title=Module:Langue&amp;action=history"/>
	<updated>2026-04-04T15:47:37Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://dansunegalaxie.ca/index.php?title=Module:Langue&amp;diff=61&amp;oldid=prev</id>
		<title>Yuki : 1 version importée : Infobox</title>
		<link rel="alternate" type="text/html" href="https://dansunegalaxie.ca/index.php?title=Module:Langue&amp;diff=61&amp;oldid=prev"/>
		<updated>2023-11-15T07:11:01Z</updated>

		<summary type="html">&lt;p&gt;1 version importée : Infobox&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fr&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Version précédente&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version du 15 novembre 2023 à 03:11&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;fr&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Aucune différence)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yuki</name></author>
	</entry>
	<entry>
		<id>https://dansunegalaxie.ca/index.php?title=Module:Langue&amp;diff=60&amp;oldid=prev</id>
		<title>wikipedia&gt;Od1n : version corrigée de 204973224&amp;nbsp;; j&#039;avais commis une erreur dans le chaînage, en ajoutant le class au builder parent (celui qui est en fait vide) au lieu de l&#039;ajouter au builder du &lt;span&gt;</title>
		<link rel="alternate" type="text/html" href="https://dansunegalaxie.ca/index.php?title=Module:Langue&amp;diff=60&amp;oldid=prev"/>
		<updated>2023-07-10T06:27:58Z</updated>

		<summary type="html">&lt;p&gt;version corrigée de &lt;a href=&quot;/Sp%C3%A9cial:Diff/204973224&quot; title=&quot;Spécial:Diff/204973224&quot;&gt;204973224&lt;/a&gt; ; j&amp;#039;avais commis une erreur dans le chaînage, en ajoutant le class au builder parent (celui qui est en fait vide) au lieu de l&amp;#039;ajouter au builder du &amp;lt;span&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- luacheck: globals mw, no max line length&lt;br /&gt;
&lt;br /&gt;
local Langue = { }&lt;br /&gt;
&lt;br /&gt;
local dataLangue = mw.loadData &amp;#039;Module:Langue/Data&amp;#039;&lt;br /&gt;
local langErrorMess = &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;langue non reconnue : %s&amp;lt;/span&amp;gt;&amp;#039; -- attention, plusieurs modules recherchent ce message pour détecter des erreurs&lt;br /&gt;
&lt;br /&gt;
-- premierParametre renvoie le premier paramètre de Frame, que celui-ci ait été passé au module par invoke, directement au modèle,&lt;br /&gt;
-- ou à l&amp;#039;intérieur d&amp;#039;un module sous forme de string dans un tableau ou directement de string.&lt;br /&gt;
-- Si aucun de ces arguments ne contient de chaine, la fonction renvoie nil.&lt;br /&gt;
-- Si le deuxième paramètre est true, la chaine est renvoyée trimée et en minuscules.&lt;br /&gt;
local function premierParametre( frame, lowerCase )&lt;br /&gt;
	local arg&lt;br /&gt;
	if type( frame ) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		arg = ( frame.getParent and ( frame.args[1] or frame:getParent().args[1] ) ) or frame[1]&lt;br /&gt;
	elseif type( frame ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		arg = frame&lt;br /&gt;
	end&lt;br /&gt;
	if type( arg ) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
		arg = nil&lt;br /&gt;
	end&lt;br /&gt;
	if arg and lowerCase then&lt;br /&gt;
		arg = mw.ustring.lower( mw.text.trim( arg ) )&lt;br /&gt;
	end&lt;br /&gt;
	return arg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- determinationCode retourne une table contenant le code de langue principal et la liste des subcode&lt;br /&gt;
-- si le code de langue principal n&amp;#039;est pas reconnu, retourne nil.&lt;br /&gt;
function Langue.determinationCode( langue )&lt;br /&gt;
	if type( langue ) == &amp;#039;string&amp;#039; and langue ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		local tabCode = mw.text.split( langue, &amp;#039;-&amp;#039; )&lt;br /&gt;
		local tabLangue = dataLangue[ mw.ustring.lower( tabCode[1] ) ]&lt;br /&gt;
		if tabLangue and tabLangue.code then&lt;br /&gt;
			tabCode[1] = tabLangue.code&lt;br /&gt;
			if tabLangue.invalide then&lt;br /&gt;
				tabCode.invalide=true&lt;br /&gt;
			end&lt;br /&gt;
			return tabCode&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Voir Modèle:Code langue&lt;br /&gt;
-- Paramètre :&lt;br /&gt;
--     1  : nom de langue.&lt;br /&gt;
function Langue.codeLangue( frame )&lt;br /&gt;
	local arg = premierParametre( frame, true )&lt;br /&gt;
	local tabCode = Langue.determinationCode( arg )&lt;br /&gt;
	return ( tabCode and table.concat( tabCode, &amp;#039;-&amp;#039; ) ) or arg or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Voir Modèle:Code langue 2&lt;br /&gt;
-- Paramètre :&lt;br /&gt;
--     1  : nom de langue.&lt;br /&gt;
function Langue.codeLangue2( frame )&lt;br /&gt;
	local arg = premierParametre( frame, true )&lt;br /&gt;
	local tabCode = Langue.determinationCode( arg )&lt;br /&gt;
	return ( tabCode and table.concat( tabCode, &amp;#039;-&amp;#039; ) ) or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Voir Modèle:Direction langue&lt;br /&gt;
-- Paramètre :&lt;br /&gt;
--     1  : nom de langue ou code IETF.&lt;br /&gt;
function Langue.directionLangue( frame )&lt;br /&gt;
	local arg = premierParametre( frame, true )&lt;br /&gt;
	if type( arg ) ~= &amp;#039;string&amp;#039; or arg == &amp;#039;&amp;#039; then&lt;br /&gt;
		return &amp;#039;ltr&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	-- séparation du code de langue en code principal et les différents subcode.&lt;br /&gt;
	local tabCode = Langue.determinationCode( arg )&lt;br /&gt;
	if tabCode then&lt;br /&gt;
		-- on essaye de savoir si la direction est de droite à gauche&lt;br /&gt;
		local codeScript = tabCode[2]&lt;br /&gt;
		if codeScript and string.len( codeScript ) == 4 and dataLangue[ &amp;#039;rtl script&amp;#039; ] then&lt;br /&gt;
			-- il y a un subcode d&amp;#039;écritrure, c&amp;#039;est lui qui est pris en compte&lt;br /&gt;
			codeScript = string.upper( string.sub( codeScript, 1, 1 ) ) .. string.sub( codeScript, 2 )&lt;br /&gt;
			if dataLangue[ &amp;#039;rtl script&amp;#039; ][ codeScript ] then&lt;br /&gt;
				return &amp;#039;rtl&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- il n&amp;#039;y a pas de sub-code d&amp;#039;écriture, on prend en compte le code de langue principal.&lt;br /&gt;
			local tabLangue = dataLangue[ tabCode[1] ]&lt;br /&gt;
			if tabLangue and tabLangue.rtl then&lt;br /&gt;
				return &amp;#039;rtl&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- la langue n&amp;#039;est pas écrite de droite à gauche, donc ltr.&lt;br /&gt;
	return &amp;#039;ltr&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function getDataLangue( frame )&lt;br /&gt;
	-- Obtenir le code de la langue&lt;br /&gt;
	local codeLangue = premierParametre( frame, true )&lt;br /&gt;
	-- Si le paramètre est incorrect, retourner un message d&amp;#039;erreur&lt;br /&gt;
	if type( codeLangue ) ~= &amp;#039;string&amp;#039; or codeLangue == &amp;#039;&amp;#039; then&lt;br /&gt;
		return nil, &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;langue non précisée&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Obtenir le tableau contenant les informations sur la langue&lt;br /&gt;
	local tabLangue = dataLangue[ codeLangue ]&lt;br /&gt;
	-- Si le code étendu n&amp;#039;est pas trouvé, chercher à nouveau avec le code racine&lt;br /&gt;
	if not tabLangue then&lt;br /&gt;
		tabLangue = dataLangue[ mw.ustring.match( codeLangue, &amp;#039;^(%a-)%-&amp;#039; ) ]&lt;br /&gt;
	end&lt;br /&gt;
	-- Si on n&amp;#039;a toujours rien trouvé, retourner un message d&amp;#039;erreur&lt;br /&gt;
	if not tabLangue then&lt;br /&gt;
		return nil, langErrorMess:format( codeLangue )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tabLangue&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction fournissant un wikilien vers l&amp;#039;article&lt;br /&gt;
-- traitant d&amp;#039;une langue à partir de son code.&lt;br /&gt;
-- Voir Modèle:Lien langue&lt;br /&gt;
-- Paramètre :&lt;br /&gt;
--     1  : code IETF de langue.&lt;br /&gt;
function Langue.lienLangue( frame )&lt;br /&gt;
	local tabLangue, erreur = getDataLangue( frame )&lt;br /&gt;
	if not tabLangue then&lt;br /&gt;
		return erreur&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Créer un lien pour la langue depuis le tableau&lt;br /&gt;
	if type( tabLangue.page ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		if tabLangue.page ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			return &amp;#039;[[&amp;#039; .. tabLangue.page .. &amp;#039;|&amp;#039; .. tabLangue.nom .. &amp;#039;]]&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			return tabLangue.nom&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;[[&amp;#039; .. tabLangue.nom .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction permettant de récupérer le nom d&amp;#039;une langue à partir de son code.&lt;br /&gt;
-- Voir Modèle:Nom langue&lt;br /&gt;
-- Paramètre :&lt;br /&gt;
--     1  : code IETF de langue.&lt;br /&gt;
-- Retourne :&lt;br /&gt;
--     Le nom de la langue, un message d&amp;#039;erreur sinon.&lt;br /&gt;
function Langue.nomLangue( frame )&lt;br /&gt;
	local tabLangue, erreur = getDataLangue( frame )&lt;br /&gt;
	if not tabLangue then&lt;br /&gt;
		return erreur&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Extraire le nom de la langue depuis le tableau&lt;br /&gt;
	return tabLangue.nom&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction permettant de récupérer le nom de l&amp;#039;article&lt;br /&gt;
-- portant sur une langue à partir de son code.&lt;br /&gt;
-- Voir Modèle:Article langue&lt;br /&gt;
-- Paramètre :&lt;br /&gt;
--     1  : code IETF de langue.&lt;br /&gt;
-- Retourne :&lt;br /&gt;
--     Le nom de l&amp;#039;article portant sur la langue&lt;br /&gt;
--     si le code est trouvé, un message d&amp;#039;erreur sinon.&lt;br /&gt;
function Langue.articleLangue( frame )&lt;br /&gt;
	local tabLangue, erreur = getDataLangue( frame )&lt;br /&gt;
	if not tabLangue then&lt;br /&gt;
		return erreur&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Extraire le titre de l&amp;#039;article depuis le tableau&lt;br /&gt;
	if type( tabLangue.page ) == &amp;#039;string&amp;#039; and tabLangue.page ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		return tabLangue.page&lt;br /&gt;
	else&lt;br /&gt;
		return tabLangue.nom&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Voir Modèle:Langue&lt;br /&gt;
-- Paramètres :&lt;br /&gt;
--    1 : code IETF de langue ;&lt;br /&gt;
--    texte ou 2 : texte dans cette langue ;&lt;br /&gt;
--    trans : translittération du texte ;&lt;br /&gt;
--    dir : direction de la langue (obsolète : peut être en paramètre 1, avec code en 2 et texte en 3).&lt;br /&gt;
function Langue.langue( frame )&lt;br /&gt;
	local args = ( frame.getParent and frame:getParent().args ) or frame         -- préparation pour appel par modèle ou direct.&lt;br /&gt;
	local code = mw.ustring.lower( mw.text.trim( args[1] or &amp;#039;&amp;#039; ) )&lt;br /&gt;
	local texte = args.texte or &amp;#039;&amp;#039;&lt;br /&gt;
	if texte == &amp;#039;&amp;#039; then&lt;br /&gt;
		texte = args[2] or &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local dir = args.dir&lt;br /&gt;
	local namespaceCategorisation = { [0] = true, [4] = true, [10] = true, [12] = true, [14] = true, [100] = true }&lt;br /&gt;
	local categorisation = namespaceCategorisation[ mw.title.getCurrentTitle().namespace ] and not args.nocat&lt;br /&gt;
&lt;br /&gt;
	-- Décalage des paramètres si code contient la direction du texte (obsolète mais toujours possible).&lt;br /&gt;
	if code == &amp;#039;ltr&amp;#039; or code == &amp;#039;rtl&amp;#039; then&lt;br /&gt;
		dir = code&lt;br /&gt;
		code = mw.ustring.lower( mw.text.trim( args[2] ) or &amp;#039;&amp;#039; )&lt;br /&gt;
		texte = args[3] or &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local codeArg = code&lt;br /&gt;
&lt;br /&gt;
	-- sortie immédiate s&amp;#039;il n&amp;#039;y a pas de texte&lt;br /&gt;
	if texte == &amp;#039;&amp;#039; then&lt;br /&gt;
		if categorisation then&lt;br /&gt;
			return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;erreur du modèle [[modèle:Langue|{{langue}}]] : texte absent&amp;lt;/span&amp;gt;[[Catégorie:Page utilisant un modèle avec une syntaxe erronée|Langue]]&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- récursion si texte contient des blocs&lt;br /&gt;
	if texte:match(&amp;#039;\n *\n&amp;#039;) or texte:match(&amp;#039;\n[*#:]&amp;#039;) then&lt;br /&gt;
		-- les parenthèses permettent d&amp;#039;éliminer la seconde valeur retournée par gsub (nombre de remplacement)&lt;br /&gt;
		return ( texte:gsub(&lt;br /&gt;
			&amp;#039;(\n?[*#:]?%s*)([^\n]+)&amp;#039;,&lt;br /&gt;
			function ( init, ligne )&lt;br /&gt;
				return init .. Langue.langue{ code, ligne }&lt;br /&gt;
			end&lt;br /&gt;
		) )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Si la langue est reconnue, la valeur de la table est prise en compte (permet de corriger les noms de langue en toutes lettres).&lt;br /&gt;
	local tabCode = Langue.determinationCode( code )&lt;br /&gt;
	local tabLangue&lt;br /&gt;
	if tabCode then&lt;br /&gt;
		code = table.concat( tabCode, &amp;#039;-&amp;#039; )&lt;br /&gt;
		tabLangue = dataLangue[ tabCode[1] ]&lt;br /&gt;
&lt;br /&gt;
		local codeScript = tabCode[2]&lt;br /&gt;
		-- Si codeScript est bien un style d&amp;#039;écriture (len = 4) on applique sa direction&lt;br /&gt;
		if codeScript and  string.len( codeScript ) == 4 and dataLangue[ &amp;#039;rtl script&amp;#039; ] then&lt;br /&gt;
			-- formatage type Latn correspondant au fromat dans dataLangue[ &amp;#039;rtl script&amp;#039; ]&lt;br /&gt;
			codeScript = string.upper( string.sub(  codeScript, 1, 1 ) ) .. string.sub(  codeScript, 2 )&lt;br /&gt;
			tabLangue = { code = tabLangue.code,&lt;br /&gt;
				rtl = dataLangue[ &amp;#039;rtl script&amp;#039; ][ codeScript ],&lt;br /&gt;
				invalide = tabLangue.invalide&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Préparation du rendu de direction du texte.&lt;br /&gt;
	dir = dir and dir:lower()&lt;br /&gt;
	if dir ~= &amp;#039;ltr&amp;#039; and dir ~= &amp;#039;rtl&amp;#039; then&lt;br /&gt;
		dir = ( tabLangue and tabLangue.rtl and &amp;#039;rtl&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Compilation du texte à retourner.&lt;br /&gt;
	local html = mw.html.create( &amp;#039;&amp;#039; )&lt;br /&gt;
	if code == &amp;#039;&amp;#039; then&lt;br /&gt;
		html:wikitext( texte )&lt;br /&gt;
	else&lt;br /&gt;
		local span = mw.html.create( &amp;#039;span&amp;#039; )&lt;br /&gt;
				:addClass( &amp;#039;lang-&amp;#039; .. code )&lt;br /&gt;
				:attr( &amp;#039;lang&amp;#039;, code )&lt;br /&gt;
				:attr( &amp;#039;dir&amp;#039;, dir )&lt;br /&gt;
				:wikitext( texte )&lt;br /&gt;
&lt;br /&gt;
		if args.class and args.class ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			span:addClass( args.class )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		html:node( span )&lt;br /&gt;
&lt;br /&gt;
		-- Translittération.&lt;br /&gt;
		if ( args.trans or &amp;#039;&amp;#039; ) ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			local trans = args.trans:gsub( &amp;quot;^&amp;#039;&amp;#039;%f[^&amp;#039;](.+)%f[&amp;#039;]&amp;#039;&amp;#039;$&amp;quot;, &amp;quot;%1&amp;quot; )&lt;br /&gt;
			html:wikitext( &amp;quot; (&amp;#039;&amp;#039;&amp;quot; )&lt;br /&gt;
				:tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
					:addClass( &amp;#039;transcription lang-&amp;#039; .. code )&lt;br /&gt;
					:attr( &amp;#039;lang&amp;#039;, code .. &amp;#039;-Latn&amp;#039; )&lt;br /&gt;
					:attr( &amp;#039;dir&amp;#039;, &amp;#039;ltr&amp;#039; )&lt;br /&gt;
					:wikitext( trans )&lt;br /&gt;
					:done()&lt;br /&gt;
				:wikitext( &amp;quot;&amp;#039;&amp;#039;)&amp;quot; )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Ajout de la catégorie Page avec code de langue invalide si le code langue non reconnu ou invalide.&lt;br /&gt;
	if categorisation and ( type( tabLangue ) ~= &amp;#039;table&amp;#039; or tabCode.invalide ) then&lt;br /&gt;
		local erreur = string.format( langErrorMess, codeArg )&lt;br /&gt;
		if codeArg == &amp;#039;&amp;#039; then&lt;br /&gt;
			erreur = &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;langue non précisée&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		html:wikitext( &amp;#039;[[Catégorie:Page avec code de langue invalide|Langue]] &amp;#039; .. erreur )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring( html )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Alias nom de fonction&lt;br /&gt;
Langue.lang = Langue.langue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Voir Modèle:Indication de langue&lt;br /&gt;
-- Paramètres :&lt;br /&gt;
--    1 : nom de langue ;&lt;br /&gt;
--    2 : code IETF ;&lt;br /&gt;
--    texte : texte dans cette langue ;&lt;br /&gt;
--    dir : direction de la langue.&lt;br /&gt;
function Langue.indicationDeLangue( frame )&lt;br /&gt;
	local args = ( frame.getParent and frame:getParent().args ) or frame&lt;br /&gt;
	local nomLangue = mw.text.trim( args[1] or &amp;#039;&amp;#039; )&lt;br /&gt;
	local code = mw.text.trim( args[2] or &amp;#039;&amp;#039; )&lt;br /&gt;
	local texte = args.texte&lt;br /&gt;
	local dir = args.dir&lt;br /&gt;
&lt;br /&gt;
	-- Cas où le premier et/ou le deuxième paramètre est vide.&lt;br /&gt;
	if code == &amp;#039;&amp;#039; and nomLangue == &amp;#039;&amp;#039; then&lt;br /&gt;
		return texte&lt;br /&gt;
	elseif nomLangue == &amp;#039;&amp;#039; then&lt;br /&gt;
		nomLangue = dataLangue[ mw.ustring.lower( code ) ]&lt;br /&gt;
		nomLangue = (nomLangue and nomLangue.nom or &amp;#039;???&amp;#039;)&lt;br /&gt;
	elseif code == &amp;#039;&amp;#039; then&lt;br /&gt;
		code = dataLangue[ nomLangue ]&lt;br /&gt;
		code = ( code and code.code or &amp;#039;&amp;#039; )&lt;br /&gt;
		if code == &amp;#039;&amp;#039; then&lt;br /&gt;
			return texte&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Gestion du texte.&lt;br /&gt;
	if texte and texte ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		texte = &amp;#039;\194\160&amp;#039; .. Langue.lang{ code, dir = dir, texte = texte }&lt;br /&gt;
	else&lt;br /&gt;
		texte = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	-- Compilation de l&amp;#039;indicateur de langue et du texte.&lt;br /&gt;
	local html = mw.html.create()&lt;br /&gt;
	html:tag( &amp;#039;abbr&amp;#039; )&lt;br /&gt;
			:addClass( &amp;#039;abbr&amp;#039; )&lt;br /&gt;
			:addClass( &amp;#039;indicateur-langue&amp;#039; )&lt;br /&gt;
			:attr( &amp;#039;title&amp;#039;, &amp;#039;Langue : &amp;#039; .. nomLangue )&lt;br /&gt;
			:wikitext( &amp;#039;(&amp;#039; .. code .. &amp;#039;)&amp;#039; )&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext( texte )&lt;br /&gt;
&lt;br /&gt;
	return tostring( html )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Voir Modèle:Mul&lt;br /&gt;
-- Paramètres : codes IETF ou noms de langue, en nombre indéfini (string ou nil uniquement).&lt;br /&gt;
function Langue.indicationMultilingue( frame )&lt;br /&gt;
	local args = (frame.getParent and frame:getParent().args) or frame&lt;br /&gt;
	local listeNom = { }&lt;br /&gt;
	local listeCode = { }&lt;br /&gt;
&lt;br /&gt;
	-- Valeur par défaut du premier paramètre = &amp;#039;mul&amp;#039;.&lt;br /&gt;
	local code = mw.text.trim( args[1] or &amp;#039;&amp;#039; )&lt;br /&gt;
	if code == &amp;#039;&amp;#039; then&lt;br /&gt;
		code = &amp;#039;mul&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local maxLang = tonumber(args.maxLang) or nil&lt;br /&gt;
&lt;br /&gt;
	if not args[2] and not dataLangue[ mw.ustring.lower( code ) ] then&lt;br /&gt;
		local split = mw.text.split( code, &amp;#039;[+,;:/ .]+&amp;#039; )&lt;br /&gt;
		if #split &amp;gt; 1 then&lt;br /&gt;
			split.maxLang = maxLang&lt;br /&gt;
			return Langue.indicationMultilingue( split )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Ajout des noms et codes de langue de chaque paramètre dans listeNom et ListeCode.&lt;br /&gt;
	local i = 1&lt;br /&gt;
	repeat&lt;br /&gt;
		code = mw.ustring.lower( code )&lt;br /&gt;
		local tabLangue = dataLangue[ code ]&lt;br /&gt;
		if not tabLangue then&lt;br /&gt;
			code = mw.text.split( code, &amp;#039;-&amp;#039; )[1]&lt;br /&gt;
			tabLangue = dataLangue[ code ]&lt;br /&gt;
		end&lt;br /&gt;
		if type( tabLangue ) == &amp;#039;table&amp;#039; then&lt;br /&gt;
			table.insert( listeNom, tabLangue.nom )&lt;br /&gt;
			table.insert( listeCode, tabLangue.code )&lt;br /&gt;
		else&lt;br /&gt;
			table.insert( listeNom, &amp;#039;???&amp;#039; )&lt;br /&gt;
			local erreur = string.format( langErrorMess, code )&lt;br /&gt;
			table.insert( listeCode, erreur )&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		code = mw.text.trim( args[i] or &amp;#039;&amp;#039; )&lt;br /&gt;
	until code == &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	-- Préparation et renvoi du texte.&lt;br /&gt;
	local n = #listeCode&lt;br /&gt;
	if n == 0 then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if maxLang and n &amp;gt; maxLang then&lt;br /&gt;
		listeCode = {&amp;#039;mul&amp;#039;}&lt;br /&gt;
	end&lt;br /&gt;
	local plusieurs = ( n &amp;gt; 1 )&lt;br /&gt;
&lt;br /&gt;
	local html = mw.html.create( &amp;#039;abbr&amp;#039; )&lt;br /&gt;
		:addClass( &amp;#039;abbr&amp;#039; )&lt;br /&gt;
		:addClass( &amp;#039;indicateur-langue&amp;#039; )&lt;br /&gt;
		:attr( &amp;#039;title&amp;#039;, &amp;#039;Langue&amp;#039; .. ( plusieurs and &amp;#039;s&amp;#039; or &amp;#039;&amp;#039; ) .. &amp;#039; : &amp;#039; .. mw.text.listToText( listeNom ) )&lt;br /&gt;
		:wikitext( &amp;#039;(&amp;#039; .. table.concat( listeCode, &amp;#039;\194\160+\194\160&amp;#039; ) .. &amp;#039;)&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	return tostring( html )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Voir Modèle:Langue avec nom&lt;br /&gt;
-- Paramètres :&lt;br /&gt;
--    1 : code IETF de langue ;&lt;br /&gt;
--    texte ou 2 : texte dans cette langue ;&lt;br /&gt;
--    trans : translittération du texte ;&lt;br /&gt;
--    dir : direction de la langue.&lt;br /&gt;
function Langue.langueAvecNom( frame )&lt;br /&gt;
	local args = ( frame.getParent and frame:getParent().args ) or frame&lt;br /&gt;
	local code = mw.ustring.lower( mw.text.trim( args [1] or &amp;#039;&amp;#039;) )&lt;br /&gt;
	local texte = args.texte or args[2] or &amp;#039;&amp;#039;&lt;br /&gt;
	local trans = args.trans&lt;br /&gt;
	local dir = args.dir&lt;br /&gt;
&lt;br /&gt;
	-- Détection de la direction du texte.&lt;br /&gt;
	if code == &amp;#039;ltr&amp;#039; or code == &amp;#039;rtl&amp;#039; then&lt;br /&gt;
		dir = code&lt;br /&gt;
		code = mw.ustring.lower( mw.text.trim( args[2] ) )&lt;br /&gt;
		texte = args[3] or &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Définition du nom de la langue en français.&lt;br /&gt;
	local nom = Langue.lienLangue{ code }&lt;br /&gt;
&lt;br /&gt;
	if texte ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		texte = &amp;#039; &amp;#039; .. Langue.lang{ code, dir = dir, texte = texte, trans = trans }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nom .. &amp;#039; :&amp;#039; .. texte&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
-- latinOnly détermine si la chaine fournie contient uniquement des caractères latin (étendu, unicode &amp;lt; 880)&lt;br /&gt;
function Langue.nonLatin( frame )&lt;br /&gt;
	local texte = premierParametre( frame )&lt;br /&gt;
	for codepoint in mw.ustring.gcodepoint( texte ) do&lt;br /&gt;
		if codepoint &amp;gt; 879 and not (                  --  &amp;gt; 036F&lt;br /&gt;
			codepoint &amp;gt; 7423 and codepoint &amp;lt; 7936 or  -- suppléments phonétique, diacritiques et latin  (1D00 à 1EFF)&lt;br /&gt;
			codepoint &amp;gt; 8191 and codepoint &amp;lt; 11392 or -- espace, indices, monaies et symboles divers (2000 à 2C7F)&lt;br /&gt;
			codepoint &amp;gt; 42783 and codepoint &amp;lt; 43008   -- latin étendu D  (A720 à A7FF)&lt;br /&gt;
		) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- erreurModuleData affiche un message d&amp;#039;erreur si le Module:Langue/Data n&amp;#039;a pas été chargé correctement,&lt;br /&gt;
-- pour la page de discussion de la base de données et ceux qui veulent surveiller cette page.&lt;br /&gt;
function Langue.erreurModuleData()&lt;br /&gt;
	if type( dataLangue ) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
		local message = [[&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Le chargement du module Langue/Data génère une erreur.&amp;lt;/strong&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Cette erreur doit être corrigée au plus vite car des milliers de pages ne s&amp;#039;affichent pas correctement.&amp;lt;/span&amp;gt;&lt;br /&gt;
]]&lt;br /&gt;
		return message&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- tableauLangues génère un tableau triable de la liste des langues disponible dans Module:langue/Data.&lt;br /&gt;
function Langue.tableauLangues()&lt;br /&gt;
	local tableau = { }&lt;br /&gt;
	local entete = [[{| class=&amp;quot;wikitable alternance sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!scope=col|Alias&lt;br /&gt;
!scope=col|Code IETF&lt;br /&gt;
!scope=col|Nom principal&lt;br /&gt;
!scope=col|Titre de l&amp;#039;article&amp;lt;br&amp;gt;(si différent du nom)&lt;br /&gt;
!scope=col|Lien vers l&amp;#039;article&lt;br /&gt;
!scope=col|RTL&lt;br /&gt;
!scope=col|Invalide]]&lt;br /&gt;
&lt;br /&gt;
	local ligneTab, ligneSrt&lt;br /&gt;
	for k, v in pairs( dataLangue ) do&lt;br /&gt;
		if v.code then&lt;br /&gt;
			ligneTab = {&lt;br /&gt;
				k,&lt;br /&gt;
				v.code,&lt;br /&gt;
				v.nom,&lt;br /&gt;
				v.page or &amp;#039;&amp;#039;,&lt;br /&gt;
				Langue.lienLangue(v.code),&lt;br /&gt;
				v.rtl and &amp;#039;[[Fichier:Yes check.svg|15px|oui|lien=]]&amp;#039; or &amp;#039;&amp;#039;,&lt;br /&gt;
				v.invalide and &amp;#039;[[Fichier:Yes check.svg|15px|oui|lien=]]&amp;#039; or &amp;#039;&amp;#039;,&lt;br /&gt;
			}&lt;br /&gt;
			ligneSrt = table.concat( ligneTab, &amp;#039;\n|&amp;#039; )&lt;br /&gt;
			table.insert( tableau, ligneSrt )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort( tableau )&lt;br /&gt;
	table.insert( tableau, 1, entete )&lt;br /&gt;
	table.insert( tableau, &amp;#039;}&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	return table.concat( tableau, &amp;#039;\n|-\n|&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- listeCodeAlias génère une liste ; les langues sont de la forme : * code : alias1, alias2&lt;br /&gt;
function Langue.listeCodeAlias()&lt;br /&gt;
	local languesTab, listeCodesAlias = { }, { }&lt;br /&gt;
	local code, alias, codeAlias&lt;br /&gt;
	for k, v in pairs( dataLangue ) do&lt;br /&gt;
		-- on construit un table avec pour indices les codes de langue, et pour valeurs une table avec la liste des alias&lt;br /&gt;
		code = v.code&lt;br /&gt;
		if code and not v.invalide then&lt;br /&gt;
			languesTab[code] = languesTab[code] or { }&lt;br /&gt;
			if k ~= mw.ustring.lower( code ) then&lt;br /&gt;
				table.insert( languesTab[code], k )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs( languesTab ) do&lt;br /&gt;
		-- transformation en un table séquence, avec pour valeur une chaine correspondant à une ligne de la liste&lt;br /&gt;
		alias = table.concat( v, &amp;#039;, &amp;#039; )&lt;br /&gt;
		if alias == &amp;#039;&amp;#039; then&lt;br /&gt;
			codeAlias = &amp;#039;* &amp;lt;code&amp;gt;&amp;#039; .. k .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			codeAlias = &amp;#039;* &amp;lt;code&amp;gt;&amp;#039; .. k .. &amp;#039;&amp;lt;/code&amp;gt; : &amp;#039; .. alias&lt;br /&gt;
		end&lt;br /&gt;
		table.insert( listeCodesAlias, codeAlias )&lt;br /&gt;
	end&lt;br /&gt;
	table.sort( listeCodesAlias )&lt;br /&gt;
&lt;br /&gt;
	return table.concat( listeCodesAlias, &amp;#039;\n&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- listeAliasCode génère une liste ; les langues sont de la forme :  * alias : code&lt;br /&gt;
function Langue.listeAliasCode()&lt;br /&gt;
	local languesTab = { }&lt;br /&gt;
	local code&lt;br /&gt;
	for k, v in pairs( dataLangue ) do&lt;br /&gt;
		-- on construit un table avec pour indices les codes de langue, et pour valeurs une table avec la liste des alias&lt;br /&gt;
		code = v.code&lt;br /&gt;
		if code and k ~= code and not v.invalide then&lt;br /&gt;
			table.insert( languesTab, &amp;#039;* &amp;#039; .. k .. &amp;#039; = &amp;#039; .. code )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort( languesTab )&lt;br /&gt;
&lt;br /&gt;
	return table.concat( languesTab, &amp;#039;\n&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Langue&lt;/div&gt;</summary>
		<author><name>wikipedia&gt;Od1n</name></author>
	</entry>
</feed>