Documentation[voir] [modifier] [historique] [purger]

Utilisation

Fonctions exportables :

  • codeLangue(frame) : Convertit en code de langue IETF les noms français de langues les plus couramment citées.
  • codeLangue2(frame) : Similaire à codeLangue à une exception près : si le nom de la langue ne se trouve pas dans la liste qui suit, le modèle n'affiche rien.
  • directionLangue(frame) : Convertit en code de direction (rtl ou ltr) les codes ou noms français de langues.
  • lienLangue(frame) : À partir d'un code de langue, retourne un lien avec le nom descriptif de celle-ci et pointant vers son article.
  • nomLangue(frame) : À partir d'un code de langue, retourne le nom descriptif de celle-ci.
  • articleLangue(frame) : À partir d'un code de langue, retourne le titre de l'article concernant celle-ci.
  • lang(frame) : Indique la langue d’un texte dans le code HTML, notamment pour les synthétiseurs vocaux et l’indexation correcte des inclusions de mots en langue différente par les moteurs de recherche.
  • langue(frame) : Similaire à lang mais permet d’employer dans certains cas le nom de la langue en toutes lettres.
  • indicationDeLangue(frame) : Utilisable comme métamodèle pour créer des indications de langue (cf. (fr), (de)etc.).
  • indicationMultilingue(frame) : Similaire à indicationDeLangue à l'exception qu'elle indique plusieurs langues. Sans paramètre, (mul) est indiqué.
  • langueAvecNom(frame) : Indique le nom de la langue avant un court texte dans une langue donnée et met le texte en langue étrangère entre balises xml:lang. Similaire à indicationDeLangue mais avec la détermination automatique du nom et de la direction de la langue. Elle est donc un peu moins rapide.
  • tableauLangues(frame) : Génère un tableau triable de la liste des langues disponibles dans Module:langue/Data.

Modules externes et autres éléments dont ce module a besoin pour fonctionner :

  • Module:Langue/Data : Base de données avec les codes et les noms des langues les plus courantes.

Exemples

Pour des exemples, voir la page de test permettant de tester diverses modifications apportées.

Voir aussi

