diff --git a/outils/stats-corpus/README.md b/outils/stats-corpus/README.md index 5bbe950..bb531c4 100644 --- a/outils/stats-corpus/README.md +++ b/outils/stats-corpus/README.md @@ -10,47 +10,73 @@ Si les fichiers XML éditeurs ont été extraits, il permet aussi de vérifier s’ils ont ou non les documents sous forme de texte structuré. -Le résultat comprend, en plus de l’en-tête, une ligne par document avec des champs séparés par -des tabulations (format TSV). +Le résultat comprend, en plus de l’en-tête, une ligne par document avec des champs séparés +par des tabulations (format [TSV](https://fr.wikipedia.org/wiki/Tabulation-separated_values)) ou des points-virgules (format [CSV](https://fr.wikipedia.org/wiki/Comma-separated_values)). ### Usage ``` - statsCorpus.pl -l logfile -c fichier.corpus [ -r répertoireXML ] [ -s sortie ] - statsCorpus.pl -m répertoireJSON [ -r répertoireXML ] [ -s sortie ] + statsCorpus.pl -l logfile -c fichier.corpus [ -r répertoireXML ] [ -s sortie ] + [ -f (tsv|csv) ] [ -x (normal|lodex) ] + statsCorpus.pl -m répertoireJSON [ -r répertoireXML ] [ -s sortie ] [ -f (tsv|csv) ] + [ -x (normal|lodex) ] statsCorpus.pl -h ``` ### Options ``` + -c indique le nom du fichier “.corpus” généré par le programme “harvestCorpus.pl” + permettant de faire le lien entre l’identifiant ISTEX d’un document et le nom des + fichiers extraits correspondants. + -h affiche l’aide. -l indique le nom du fichier “logfile” contenant les métadonnées ISTEX au format JSON créé par l’option “-v” du programme “harvestCorpus.pl”. Par défaut, ce fichier s’appelle “logRequete.txt” et se trouve dans le répertoire des fichiers déchargés depuis le serveur ISTEX. - -c indique le nom du fichier “.corpus” généré par le programme “harvestCorpus.pl” permettant - de faire le lien entre l’identifiant ISTEX d’un document et le nom des fichiers - extraits correspondants. - -h affiche l’aide. -m indique le répertoire où se trouve les fichiers de métadonnées au format JSON déchargés par le programme “harvestCorpus.pl”. -r indique le répertoire où se trouve les fichiers XML éditeurs obtenus à partir des fichiers ZIP déchargés par le programme “harvestCorpus.pl”. Si les fichiers XML sont dans le même répertoire que les fichiers JSON, l’option “-m” seule suffit. - -s indique le nom du fichier de sortie. Sinon, la sortie se fait sur la sortie standard. + -s indique le nom du fichier de sortie. Sinon, la sortie se fait sur la sortie standard. + Si l’extension du nom de fichier est “.tsv” ou “.csv”, le format correspondant sera + utilisé sans avoir à le spécifier à l’aide de l’option “-f”. + -x étend la liste des champs affichés, soit en mode normal, soit en mode “lodex”, + c'est-à-dire avec un lien, affiché en exposant, entre auteurs et affiliations. ``` ### Exemple + +#### 1 - Liste originale + +> Statistiques à partir du fichier `logRequete.txt` et du fichier `.corpus` correspondant, les fichiers XML éditeurs étant dans le répertoire `Arthropodes`. Le résultat, sur la sortie standard, est au format [**TSV**](https://fr.wikipedia.org/wiki/Tabulation-separated_values). + ``` statsCorpus.pl -l Arthropodes/logRequete.txt -c Arthropodes_v2b.corpus -r Arthropodes +``` + +> Statistiques à partir des fichiers de métadonnées au format JSON extraits par `harvestCorpus.pl` et présents dans le répertoire `Vieillissement` tout comme les fichiers XML éditeurs. Les deux commandes donnent le même résultat, ici dans le fichier `Vieil.tsv`, au format TSV. +``` statsCorpus.pl -m Vieillissement -r Vieillissement -s Vieil.tsv - statsCorpus.pl -m Vieillissement -s Vieil.tsv (identique au précédent) + statsCorpus.pl -m Vieillissement -s Vieil.tsv +``` + +#### 2 - Liste étendue + +> Même cas que prédédemment, mais avec une sortie au format [**CSV**](https://fr.wikipedia.org/wiki/Comma-separated_values) et une liste de champs adaptée à l’application [**Lodex**](http://lodex.inist.fr/). Si le résultat est le même avec ces deux commandes, le nom du fichier de sortie est lui différent, ce qui a permis de ne pas utiliser l’option `-f` pour avoir le format CSV dans le deuxième exemple. +``` + statsCorpus.pl -m Vieillissement -s Vieil.txt -f csv -x lodex + statsCorpus.pl -m Vieillissement -s Vieil.csv -x lodex + ``` ### Données extraites -Pour l’instant, on a 18 champs : +#### 1 - Liste originale + +Cette liste comprend, pour l’instant, 18 champs : * Identifiant ISTEX - * Identifiant ARK + * Identifiant [ARK](https://api.istex.fr/documentation/ark/) * Nom de fichier * Éditeur * Score de qualité (donnée ISTEX) @@ -68,3 +94,35 @@ * Catégories Scopus * Catégories INIST +#### 2 - Liste étendue + +À l'aide de l’option `-x`, on peut étendre cette liste à 27 champs présentés dans un ordre différent pour les besoins de l’application [**Lodex**](http://lodex.inist.fr/) : + + * Nom de fichier + * Titre du document + * Auteur(s) + * Affiliation(s) + * Titre du périodique ou de la monographie + * ISSN + * e-ISSN + * ISBN + * e-ISBN + * Éditeur + * Type de publication (par exemple “journal”) + * Type de document (par exemple “research-article”) + * Année de publication + * Langue(s) du document + * Résumé + * Mots-clés d'auteur + * Catégories Web of Science + * Catégories Science-Metrix + * Catégories Scopus + * Catégories INIST + * Score de qualité (donnée ISTEX) + * Version PDF + * XML structuré (“Oui”, “Non”, “Absent” ou “Indéterminé”) + * Identifiant ISTEX + * Identifiant [ARK](https://api.istex.fr/documentation/ark/) + * Identifiant [DOI](https://fr.wikipedia.org/wiki/Digital_Object_Identifier) + * Identifiant PMID + diff --git a/outils/stats-corpus/statsCorpus.pl b/outils/stats-corpus/statsCorpus.pl index 45dc422..e408559 100755 --- a/outils/stats-corpus/statsCorpus.pl +++ b/outils/stats-corpus/statsCorpus.pl @@ -17,9 +17,10 @@ ## use Text::Unidecode; my ($programme) = $0 =~ m|^(?:.*/)?(.+)|; +my $substitut = " " x length($programme); -my $version = "1.6.1"; -my $dateModif = "26 Mars 2018"; +my $version = "2.0.1"; +my $dateModif = "4 Avril 2018"; # Variables my $aide = 0; @@ -29,58 +30,121 @@ my $prefixe = ""; my $repertoire = ""; my $sortie = ""; +my $type = ""; +my $xtended = ""; eval { $SIG{__WARN__} = sub {usage(1);}; GetOptions( "corpus=s" => \$corpus, + "format=s" => \$type, "help" => \$aide, "logfile=s" => \$logfile, "metadonnees=s" => \$metadata, "prefixe=s" => \$prefixe, "repertoire=s" => \$repertoire, "sortie=s" => \$sortie, + "xtended=s" => \$xtended, ); }; $SIG{__WARN__} = sub {warn $_[0];}; -# “ machin ” + if ( $aide ) { - print "Programme : \n “$programme”, version $version ($dateModif)\n"; + print "Programme : \n"; + print " “$programme”, version $version ($dateModif)\n"; print " Permet de faire des statistiques sur les fichiers extraits d’ISTEX en utilisant le fichier \n"; print " de métadonnées “logRequete.txt” (cf. l’option “-v” du programme “harvestCorpus.pl”) ou les \n"; print " fichiers de métadonnées JSON correspondants aux documents extraits. \n"; print " Si les fichiers XML éditeurs ont été extraits, il permet aussi de vérifier s’ils ont ou non \n"; print " les documents sous forme de texte structuré. \n"; - print "\nUsage : \n $programme -l logfile -c fichier.corpus [ -r répertoireXML ] [ -s sortie ]\n"; + print "\nUsage : \n"; + print " $programme -l logfile -c fichier.corpus [ -r répertoireXML ] [ -s sortie ]\n"; + print " $substitut [ -f (tsv|csv) ] [ -x (normal|lodex) ] \n"; print " $programme -m répertoireJSON [ -r répertoireXML ] [ -s sortie ]\n"; + print " $substitut [ -f (tsv|csv) ] [ -x (normal|lodex) ] \n"; print " $programme -h\n"; print "\nOptions : \n"; - print " -l indique le nom du fichier “logfile” contenant les métadonnées ISTEX au format JSON \n"; - print " créé par l’option “-v” du programme “harvestCorpus.pl”. \n"; - print " Par défaut, ce fichier s’appelle “logRequete.txt” et se trouve dans le répertoire des \n"; - print " fichiers déchargés depuis le serveur ISTEX. \n"; print " -c indique le nom du fichier “.corpus” généré par le programme “harvestCorpus.pl” permettant \n"; - print " de faire le lien entre l’identifiant ISTEX d’un document et le nom des fichiers \n"; + print " de faire le lien entre l’identifiant ISTEX ou ARK d’un document et le nom des fichiers \n"; print " extraits correspondants.\n"; + print " -f indique le format de sortie, à savoir TSV (par défaut) ou CSV. \n"; print " -h affiche cette aide. \n"; + print " -l indique le nom du fichier “logfile” contenant les métadonnées ISTEX au format JSON \n"; + print " créé par l’option “-v” du programme “harvestCorpus.pl”. Par défaut, ce fichier \n"; + print " s’appelle “logRequete.txt” et se trouve dans le répertoire des fichiers déchargés \n"; + print " depuis le serveur ISTEX. \n"; print " -m indique le répertoire où se trouve les fichiers de métadonnées au format JSON déchargés \n"; - print " par le programme “harvestCorpus.pl”.\n"; + print " par le programme “harvestCorpus.pl” (what else?).\n"; # print " -p indique le préfixe utilisé au début du nom des fichiers déchargés par le programme \n"; # print " “harvestCorpus.pl”. \n"; print " -r indique le répertoire où se trouve les fichiers XML éditeurs obtenus à partir des \n"; print " fichiers ZIP déchargés par le programme “harvestCorpus.pl”. Si les fichiers XML sont \n"; print " dans le même répertoire que les fichiers JSON, l’option “-m” seule suffit. \n"; print " -s indique le nom du fichier de sortie. Sinon, la sortie se fait sur la sortie standard. \n"; + print " Si l'extension du fichier de sortie est “.tsv” ou “.csv”, le format correspondant est \n"; + print " utilisé. \n"; + print " -x étend la liste des champs affichés, soit en mode normal, soit en mode “lodex”, \n"; + print " c'est-à-dire avec un lien, affiché en exposant, entre auteurs et affiliations. \n"; print "\nExemples : \n"; print " $programme -l Arthropodes/logRequete.txt -c Arthropodes_v2b.corpus -r Arthropodes\n"; print " $programme -m Vieillissement -r Vieillissement -s Vieil.tsv \n"; - print " $programme -m Vieillissement -s Vieil.tsv (identique au précédent)\n\n"; + print " $programme -m Vieillissement -s Vieil.tsv (identique au précédent)\n"; + print " $programme -m Vieillissement -s Vieil.txt -f csv -x lodex (en CSV, prêt pour Lodex)\n"; + print " $programme -m Vieillissement -s Vieil.csv -x lodex (idem)\n"; + print " \n"; exit 0; } -usage(2) if not $logfile and (not $metadata or not -d $metadata); +# Premier test sur la présence des options obligatoires +usage(2) if $logfile and not $corpus; +usage(2) if $corpus and not $logfile; +usage(2) if not $logfile and not $metadata; +if ( $metadata and not -d $metadata ) { + print STDERR "$programme : le répertoire \"$metadata\" n’existe pas !\n"; + exit 3; + } +# Test sur le format de sortie +if ( $type ) { + if ( $type !~ /^[ct]sv\z/oi ) { + print STDERR "$programme : le format de fichier \"$type\" n’est pas correct !\n"; + usage(4); + } + $type = lc($type); + } + +# Test de l’existence d’un nom de fichier de sortie +# et de son extension avant ouverture de celui-ci +if ( $sortie ) { + if ( $sortie =~ /\.([ct]sv)\z/oi ) { + my $tmp = lc($1); + if ( $type and $type ne $tmp ) { + print STDERR "$programme : le format \"$type\" et l’extension \"$tmp\" ne sont pas compatible !\n"; + exit 5; + } + $type = $tmp; + } + open(OUT, ">:utf8", $sortie) or die "\"$sortie\" : $!,"; + } +# Ou bien, renvoi sur la sortie standard +else { + open(OUT, ">&STDOUT") or die "$!,"; + binmode(OUT, ">:utf8"); + } + +$type = "tsv" if not $type; + +if ( $xtended ) { + if ( $xtended !~ /^(normal|lodex)\z/oi ) { + print STDERR "$programme : mauvais argument pour l’option “-x” !\n"; + usage(6); + } + $xtended = lc ($xtended); + } + +# Autres variables globales +my $entete = ""; my $format = ""; my $json = ""; my $racine = ""; @@ -88,7 +152,57 @@ my $total = 0; my %racine = (); -if ( $corpus ) { +# Verbalisation des codes langues ISO 639-2 +my %langue = langues(); + +# Liste des noms des éditeurs +my %nom = ( + "elsevier" => "Elsevier", + "wiley" => "Wiley", + "springer-journals" => "Springer (journals)", + "oup" => "OUP", + "cambridge" => "Cambridge", + "sage" => "Sage", + "bmj" => "BMJ", + "springer-ebooks" => "Springer (e-books)", + "iop" => "IOP", + "nature" => "Nature", + "rsc-journals" => "RSC (journals)", + "degruyter-journals" => "Degruyter (journals)", + "ecco" => "ECCO", + "edp-sciences" => "EDP Sciences", + "emerald" => "Emerald", + "brill-journals" => "Brill (journals)", + "eebo" => "EEBO", + "rsc-ebooks" => "RSC (e-books)", + "brill-hacco" => "Brill HACCO", + "gsl" => "GSL", + "numerique-premium" => "Numérique Premium", + ); + +if ( $xtended ) { + $entete = "Nom de fichier\tTitre\tAuteur(s)\tAffiliation(s)\tRevue ou monographie\tISSN\te-ISSN" . + "\tISBN\te-ISBN\tÉditeur\tType de publication\tType de document\tDate de publication" . + "\tLangue(s) du document\tRésumé\tMots-clés d’auteur\tCatégories WoS\t" . + "Catégories Science-Metrix\tCatégories Scopus\tCatégories INIST\tScore qualité\t" . + "Version PDF\tXML structuré\tIdentifiant ISTEX\tARK\tDOI\tPMID"; + } +else { + $entete = "Identifiant ISTEX\tARK\tNom de fichier\tÉditeur\tScore qualité\tVersion PDF" . + "\tXML structuré\tDate de publication\tTitre\tRevue\tISSN\te-ISSN\tType de publication" . + "\tType de document\tCatégories WoS\tCatégories Science-Metrix\tCatégories Scopus\t" . + "Catégories INIST"; + } + +if ( $type eq "csv" ) { + print OUT "\x{FEFF}" . tsv2csv($entete) . "\n"; + } +else { + print OUT "\x{FEFF}$entete\n"; + } + +if ( $logfile ) { + # Lecture du fichier “.corpus” ... open(TAB, "<:utf8", $corpus) or die "$!,"; while() { if ( /^(ark|id) /o ) { @@ -102,45 +216,8 @@ } } close TAB; - } -my %nom = ( - "elsevier" => "Elsevier", - "wiley" => "Wiley", - "springer-journals" => "Springer (journals)", - "oup" => "OUP", - "cambridge" => "Cambridge", - "sage" => "Sage", - "bmj" => "BMJ", - "springer-ebooks" => "Springer (e-books)", - "iop" => "IOP", - "nature" => "Nature", - "rsc-journals" => "RSC (journals)", - "degruyter-journals" => "Degruyter (journals)", - "ecco" => "ECCO", - "edp-sciences" => "EDP Sciences", - "emerald" => "Emerald", - "brill-journals" => "Brill (journals)", - "eebo" => "EEBO", - "rsc-ebooks" => "RSC (e-books)", - "brill-hacco" => "Brill HACCO", - "gsl" => "GSL", - "numerique-premium" => "Numérique Premium", - ); - -if ( $sortie ) { - open(OUT, ">:utf8", $sortie) or die "\"$sortie\" : $!,"; - } -else { - open(OUT, ">&STDOUT") or die "$!,"; - binmode(OUT, ">:utf8"); - } -print OUT "\x{FEFF}Identifiant ISTEX\tARK\tNom de fichier\tÉditeur\tScore qualité\tVersion PDF"; -print OUT "\tXML structuré\tDate de publication\tTitre\tRevue\tISSN\te-ISSN\tType de publication"; -print OUT "\tType de document\tCatégories WoS\tCatégories Science-Metrix\tCatégories Scopus\t"; -print OUT "Catégories INIST\n"; - -if ( $logfile ) { + # ... avant la lecture du fichier “logRequete” open(INP, "<:raw", $logfile) or die "$!,"; while() { if ( /^# (\w+_?\d+)/ ) { @@ -199,7 +276,9 @@ sub usage { print STDERR "Usage : $programme -l logfile -c fichier.corpus [ -r répertoireXML ] [ -s sortie ] \n"; +print STDERR " [ -f (tsv|csv) ] [ -x (normal|lodex) ] \n"; print STDERR " $programme -m répertoireJSON [ -r répertoireXML ] [ -s sortie ] \n"; +print STDERR " [ -f (tsv|csv) ] [ -x (normal|lodex) ] \n"; print STDERR " $programme -h \n"; exit shift; @@ -245,13 +324,40 @@ if ( $nom{$nom} ) { $nom = $nom{$nom}; } + +# À REVOIR !!! my $date = ""; +my $copyrightDate = ""; +my $publicationDate = ""; + if ( $hit{'copyrightDate'} ) { - $date = $hit{'copyrightDate'}; + $copyrightDate = $hit{'copyrightDate'}; } -elsif ( $hit{'publicationDate'} ) { - $date = $hit{'publicationDate'}; +if ( $hit{'publicationDate'} ) { + $publicationDate = $hit{'publicationDate'}; } +if ( $copyrightDate and $publicationDate ) { + if ( $copyrightDate == $publicationDate ) { + $date = $copyrightDate; + } + elsif ( $copyrightDate =~ /^[12]\d\d\d\z/o ) { + $date = $copyrightDate; + } + else { + $date = $publicationDate; + } + } +elsif ( $copyrightDate ) { + $date = $copyrightDate; + } +elsif ( $publicationDate ) { + $date = $publicationDate; + } +else { + $date = "S.D."; + } + + my $langues = ""; if ( defined $hit{'language'} ) { $langues = join(" ; ", @{$hit{'language'}}); @@ -291,6 +397,8 @@ } } my $revue = ""; +my $isbn = ""; +my $eisbn = ""; my $issn = ""; my $eissn = ""; my $dt = ""; @@ -299,6 +407,12 @@ if ( defined $host{'title'} ) { $revue = $host{'title'} } + if ( defined $host{'isbn'} ) { + $isbn = join("/", @{$host{'isbn'}}); + } + if ( defined $host{'eisbn'} ) { + $eisbn = join("/", @{$host{'eisbn'}}); + } if ( defined $host{'issn'} ) { $issn = join("/", @{$host{'issn'}}); } @@ -364,6 +478,185 @@ $structure = "Indéterminé"; } } -print OUT "$id\t$ark\t$fichier\t$nom\t$score\t$pdfVersion\t$structure\t$date\t$titre"; -print OUT "\t$revue\t$issn\t$eissn\t$dt\t$genre\t$wos\t$scienceMetrix\t$scopus\t$inist\n"; + +if ( $xtended ) { + # Variables spécifiques à l'affichage étendu + my $auteurs = ""; + my $affiliations = ""; + my $langues = ""; + my $resume = ""; + my $motscles = ""; + my $doi = ""; + my $pmid = " "; + if ( $hit{'author'} ) { + my @authors = @{$hit{'author'}}; + my @names = (); + my @affiliations = (); + my %affiliations = (); + my %lien = (); + foreach my $author (@authors) { + my %author = %{$author}; + if ( $author{'name'} ) { + push(@names, $author{'name'}); + } + if ( $author{'affiliations'} ) { + foreach my $affiliation (@{$author{'affiliations'}}) { + next if $affiliation =~ /^\s*e-mail\s?:\s/io; + if ( not $affiliations{$affiliation} ) { + push(@affiliations, $affiliation); + $affiliations{$affiliation} = $#affiliations + 1; + } + if ( $author{'name'} ) { + $lien{$#names + 1}{$affiliations{$affiliation}} ++; + } + } + } + } + if ( @names ) { + if ( $#names > 0 and $xtended eq 'lodex' ) { + for ( my $n = 0 ; $n <= $#names ; $n ++ ) { + my $tmp = join(", ", sort {$a <=> $b} keys %{$lien{$n + 1}}); + if ( $tmp ) { + $names[$n] .= " $tmp"; + } + } + } + $auteurs = join(" ; ", @names); + } + if ( @affiliations ) { + if ( $#names > 0 and $xtended eq 'lodex' ) { + for ( my $n = 0 ; $n <= $#affiliations ; $n ++ ) { + $affiliations[$n] = $n + 1 . ") $affiliations[$n]"; + } + } + $affiliations = join(" ; ", @affiliations); + } + } + if ( $hit{'language'} ) { + my @langues = @{$hit{'language'}}; + foreach my $item (@langues) { + if ( $langue{$item} ) { + $item = $langue{$item}; + } + else { + print STDERR "Attention : pas de verbalisation pour le code langue \"$item\"\n"; + } + } + $langues = join(" ; ", @langues); + } + if ( $hit{'abstract'} ) { + $resume = $hit{'abstract'}; + $resume =~ s/^(abstract|summary)\s*:\s*//io; + } + if ( $hit{'doi'} ) { + $doi = join(" ; ", @{$hit{'doi'}}); + } + if ( $hit{'pmid'} ) { + $pmid = join(" ; ", @{$hit{'pmid'}}); + } + if ( $hit{'subject'} ) { + my @tmp = (); + foreach my $subject (@{$hit{'subject'}}) { + my %subject = %{$subject}; + if ( $subject{'value'} ) { + push(@tmp, $subject{'value'}) + } + } + my %tmp = (); + $motscles = join(" ; ", grep {not $tmp{$_} ++;} @tmp); + } + + my $ligne = "$fichier\t$titre\t$auteurs\t$affiliations\t$revue\t$issn\t$eissn\t"; + $ligne .= "$isbn\t$eisbn\t$nom\t$dt\t$genre\t$date\t$langues\t$resume\t"; + $ligne .= "$motscles\t$wos\t$scienceMetrix\t$scopus\t$inist\t$score\t$pdfVersion"; + $ligne .= "\t$structure\t$id\t$ark\t$doi\t$pmid"; + if ( $type eq "csv" ) { + print OUT tsv2csv($ligne), "\n"; + } + else { + print OUT "$ligne\n"; + } + } +else { + my $ligne = "$id\t$ark\t$fichier\t$nom\t$score\t$pdfVersion\t$structure\t$date\t$titre"; + $ligne .= "\t$revue\t$issn\t$eissn\t$dt\t$genre\t$wos\t$scienceMetrix\t$scopus\t$inist\n"; + if ( $type eq "csv" ) { + print OUT tsv2csv($ligne), "\n"; + } + else { + print OUT "$ligne\n"; + } + } } + +sub tsv2csv +{ +my $ligne = shift; + +my @champs = split(/\t/, $ligne); +foreach my $champ (@champs) { + if ( $champ =~ /[",;]/o ) { + $champ =~ s/"/""/go; + $champ = "\"$champ\""; + } + } + +return join(";", @champs); +} + +sub langues +{ +return ( + "alg" => "Langues algonquines", + "amh" => "Amharique", + "ang" => "Anglo-saxon (env.450-1100)", + "ara" => "Arabe", + "arc" => "Araméen d'empire (700-300 av. J.C.)", + "arm" => "Arménien", + "cat" => "Catalan", + "chi" => "Chinois", + "cze" => "Tchèque", + "dan" => "Danois", + "dut" => "Néerlandais", + "eng" => "Anglais", + "fre" => "Français", + "frm" => "Moyen français (1400-1600)", + "fro" => "Ancien français (842-env.1400)", + "ger" => "Allemand", + "gla" => "Gaélique écossais", + "gle" => "Irlandais", + "glg" => "Galicien", + "glv" => "Mannois", + "gmh" => "Moyen haut-allemand(env. 1050-1500)", + "grc" => "Grec ancien (jusqu'en 1453)", + "gre" => "Grec moderne", + "heb" => "Hébreu", + "hun" => "Hongrois", + "ita" => "Italien", + "lat" => "Latin", + "lit" => "Lituanien", + "may" => "Malais", + "moh" => "Mohawk", + "mul" => "Multilingue", + "nai" => "Langues nord-amérindiennes", + "new" => "Newari", + "nor" => "Norvégien", + "pal" => "Pahlavi", + "peo" => "Vieux perse (env. 600-400 av. J.C.)", + "per" => "Persan", + "pol" => "Polonais", + "por" => "Portugais", + "roa" => "Langues romanes", + "rus" => "Russe", + "san" => "Sanskrit", + "sco" => "Écossais", + "spa" => "Espagnol", + "swe" => "Suédois", + "syr" => "Syriaque", + "tur" => "Turc", + "und" => "Indéterminé", + "unknown" => "Indéterminé", + "wel" => "Gallois", + "zxx" => "Pas de contenu linguistique", + ); +} \ No newline at end of file