-- luacheck: globals mw, no max line lengthlocal Langue = { }local dataLangue = mw.loadData( 'Module:Langue/Data' )-- attention, plusieurs modules cherchent « class="error" » pour détecter si ce module a retourné une erreur-- pour trouver ces codes, on peut rechercher dans le namespace Module : insource:Langue insource:/(find|match)\([^)]+error/local langErrorMess = '<span class="error">langue non reconnue : %s</span>'-- premierParametre renvoie le premier paramètre de Frame, que celui-ci ait été passé au module par invoke, directement au modèle,-- ou à l'intérieur d'un module sous forme de string dans un tableau ou directement de string.-- Si aucun de ces arguments ne contient de chaine, la fonction renvoie nil.-- Si le deuxième paramètre est true, la chaine est renvoyée trimée et en minuscules.local function premierParametre( frame, lowerCase )local argif type( frame ) == 'table' thenarg = ( frame.getParent and ( frame.args[1] or frame:getParent().args[1] ) ) or frame[1]elseif type( frame ) == 'string' thenarg = frameendif type( arg ) ~= 'string' thenarg = nilendif arg and lowerCase thenarg = mw.ustring.lower( mw.text.trim( arg ) )endreturn argend-- determinationCode retourne une table contenant le code de langue principal et la liste des subcodes-- si le code de langue principal n'est pas reconnu, retourne nil.function Langue.determinationCode( langue )if type( langue ) == 'string' and langue ~= '' thenlocal tabCode = mw.text.split( langue, '-' )local tabLangue = dataLangue[ mw.ustring.lower( tabCode[1] ) ]if tabLangue and tabLangue.code thentabCode[1] = tabLangue.codeif tabLangue.invalide thentabCode.invalide=trueendreturn tabCodeendendend-- Voir Modèle:Code langue-- Paramètre :--     1  : nom de langue.function Langue.codeLangue( frame )local arg = premierParametre( frame, true )local tabCode = Langue.determinationCode( arg )return ( tabCode and table.concat( tabCode, '-' ) ) or arg or ''end-- Voir Modèle:Code langue 2-- Paramètre :--     1  : nom de langue.function Langue.codeLangue2( frame )local arg = premierParametre( frame, true )local tabCode = Langue.determinationCode( arg )return ( tabCode and table.concat( tabCode, '-' ) ) or ''end-- Voir Modèle:Direction langue-- Paramètre :--     1  : nom de langue ou code IETF.function Langue.directionLangue( frame )local arg = premierParametre( frame, true )if type( arg ) ~= 'string' or arg == '' thenreturn 'ltr'end-- séparation du code de langue en code principal et les différents subcodes.local tabCode = Langue.determinationCode( arg )if tabCode then-- on essaye de savoir si la direction est de droite à gauchelocal codeScript = tabCode[2]if codeScript and string.len( codeScript ) == 4 and dataLangue[ 'rtl script' ] then-- il y a un subcode d'écriture, c'est lui qui est pris en comptecodeScript = string.upper( string.sub( codeScript, 1, 1 ) ) .. string.sub( codeScript, 2 )if dataLangue[ 'rtl script' ][ codeScript ] thenreturn 'rtl'endelse-- il n'y a pas de subcode d'écriture, on prend en compte le code de langue principal.local tabLangue = dataLangue[ tabCode[1] ]if tabLangue and tabLangue.rtl thenreturn 'rtl'endendend-- la langue n'est pas écrite de droite à gauche, donc ltr.return 'ltr'endlocal function getDataLangue( frame )-- Obtenir le code de la languelocal codeLangue = premierParametre( frame, true )-- Si le paramètre est incorrect, retourner un message d'erreurif type( codeLangue ) ~= 'string' or codeLangue == '' thenreturn nil, '<span class="error">langue non précisée</span>'end-- Obtenir le tableau contenant les informations sur la languelocal tabLangue = dataLangue[ codeLangue ]-- Si le code étendu n'est pas trouvé, chercher à nouveau avec le code racineif not tabLangue thentabLangue = dataLangue[ mw.ustring.match( codeLangue, '^(%a-)%-' ) ]end-- Si on n'a toujours rien trouvé, retourner un message d'erreurif not tabLangue thenreturn nil, langErrorMess:format( codeLangue )endreturn tabLangueend-- Fonction fournissant un wikilien vers l'article-- traitant d'une langue à partir de son code.-- Voir Modèle:Lien langue-- Paramètre :--     1  : code IETF de langue.function Langue.lienLangue( frame )local tabLangue, erreur = getDataLangue( frame )if not tabLangue thenreturn erreurend-- Créer un lien pour la langue depuis le tableauif type( tabLangue.page ) == 'string' thenif tabLangue.page ~= '' thenreturn '[[' .. tabLangue.page .. '|' .. tabLangue.nom .. ']]'elsereturn tabLangue.nomendelsereturn '[[' .. tabLangue.nom .. ']]'endend-- Fonction permettant de récupérer le nom d'une langue à partir de son code.-- Voir Modèle:Nom langue-- Paramètre :--     1  : code IETF de langue.-- Retourne :--     Le nom de la langue, un message d'erreur sinon.function Langue.nomLangue( frame )local tabLangue, erreur = getDataLangue( frame )if not tabLangue thenreturn erreurend-- Extraire le nom de la langue depuis le tableaureturn tabLangue.nomend-- Fonction permettant de récupérer le nom de l'article-- portant sur une langue à partir de son code.-- Voir Modèle:Article langue-- Paramètre :--     1  : code IETF de langue.-- Retourne :--     Le nom de l'article portant sur la langue--     si le code est trouvé, un message d'erreur sinon.function Langue.articleLangue( frame )local tabLangue, erreur = getDataLangue( frame )if not tabLangue thenreturn erreurend-- Extraire le titre de l'article depuis le tableauif type( tabLangue.page ) == 'string' and tabLangue.page ~= '' thenreturn tabLangue.pageelsereturn tabLangue.nomendend-- Voir Modèle:Langue-- Paramètres :--    1 : code IETF de langue ;--    texte ou 2 : texte dans cette langue ;--    trans : translittération du texte ;--    dir : direction de la langue (obsolète : peut être en paramètre 1, avec code en 2 et texte en 3).function Langue.langue( frame )local args = ( frame.getParent and frame:getParent().args ) or frame         -- préparation pour appel par modèle ou direct.local code = mw.ustring.lower( mw.text.trim( args[1] or '' ) )local texte = args.texte or ''if texte == '' thentexte = args[2] or ''endlocal dir = args.dirlocal namespaceCategorisation = { [0] = true, [4] = true, [10] = true, [12] = true, [14] = true, [100] = true }local categorisation = namespaceCategorisation[ mw.title.getCurrentTitle().namespace ] and not args.nocat-- Décalage des paramètres si code contient la direction du texte (obsolète mais toujours possible).if code == 'ltr' or code == 'rtl' thendir = codecode = mw.ustring.lower( mw.text.trim( args[2] ) or '' )texte = args[3] or ''endlocal codeArg = code-- sortie immédiate s'il n'y a pas de texteif texte == '' thenif categorisation thenreturn '<span class="error">erreur du modèle [[modèle:Langue|{{langue}}]] : texte absent</span>[[Catégorie:Page utilisant un modèle avec une syntaxe erronée|Langue]]'elsereturn ''endend-- récursion si texte contient des blocsif texte:match('\n *\n') or texte:match('\n[*#:]') then-- les parenthèses permettent d'éliminer la seconde valeur retournée par gsub (nombre de remplacements)return ( texte:gsub('(\n?[*#:]?%s*)([^\n]+)',function ( init, ligne )return init .. Langue.langue{ code, ligne }end) )end-- Si la langue est reconnue, la valeur de la table est prise en compte (permet de corriger les noms de langue en toutes lettres).local tabCode = Langue.determinationCode( code )local tabLangueif tabCode thencode = table.concat( tabCode, '-' )tabLangue = dataLangue[ tabCode[1] ]local codeScript = tabCode[2]-- Si codeScript est bien un style d'écriture (len = 4) on applique sa directionif codeScript and  string.len( codeScript ) == 4 and dataLangue[ 'rtl script' ] then-- formatage type Latn correspondant au fromat dans dataLangue[ 'rtl script' ]codeScript = string.upper( string.sub(  codeScript, 1, 1 ) ) .. string.sub(  codeScript, 2 )tabLangue = { code = tabLangue.code,rtl = dataLangue[ 'rtl script' ][ codeScript ],invalide = tabLangue.invalide}endend-- Préparation du rendu de direction du texte.dir = dir and dir:lower()if dir ~= 'ltr' and dir ~= 'rtl' thendir = ( tabLangue and tabLangue.rtl and 'rtl' )end-- Compilation du texte à retourner.local html = mw.html.create( '' )if code == '' thenhtml:wikitext( texte )elselocal span = mw.html.create( 'span' ):addClass( 'lang-' .. code ):attr( 'lang', code ):attr( 'dir', dir ):wikitext( texte )if args.class and args.class ~= '' thenspan:addClass( args.class )endhtml:node( span )-- Translittération.if ( args.trans or '' ) ~= '' thenlocal trans = args.trans:gsub( "^''%f[^'](.+)%f[']''$", "%1" )html:wikitext( " (''" ):tag( 'span' ):addClass( 'transcription lang-' .. code ):attr( 'lang', code .. '-Latn' ):attr( 'dir', 'ltr' ):wikitext( trans ):done():wikitext( "'')" )endend-- Ajout de la catégorie Page avec code de langue invalide si le code langue non reconnu ou invalide.if categorisation and ( type( tabLangue ) ~= 'table' or tabCode.invalide ) thenlocal erreur = string.format( langErrorMess, codeArg )if codeArg == '' thenerreur = '<span class="error">langue non précisée</span>'endhtml:wikitext( '[[Catégorie:Page avec code de langue invalide|Langue]] ' .. erreur )endreturn tostring( html )end-- Alias nom de fonctionLangue.lang = Langue.langue-- Voir Modèle:Indication de langue-- Paramètres :--    1 : nom de langue ;--    2 : code IETF ;--    texte : texte dans cette langue ;--    dir : direction de la langue.function Langue.indicationDeLangue( frame )local args = ( frame.getParent and frame:getParent().args ) or framelocal nomLangue = mw.text.trim( args[1] or '' )local code = mw.text.trim( args[2] or '' )local texte = args.textelocal dir = args.dir-- Cas où le premier et/ou le deuxième paramètre est vide.if code == '' and nomLangue == '' thenreturn texteelseif nomLangue == '' thennomLangue = dataLangue[ mw.ustring.lower( code ) ]nomLangue = (nomLangue and nomLangue.nom or '???')elseif code == '' thencode = dataLangue[ nomLangue ]code = ( code and code.code or '' )if code == '' thenreturn texteendend-- Gestion du texte.if texte and texte ~= '' thentexte = '\194\160' .. Langue.lang{ code, dir = dir, texte = texte }elsetexte = ''end-- Compilation de l'indicateur de langue et du texte.local html = mw.html.create()html:tag( 'abbr' ):addClass( 'abbr' ):addClass( 'indicateur-langue' ):attr( 'title', 'Langue : ' .. nomLangue ):wikitext( '(' .. code .. ')' ):done():wikitext( texte )return tostring( html )end-- Voir Modèle:Mul-- Paramètres : codes IETF ou noms de langue, en nombre indéfini (string ou nil uniquement).function Langue.indicationMultilingue( frame )local args = (frame.getParent and frame:getParent().args) or framelocal listeNom = { }local listeCode = { }-- Valeur par défaut du premier paramètre = 'mul'.local code = mw.text.trim( args[1] or '' )if code == '' thencode = 'mul'endlocal maxLang = tonumber(args.maxLang) or nilif not args[2] and not dataLangue[ mw.ustring.lower( code ) ] thenlocal split = mw.text.split( code, '[+,;:/ .]+' )if #split > 1 thensplit.maxLang = maxLangreturn Langue.indicationMultilingue( split )endend-- Ajout des noms et codes de langue de chaque paramètre dans listeNom et ListeCode.local i = 1repeatcode = mw.ustring.lower( code )local tabLangue = dataLangue[ code ]if not tabLangue thencode = mw.text.split( code, '-' )[1]tabLangue = dataLangue[ code ]endif type( tabLangue ) == 'table' thentable.insert( listeNom, tabLangue.nom )table.insert( listeCode, tabLangue.code )elsetable.insert( listeNom, '???' )local erreur = string.format( langErrorMess, code )table.insert( listeCode, erreur )endi = i + 1code = mw.text.trim( args[i] or '' )until code == ''-- Préparation et renvoi du texte.local n = #listeCodeif n == 0 thenreturn ''endif maxLang and n > maxLang thenlisteCode = {'mul'}endlocal plusieurs = ( n > 1 )local html = mw.html.create( 'abbr' ):addClass( 'abbr' ):addClass( 'indicateur-langue' ):attr( 'title', 'Langue' .. ( plusieurs and 's' or '' ) .. ' : ' .. mw.text.listToText( listeNom ) ):wikitext( '(' .. table.concat( listeCode, '\194\160+\194\160' ) .. ')' )return tostring( html )end-- Voir Modèle:Langue avec nom-- Paramètres :--    1 : code IETF de langue ;--    texte ou 2 : texte dans cette langue ;--    trans : translittération du texte ;--    dir : direction de la langue.function Langue.langueAvecNom( frame )local args = ( frame.getParent and frame:getParent().args ) or framelocal code = mw.ustring.lower( mw.text.trim( args [1] or '') )local texte = args.texte or args[2] or ''local trans = args.translocal dir = args.dir-- Détection de la direction du texte.if code == 'ltr' or code == 'rtl' thendir = codecode = mw.ustring.lower( mw.text.trim( args[2] ) )texte = args[3] or ''end-- Définition du nom de la langue en français.local nom = Langue.lienLangue{ code }if texte ~= '' thentexte = ' ' .. Langue.lang{ code, dir = dir, texte = texte, trans = trans }endreturn nom .. ' :' .. texteend----- latinOnly détermine si la chaine fournie contient uniquement des caractères latin (étendu, unicode < 880)function Langue.nonLatin( frame )local texte = premierParametre( frame )for codepoint in mw.ustring.gcodepoint( texte ) doif codepoint > 879 and not (                  --  > 036Fcodepoint > 7423 and codepoint < 7936 or  -- suppléments phonétique, diacritiques et latin  (1D00 à 1EFF)codepoint > 8191 and codepoint < 11392 or -- espace, indices, monaies et symboles divers (2000 à 2C7F)codepoint > 42783 and codepoint < 43008   -- latin étendu D  (A720 à A7FF)) thenreturn trueendendreturn falseend-- erreurModuleData affiche un message d'erreur si le Module:Langue/Data n'a pas été chargé correctement,-- pour la page de discussion de la base de données et ceux qui veulent surveiller cette page.function Langue.erreurModuleData()if type( dataLangue ) ~= 'table' thenlocal message = [[<strong class="error">Le chargement du module Langue/Data génère une erreur.</strong> <br><span class="error">Cette erreur doit être corrigée au plus vite car des milliers de pages ne s'affichent pas correctement.</span>]]return messageendend-- tableauLangues génère un tableau triable de la liste des langues disponible dans Module:langue/Data.function Langue.tableauLangues()local tableau = { }local entete = [[{| class="wikitable alternance sortable"|-!scope=col|Alias!scope=col|Code IETF!scope=col|Nom principal!scope=col|Titre de l'article<br>(si différent du nom)!scope=col|Lien vers l'article!scope=col|RTL!scope=col|Invalide]]local ligneTab, ligneSrtfor k, v in pairs( dataLangue ) doif v.code thenligneTab = {k,v.code,v.nom,v.page or '',Langue.lienLangue(v.code),v.rtl and '[[Fichier:Yes check.svg|15px|oui|lien=]]' or '',v.invalide and '[[Fichier:Yes check.svg|15px|oui|lien=]]' or '',}ligneSrt = table.concat( ligneTab, '\n|' )table.insert( tableau, ligneSrt )endendtable.sort( tableau )table.insert( tableau, 1, entete )table.insert( tableau, '}' )return table.concat( tableau, '\n|-\n|' )end-- listeCodeAlias génère une liste ; les langues sont de la forme : * code : alias1, alias2function Langue.listeCodeAlias()local languesTab, listeCodesAlias = { }, { }local code, alias, codeAliasfor k, v in pairs( dataLangue ) do-- on construit un table avec pour indices les codes de langue, et pour valeurs une table avec la liste des aliascode = v.codeif code and not v.invalide thenlanguesTab[code] = languesTab[code] or { }if k ~= mw.ustring.lower( code ) thentable.insert( languesTab[code], k )endendendfor k, v in pairs( languesTab ) do-- transformation en un table séquence, avec pour valeur une chaine correspondant à une ligne de la listealias = table.concat( v, ', ' )if alias == '' thencodeAlias = '* <code>' .. k .. '</code>'elsecodeAlias = '* <code>' .. k .. '</code> : ' .. aliasendtable.insert( listeCodesAlias, codeAlias )endtable.sort( listeCodesAlias )return table.concat( listeCodesAlias, '\n' )end-- listeAliasCode génère une liste ; les langues sont de la forme :  * alias : codefunction Langue.listeAliasCode()local languesTab = { }local codefor k, v in pairs( dataLangue ) do-- on construit un table avec pour indices les codes de langue, et pour valeurs une table avec la liste des aliascode = v.codeif code and k ~= code and not v.invalide thentable.insert( languesTab, '* ' .. k .. ' = ' .. code )endendtable.sort( languesTab )return table.concat( languesTab, '\n' )endreturn Langue