From b1f09781766b2e06be115d10c8db1834677fd387 Mon Sep 17 00:00:00 2001 From: Matus Kasak Date: Mon, 16 Dec 2024 11:43:08 +0100 Subject: [PATCH 1/5] Started working on healthchecks candidates --- .../dspace/health/AdditionalInfoCheck.java | 27 ++++++++ .../src/main/java/org/dspace/health/Info.java | 67 +++++++++++++++++++ .../java/org/dspace/health/OAIPMHCheck.java | 31 +++++++++ .../main/java/org/dspace/health/PIDCheck.java | 15 +++++ .../org/dspace/health/ShibbolethCheck.java | 15 +++++ dspace/config/clarin-dspace.cfg | 2 + dspace/config/modules/healthcheck.cfg | 12 +++- 7 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 dspace-api/src/main/java/org/dspace/health/AdditionalInfoCheck.java create mode 100644 dspace-api/src/main/java/org/dspace/health/Info.java create mode 100644 dspace-api/src/main/java/org/dspace/health/OAIPMHCheck.java create mode 100644 dspace-api/src/main/java/org/dspace/health/PIDCheck.java create mode 100644 dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java diff --git a/dspace-api/src/main/java/org/dspace/health/AdditionalInfoCheck.java b/dspace-api/src/main/java/org/dspace/health/AdditionalInfoCheck.java new file mode 100644 index 000000000000..8b2a7567af35 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/AdditionalInfoCheck.java @@ -0,0 +1,27 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health; + +public class AdditionalInfoCheck extends Check { + + @Override + protected String run(ReportInfo ri) { + String output = ""; + + output += String.format( + "JVM uptime: %s\n", Info.get_jvm_uptime()); + output += String.format( + "Testing build time: %s\n", Info.get_build_time()); + + output += "\n\n"; + + output += "Example url 1: https://dev-5.pc:8443/repository/home\n"; + output += "Example url 2: https://dev-5.pc:85/repository/home\n"; + return output; + } +} diff --git a/dspace-api/src/main/java/org/dspace/health/Info.java b/dspace-api/src/main/java/org/dspace/health/Info.java new file mode 100644 index 000000000000..898f1f3d464b --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/Info.java @@ -0,0 +1,67 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health; + +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; +//import src.main.java.org.dspace.xoai.services.impl.config.DSpaceConfigurationService; + + +import java.io.FileInputStream; +import java.lang.management.ManagementFactory; +import java.lang.management.RuntimeMXBean; +import java.util.Scanner; + +public class Info { + + protected static final ConfigurationService configurationService + = DSpaceServicesFactory.getInstance().getConfigurationService(); + + final static public String get_proc_uptime() { + String uptime = "unknown"; + try { + //works only on linux + uptime = new Scanner(new FileInputStream("/proc/uptime")).next(); + System.out.println("\nUPTIME " + uptime); + float fuptime = Float.parseFloat( uptime ); + int seconds = (int) (fuptime % 60); + int minutes = (int) ((fuptime / 60) % 60); + int hours = (int) ((fuptime / (60 * 60)) % 24); + int days = (int) ((fuptime / (60 * 60 * 24)) ); + return Integer.toString( days ) + "d " + + Integer.toString( hours ) + "h:" + + Integer.toString( minutes ) + "m." + + Integer.toString( seconds ); + } catch (Exception e) { + return uptime; + } + } + + final static public String get_jvm_uptime() { + RuntimeMXBean mxBean = ManagementFactory.getRuntimeMXBean(); + long milliseconds = mxBean.getUptime(); + int seconds = (int) (milliseconds / 1000) % 60 ; + int minutes = (int) ((milliseconds / (1000 * 60)) % 60); + int hours = (int) ((milliseconds / (1000 * 60 * 60)) % 24); + int days = (int) ((milliseconds / (1000 * 60 * 60 * 24))); + + return Integer.toString( days ) + "d " + + Integer.toString( hours ) + "h:" + + Integer.toString( minutes ) + "m." + + Integer.toString( seconds ); + } + + final static public String get_build_time() { + //springacka do nespring triedy, chceme autowired, component + String buildTime = configurationService.getProperty("testing-config"); + if (buildTime != null && !buildTime.equals("")) { + return buildTime; + } + return "unknown"; + } +} diff --git a/dspace-api/src/main/java/org/dspace/health/OAIPMHCheck.java b/dspace-api/src/main/java/org/dspace/health/OAIPMHCheck.java new file mode 100644 index 000000000000..576261de9fca --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/OAIPMHCheck.java @@ -0,0 +1,31 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health; + +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; + +public class OAIPMHCheck extends Check { + protected static final ConfigurationService configurationService + = DSpaceServicesFactory.getInstance().getConfigurationService(); + + @Override + protected String run(ReportInfo ri) { + String output = ""; + String dspace_dir = configurationService.getProperty("dspace.dir"); + System.out.println("Dspace dir " + dspace_dir); + String dspace_url = configurationService.getProperty("dspace.server.url"); + System.out.println("Dspace url " + dspace_url); + String oaiurl = dspace_url + "/oai/request"; + System.out.println("Dspace oai " + oaiurl); + output += String.format("Trying [%s]\n", oaiurl); + //output += IOUtils.run(new File(dspace_dir + "/bin/"), new String[]{ + // "python", "./validators/oai_pmh/validate.py", oaiurl}); + return output; + } +} diff --git a/dspace-api/src/main/java/org/dspace/health/PIDCheck.java b/dspace-api/src/main/java/org/dspace/health/PIDCheck.java new file mode 100644 index 000000000000..6a2566b1b64b --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/PIDCheck.java @@ -0,0 +1,15 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health; + +public class PIDCheck extends Check { + @Override + protected String run(ReportInfo ri) { + return ""; + } +} diff --git a/dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java b/dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java new file mode 100644 index 000000000000..8a437e6bda93 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java @@ -0,0 +1,15 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health; + +public class ShibbolethCheck extends Check { + @Override + protected String run(ReportInfo ri) { + return ""; + } +} diff --git a/dspace/config/clarin-dspace.cfg b/dspace/config/clarin-dspace.cfg index f27d6830c213..df3d81271ae3 100644 --- a/dspace/config/clarin-dspace.cfg +++ b/dspace/config/clarin-dspace.cfg @@ -301,3 +301,5 @@ autocomplete.custom.separator.solr-dataProvider_ac = \\|\\|\\| autocomplete.custom.separator.solr-dctype_ac = \\|\\|\\| autocomplete.custom.separator.solr-author_ac = \\|\\|\\| autocomplete.custom.allowed = solr-author_ac,solr-publisher_ac,solr-dataProvider_ac,solr-dctype_ac,solr-subject_ac,solr-handle_title_ac,json_static-iso_langs.json + +testing-config = TESTINGCONFIG \ No newline at end of file diff --git a/dspace/config/modules/healthcheck.cfg b/dspace/config/modules/healthcheck.cfg index e45407abdfb1..4835574c519b 100644 --- a/dspace/config/modules/healthcheck.cfg +++ b/dspace/config/modules/healthcheck.cfg @@ -8,7 +8,11 @@ healthcheck.checks = General Information,\ Checksum,\ Item summary,\ User summary,\ - Log Analyser Check + Log Analyser Check,\ + Additional Information,\ + OAI-PMH validation,\ + PID check,\ + Shibboleth Check plugin.named.org.dspace.health.Check = \ org.dspace.health.InfoCheck = General Information,\ @@ -16,7 +20,11 @@ plugin.named.org.dspace.health.Check = \ org.dspace.health.EmbargoCheck = Embargo items (Pre-3.0),\ org.dspace.health.ItemCheck = Item summary,\ org.dspace.health.UserCheck = User summary,\ - org.dspace.health.LogAnalyserCheck = Log Analyser Check + org.dspace.health.LogAnalyserCheck = Log Analyser Check,\ + org.dspace.health.AdditionalInfoCheck = Additional Information,\ + org.dspace.health.OAIPMHCheck = OAI-PMH validation,\ + org.dspace.health.PIDCheck = PID Check,\ + org.dspace.health.ShibbolethCheck = Shibboleth Check # report from the last N days (where dates are applicable) healthcheck.last_n_days = 7 From abc6c3923b4489e1a6308a19e9ad865452ea2e42 Mon Sep 17 00:00:00 2001 From: Matus Kasak Date: Thu, 19 Dec 2024 14:22:58 +0100 Subject: [PATCH 2/5] WIP editing new healthchecks --- .../dspace/health/AdditionalInfoCheck.java | 4 + .../java/org/dspace/health/OAIPMHCheck.java | 14 +- .../main/java/org/dspace/health/PIDCheck.java | 117 +- .../org/dspace/health/ShibbolethCheck.java | 114 +- .../health/additionalUtilities/IOUtils.java | 48 + .../{ => additionalUtilities}/Info.java | 11 +- .../additionalUtilities/PIDLogMiner.java | 155 + .../additionalUtilities/PIDLogStatistics.java | 79 + .../PIDLogStatisticsEntry.java | 83 + .../health/additionalUtilities/Record.java | 19 + .../RecordFileLineIterator.java | 123 + .../additionalUtilities/RecordParser.java | 14 + .../additionalUtilities/SimpleLogEntry.java | 164 + .../SimpleLogEntryParser.java | 57 + .../additionalUtilities/SimpleLogFile.java | 66 + .../additionalUtilities/oval/__init__.py | 35 + .../oval/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2516 bytes .../__pycache__/harvester.cpython-311.pyc | Bin 0 -> 15493 bytes .../__pycache__/validator.cpython-311.pyc | Bin 0 -> 40555 bytes .../oval/data/iso-639-3.tab | 7705 +++++++++++++++++ .../additionalUtilities/oval/harvester.py | 336 + .../additionalUtilities/oval/validator.py | 789 ++ .../health/additionalUtilities/validate.py | 17 + dspace/config/modules/healthcheck.cfg | 2 +- 24 files changed, 9938 insertions(+), 14 deletions(-) create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/IOUtils.java rename dspace-api/src/main/java/org/dspace/health/{ => additionalUtilities}/Info.java (98%) create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogMiner.java create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatistics.java create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatisticsEntry.java create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/Record.java create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordFileLineIterator.java create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordParser.java create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntry.java create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntryParser.java create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogFile.java create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__init__.py create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/__init__.cpython-311.pyc create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/harvester.cpython-311.pyc create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/validator.cpython-311.pyc create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/data/iso-639-3.tab create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/harvester.py create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/validator.py create mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/validate.py diff --git a/dspace-api/src/main/java/org/dspace/health/AdditionalInfoCheck.java b/dspace-api/src/main/java/org/dspace/health/AdditionalInfoCheck.java index 8b2a7567af35..35d28ebcb4e6 100644 --- a/dspace-api/src/main/java/org/dspace/health/AdditionalInfoCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/AdditionalInfoCheck.java @@ -7,12 +7,16 @@ */ package org.dspace.health; +import org.dspace.health.additionalUtilities.Info; + public class AdditionalInfoCheck extends Check { @Override protected String run(ReportInfo ri) { String output = ""; + output += String.format( + "Server uptime: %s\n", Info.get_proc_uptime()); output += String.format( "JVM uptime: %s\n", Info.get_jvm_uptime()); output += String.format( diff --git a/dspace-api/src/main/java/org/dspace/health/OAIPMHCheck.java b/dspace-api/src/main/java/org/dspace/health/OAIPMHCheck.java index 576261de9fca..af02f78e98e3 100644 --- a/dspace-api/src/main/java/org/dspace/health/OAIPMHCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/OAIPMHCheck.java @@ -7,9 +7,12 @@ */ package org.dspace.health; +import org.dspace.health.additionalUtilities.IOUtils; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; +import java.io.File; + public class OAIPMHCheck extends Check { protected static final ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); @@ -18,14 +21,15 @@ public class OAIPMHCheck extends Check { protected String run(ReportInfo ri) { String output = ""; String dspace_dir = configurationService.getProperty("dspace.dir"); - System.out.println("Dspace dir " + dspace_dir); String dspace_url = configurationService.getProperty("dspace.server.url"); - System.out.println("Dspace url " + dspace_url); String oaiurl = dspace_url + "/oai/request"; - System.out.println("Dspace oai " + oaiurl); output += String.format("Trying [%s]\n", oaiurl); - //output += IOUtils.run(new File(dspace_dir + "/bin/"), new String[]{ - // "python", "./validators/oai_pmh/validate.py", oaiurl}); + + File scriptDir = new File( + "C:\\WorkSpace\\DSpace\\dspace-api\\src\\main\\java\\org\\dspace\\health\\additionalUtilities\\"); + + output += IOUtils.runScript(scriptDir, new String[]{ + "python", "validate.py", oaiurl}); return output; } } diff --git a/dspace-api/src/main/java/org/dspace/health/PIDCheck.java b/dspace-api/src/main/java/org/dspace/health/PIDCheck.java index 6a2566b1b64b..07fd3b4533bd 100644 --- a/dspace-api/src/main/java/org/dspace/health/PIDCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/PIDCheck.java @@ -7,9 +7,124 @@ */ package org.dspace.health; +import org.apache.commons.lang.NotImplementedException; +import org.dspace.handle.PIDService; +import org.dspace.health.additionalUtilities.PIDLogMiner; +import org.dspace.health.additionalUtilities.PIDLogStatistics; +import org.dspace.health.additionalUtilities.PIDLogStatisticsEntry; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + public class PIDCheck extends Check { + protected static final ConfigurationService configurationService + = DSpaceServicesFactory.getInstance().getConfigurationService(); + @Override protected String run(ReportInfo ri) { - return ""; + String output = ""; + output += "This is space for PID Check output"; + try { + String whoami = PIDService.who_am_i("encoding=xml"); + output += String.format("Who am I\n\t%s\n", + whoami.replaceAll("\n", "\n\t")); + String test_pid = configurationService.getProperty("lr.pid.service.testPid"); + output += "Testing PID server\n\t"; + if (test_pid != null) { + output += PIDService.test_pid(test_pid); + } else { + output += "Testing PID server not done! Test pid not in dspace.cfg!"; + } + } catch (IllegalArgumentException e) { + error(e, "Warning: PID service type is not defined or wrong"); + } catch (NotImplementedException e) { + error(e, "Testing PID server - method who_am_i not implemented"); + } catch (Exception e) { + error(e, "Testing PID server failed - exception occurred: %s"); + } + +// try { +// long total_count = Core.getHandlesTotalCount(); +// output += "\n"; +// output += String.format("Total count: %d\n", total_count); +// List invalid_handles = Core.getHandlesInvalidRows(); +// output += String.format("Invalid handles count: %d\n", +// invalid_handles.size()); +// if (invalid_handles.size() > 0) { +// output += "\n"; +// output += "Invalid handles:\n"; +// output += "----------------\n"; +// output += String.format("%-6s\t%-32s\t%-10s\t%-10s\t%s\n", +// "Handle ID", "Handle", "Res. type ID", "Resource ID", +// "URL"); +// for (TableRow row : invalid_handles) { +// int handle_id = row.getIntColumn("handle_id"); +// String handle = row.getStringColumn("handle"); +// +// Integer resource_type_id = row.getIntColumn("resource_type_id"); +// if (resource_type_id < 0) +// resource_type_id = null; +// +// Integer resource_id = row.getIntColumn("resource_id"); +// if (resource_id < 0) +// resource_id = null; +// +// String url = row.getStringColumn("url"); +// output += String.format("%-10d\t%-32s\t%-10d\t%-10d\t%s\n", +// handle_id, handle, resource_type_id, resource_id, +// url); +// } +// } +// } catch (SQLException e) { +// error(e); +// } + + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Calendar realEndDate = Calendar.getInstance(); + realEndDate.setTime(ri.till()); + realEndDate.add(Calendar.DATE, -1); + + final int topN = 10; + StringBuffer buf = new StringBuffer(); + buf.append("============================================================\n"); + buf.append(String.format("PID resolution statistics\n")); + buf.append("============================================================\n"); + buf.append("\n\n"); + PIDLogMiner logMiner = new PIDLogMiner(); + PIDLogStatistics statistics = logMiner.computeStatistics( + ri.from(), realEndDate.getTime()); + Map> topNEntries = statistics + .getTopN(topN); + String eventsToDisplay[] = { PIDLogMiner.FAILURE_EVENT, + PIDLogMiner.REQUEST_EVENT, PIDLogMiner.SUCCESS_EVENT, + PIDLogMiner.UNKNOWN_EVENT }; + SimpleDateFormat dateTimeFormat = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss.SSS"); + for (String event : eventsToDisplay) { + if (topNEntries.containsKey(event)) { + buf.append(String.format( + "Top %d events of type %s between %s and %s\n", topN, + event, dateFormat.format(ri.from()), + dateFormat.format(realEndDate.getTime()))); + buf.append(String + .format("---------------------------------------------------------------\n")); + buf.append(String.format("%-10s%-40s%-25s%-25s\n", "Count", + "PID", "First occurence", "Last occurence")); + buf.append(String + .format("--------------------------------------------------------------------------------------------------\n")); + for (PIDLogStatisticsEntry entry : topNEntries.get(event)) { + buf.append(String.format("%-10d%-40s%-25s%-25s\n", + entry.getCount(), entry.getPID(), + dateTimeFormat.format(entry.getFirstOccurence()), + dateTimeFormat.format(entry.getLastOccurence()))); + } + buf.append("\n"); + } + } + return output + buf.toString(); } } diff --git a/dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java b/dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java index 8a437e6bda93..a20e278c3290 100644 --- a/dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java @@ -7,9 +7,121 @@ */ package org.dspace.health; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; +//import java.io.BufferedReader; +//import java.io.File; +//import java.io.InputStreamReader; +//import java.io.StringWriter; +//import java.net.URL; +//import java.text.SimpleDateFormat; +//import java.util.Date; +//import java.util.HashSet; +//import java.util.Iterator; +//import java.util.Set; + public class ShibbolethCheck extends Check { + + protected static final ConfigurationService configurationService + = DSpaceServicesFactory.getInstance().getConfigurationService(); + @Override protected String run(ReportInfo ri) { - return ""; +// StringBuilder ret = new StringBuilder(); +// final String input_dir = configurationService.getProperty("lr", +// "lr.shibboleth.log.path"); +// final String default_log = configurationService.getProperty("lr", +// "lr.shibboleth.log.defaultName"); +// +// String input_file = new File(input_dir, default_log).toString(); +// +// ret.append(String.format("Parsing %s:\n", input_file)); +// BufferedReader safe_reader = null; +// try { +// safe_reader = IOUtils.safe_reader(input_file); +// // output warnings +// ShibUserLogins user_logins = new ShibUserLogins(safe_reader); +// if (0 < user_logins.warnings().size()) { +// for (String warning : user_logins.warnings()) { +// ret.append(warning + "\n"); +// } +// } else { +// ret.append("No shibboleth warnings have been found.\n"); +// } +// } catch (Exception e) { +// error(e, String.format("Problematic file [%s]", default_log)); +// return ret.toString(); +// } +// +// // > WARN from shibd_warn in the last week +// ret.append("\nParsing shibd_warn.*:\n"); +// File dir = new File(input_dir); +// String[] files = dir.list(new java.io.FilenameFilter() { +// @Override +// public boolean accept(File dir, String name) { +// return name.contains("shibd_warn"); +// } +// }); +// Long nowMillis = System.currentTimeMillis(); +// String weekAgo = new SimpleDateFormat("yyyy-MM-dd").format(new Date( +// nowMillis - 604800000)); +// String[] cmd = new String[] { "awk", "-v", "from=" + weekAgo, +// "BEGIN{FS=\" \"} {if($1>=from) print $0}" }; +// String[] cmdWithFiles = new String[cmd.length + files.length]; +// System.arraycopy(cmd, 0, cmdWithFiles, 0, cmd.length); +// System.arraycopy(files, 0, cmdWithFiles, cmd.length, files.length); +// try { +// Process child = Runtime.getRuntime().exec(cmdWithFiles, null, dir); +// BufferedReader[] outputs = new BufferedReader[] { +// new BufferedReader(new InputStreamReader( +// child.getInputStream())), +// new BufferedReader(new InputStreamReader( +// child.getErrorStream())) }; +// for (BufferedReader out : outputs) { +// String s = null; +// while ((s = out.readLine()) != null) { +// ret.append(s); +// ret.append("\n"); +// } +// } +// } catch (java.io.IOException e) { +// error(e); +// } +// +// +// try { +// String feedsConfig = configurationService.getProperty("discojuice", "feeds"); +// ret.append(String.format( "Using these static discojuice feeds [%s] as source.\n", +// feedsConfig )); +// // Try to download our feeds file, so the proper action is triggered +// StringWriter writer = new StringWriter(); +// org.apache.commons.io.IOUtils.copy( +// new URL(configurationService.getProperty("dspace.url") +// + "/discojuice/feeds").openStream(), writer); +// String json = writer.toString(); +// // end download +// Set entities = new HashSet(); +// JSONParser parser = new JSONParser(); +// JSONArray entityArray = (JSONArray) parser.parse(json); +// Iterator i = entityArray.iterator(); +// int counter = 0; +// while (i.hasNext()) { +// counter++; +// JSONObject entity = i.next(); +// String entityID = (String) entity.get("entityID"); +// entities.add(entityID); +// } +// int idCount = entities.size(); +// ret.append(String.format( +// "Our feeds file contains %d entities out of which %d are unique.\n" +// + "This number should be around 1200?? (20.11.2014).", +// counter, idCount) +// ); +// } catch (Exception e) { +// error(e); +// } +// +// return ret.toString(); + return "Space for shibboleth output."; } } diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/IOUtils.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/IOUtils.java new file mode 100644 index 000000000000..cdc87fdc4283 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/IOUtils.java @@ -0,0 +1,48 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health.additionalUtilities; + +import org.apache.logging.log4j.Logger; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; + +public class IOUtils { + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(IOUtils.class); + + public static String runScript(File where, String[] cmd) { + String message = null; + try { + ProcessBuilder pb = new ProcessBuilder(cmd); + pb.directory( where ); + Process p = pb.start(); + BufferedReader std_out = new BufferedReader(new InputStreamReader(p.getInputStream()) ); + BufferedReader std_err = new BufferedReader(new InputStreamReader(p.getErrorStream()) ); + + String s = null; + message = "Returned stdout:\n"; + while ((s = std_out.readLine()) != null) { + message += s + "\n "; + } + message += "Returned stderr:\n"; + while ((s = std_err.readLine()) != null) { + message += s + "\n "; + } + + //Wait to get exit value + int exitValue = p.waitFor(); + message += "Exit code: [" + String.valueOf( exitValue ) + "]\n"; + + } catch (Exception e) { + message += "\nException:" + e.toString(); + log.error( e ); + } + return message; + } +} diff --git a/dspace-api/src/main/java/org/dspace/health/Info.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/Info.java similarity index 98% rename from dspace-api/src/main/java/org/dspace/health/Info.java rename to dspace-api/src/main/java/org/dspace/health/additionalUtilities/Info.java index 898f1f3d464b..26eb4e204858 100644 --- a/dspace-api/src/main/java/org/dspace/health/Info.java +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/Info.java @@ -5,18 +5,17 @@ * * http://www.dspace.org/license/ */ -package org.dspace.health; - -import org.dspace.services.ConfigurationService; -import org.dspace.services.factory.DSpaceServicesFactory; -//import src.main.java.org.dspace.xoai.services.impl.config.DSpaceConfigurationService; - +package org.dspace.health.additionalUtilities; import java.io.FileInputStream; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.util.Scanner; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; +//import src.main.java.org.dspace.xoai.services.impl.config.DSpaceConfigurationService; + public class Info { protected static final ConfigurationService configurationService diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogMiner.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogMiner.java new file mode 100644 index 000000000000..44753239da0a --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogMiner.java @@ -0,0 +1,155 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health.additionalUtilities; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; + +public class PIDLogMiner { + protected static final ConfigurationService configurationService + = DSpaceServicesFactory.getInstance().getConfigurationService(); + + private static org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(PIDLogMiner.class); + + private static final Pattern REQUEST_PATTERN = Pattern + .compile("Resolving \\[(.*)\\]"); + + private static final Pattern FAILURE_PATTERN = Pattern + .compile("Unable to resolve \\[(.*)\\]"); + + private static final Pattern SUCCESS_PATTERN = Pattern + .compile("Handle \\[(.*)\\] resolved to \\[(.*)\\]"); + + public static final String REQUEST_EVENT = "REQUEST"; + public static final String SUCCESS_EVENT = "SUCCESS"; + public static final String FAILURE_EVENT = "FAILURE"; + public static final String UNKNOWN_EVENT = "UNKNOWN"; + + private String logDir; + + public PIDLogMiner() + { + this.logDir = getConfigLogDir(); + } + + public PIDLogMiner(String logDir) + { + this.logDir = logDir; + } + + private List getDatesInInterval(Date startDate, Date endDate) + { + List dates = new ArrayList(); + Calendar calendar = new GregorianCalendar(); + calendar.setTime(startDate); + + while (calendar.getTime().before(endDate) || calendar.getTime().equals(endDate)) + { + dates.add(calendar.getTime()); + calendar.add(Calendar.DATE, 1); + } + return dates; + } + + /** + * Function for computing log statistics + * + * Note: The current log is not processed, only from yesterday backwards. + * + * @param startDate the first day of the statistics + * @param endDate the last day of the statistics + * @return + */ + + public PIDLogStatistics computeStatistics(Date startDate, Date endDate) + { + PIDLogStatistics statistics = new PIDLogStatistics(); + List dates = getDatesInInterval(startDate, endDate); + + for (Date date : dates) + { + String formattedDate = new SimpleDateFormat("yyyy-MM-dd") + .format(date); + String logFilename = String.format("handle-plugin.log.%s", + formattedDate); + log.info(String.format("Logfile [%s] processing started", + logFilename)); + + SimpleLogFile logFile = new SimpleLogFile(logDir, logFilename); + + for (SimpleLogEntry logEntry : logFile) + { + updateStatistics(statistics, logEntry); + } + + log.info(String.format("Logfile [%s] processing finished", + logFilename)); + + } + return statistics; + + } + + private void updateStatistics(PIDLogStatistics statistics, + SimpleLogEntry logEntry) + { + String message = logEntry.getMessage(); + Date eventDate = logEntry.getDate(); + Matcher matcher; + String pid; + String event; + + matcher = REQUEST_PATTERN.matcher(message); + if (matcher.find()) + { + event = REQUEST_EVENT; + pid = matcher.group(1); + statistics.updateStatistics(event, pid, eventDate); + return; + } + + matcher = SUCCESS_PATTERN.matcher(message); + if (matcher.find()) + { + event = SUCCESS_EVENT; + pid = matcher.group(1); + statistics.updateStatistics(event, pid, eventDate); + return; + } + + matcher = FAILURE_PATTERN.matcher(message); + if (matcher.find()) + { + event = FAILURE_EVENT; + pid = matcher.group(1); + statistics.updateStatistics(event, pid, eventDate); + return; + } + + event = UNKNOWN_EVENT; + pid = ""; + statistics.updateStatistics(event, pid, eventDate); + return; + + } + + private String getConfigLogDir() + { + return configurationService.getProperty("log.dir"); + } + +} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatistics.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatistics.java new file mode 100644 index 000000000000..d0de591346b5 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatistics.java @@ -0,0 +1,79 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health.additionalUtilities; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PIDLogStatistics { + private HashMap> entries = null; + + PIDLogStatistics() + { + entries = new HashMap>(); + } + + public void updateStatistics(String event, String pid, Date eventDate) + { + if (!entries.containsKey(event)) + { + entries.put(event, new HashMap()); + } + HashMap subentries = entries.get(event); + + if (!subentries.containsKey(pid)) + { + subentries.put(pid, new PIDLogStatisticsEntry(event, pid, 0, + eventDate, eventDate)); + } + PIDLogStatisticsEntry entry = subentries.get(pid); + entry.update(eventDate); + } + + public List getEntriesList() + { + List entriesList = new ArrayList(); + for (Map subentries : entries + .values()) + { + for (PIDLogStatisticsEntry entry : subentries.values()) + { + entriesList.add(entry); + } + } + return entriesList; + } + + public Map> getTopN(int topN) + { + Map> topEntriesMap = new HashMap>(); + for (String event: entries.keySet()) + { + List subentries = new ArrayList(entries.get(event).values()); + Collections.sort( subentries, new Comparator(){ + public int compare( PIDLogStatisticsEntry a, PIDLogStatisticsEntry b ){ + if(a.getCount() != b.getCount()) { + return b.getCount() - a.getCount(); + } + else { + return a.getPID().compareTo(b.getPID()); + } + } + }); + topEntriesMap.put(event, subentries.subList(0, topN > subentries.size() ? subentries.size() : topN)); + + } + return topEntriesMap; + } +} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatisticsEntry.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatisticsEntry.java new file mode 100644 index 000000000000..13ee9e726aaa --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatisticsEntry.java @@ -0,0 +1,83 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health.additionalUtilities; + +import java.util.Date; + +public class PIDLogStatisticsEntry { + private String event; + + private String pid; + + private int count; + + private Date firstOccurence; + + private Date lastOccurence; + + PIDLogStatisticsEntry(String event, String pid, int count, + Date firstOccurence, Date lastOccurence) + { + this.event = event; + this.pid = pid; + this.count = count; + this.firstOccurence = firstOccurence; + this.lastOccurence = lastOccurence; + } + + public void update(Date eventDate) + { + this.count++; + + if (eventDate.before(firstOccurence)) + { + firstOccurence = eventDate; + } + + if (eventDate.after(lastOccurence)) + { + lastOccurence = eventDate; + } + } + + public String getEvent() + { + return event; + } + + public String getPID() + { + return pid; + } + + public int getCount() + { + return count; + } + + public Date getFirstOccurence() + { + return firstOccurence; + } + + public Date getLastOccurence() + { + return lastOccurence; + } + + public String toString() { + return String.format("" + + "Event: %s\n" + + "PID: %s\n" + + "Count: %d\n" + + "First occurence: %s\n" + + "Last occurence: %s\n", + event, pid, count, firstOccurence.toString(), lastOccurence.toString() + ); + } +} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/Record.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/Record.java new file mode 100644 index 000000000000..efc07e096307 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/Record.java @@ -0,0 +1,19 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health.additionalUtilities; + +public interface Record { + public void setLineNumber(int lineNumber); + + public int getLineNumber(); + + public void setValid(boolean valid); + + public boolean isValid(); + +} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordFileLineIterator.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordFileLineIterator.java new file mode 100644 index 000000000000..1a2ce0ab8ebf --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordFileLineIterator.java @@ -0,0 +1,123 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health.additionalUtilities; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.util.Iterator; +import java.util.NoSuchElementException; + +public class RecordFileLineIterator implements Iterator { + private BufferedReader reader; + + private RecordParser recordParser; + + private int cachedLineNumber; + + private String cachedLine; + + private boolean finished; + + public RecordFileLineIterator(InputStreamReader inputReader, RecordParser recordParser) + { + this.recordParser = recordParser; + this.reader = inputReader == null ? null : new BufferedReader(inputReader); + this.cachedLine = null; + this.cachedLineNumber = 0; + this.finished = false; + nextRecord(); + } + + private String nextRecord() + { + if (reader == null || finished) + { + finished = true; + return null; + } + StringBuffer buf = new StringBuffer(); + buf.append(cachedLine); + try + { + while (true) + { + cachedLine = reader.readLine(); + cachedLineNumber++; + if (cachedLine == null) + { + close(); + break; + } + if (recordParser.matches(cachedLine)) + { + break; + } + buf.append("\n"); + buf.append(cachedLine); + } + } + catch (IOException ioe) + { + close(); + throw new IllegalStateException(ioe.toString()); + } + return buf.toString(); + } + + @Override + public boolean hasNext() + { + return !finished; + } + + @Override + public T next() + { + T res = null; + String s; + + int lineNumber = cachedLineNumber; + s = nextRecord(); + if (!s.isEmpty()) + { + res = recordParser.parse(s); + res.setLineNumber(lineNumber); + } + + if (res == null) + { + throw new NoSuchElementException(); + } + return res; + } + + @Override + public void remove() + { + throw new UnsupportedOperationException( + "Remove unsupported on RecordFileLineIterator"); + } + + public void close() + { + finished = true; + try + { + reader.close(); + } + catch (IOException ioe) + { + throw new IllegalStateException(ioe.toString()); + } + } +} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordParser.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordParser.java new file mode 100644 index 000000000000..43e29a7e6168 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordParser.java @@ -0,0 +1,14 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health.additionalUtilities; + +public interface RecordParser { + public T parse(String s); + + public boolean matches(String s); +} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntry.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntry.java new file mode 100644 index 000000000000..15e012b664b7 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntry.java @@ -0,0 +1,164 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health.additionalUtilities; + +import java.util.Date; + +public class SimpleLogEntry implements Record { + private String filename; + + private int lineNumber; + + private Date date; + + private String level; + + private String loggingClass; + + private String message; + + private boolean valid; + + public static final String ERROR_LEVEL = "ERROR"; + + public static final String WARNING_LEVEL = "WARN"; + + public static final String INFO_LEVEL = "INFO"; + + public static final String DEBUG_LEVEL = "DEBUG"; + + public static final String FATAL_LEVEL = "FATAL"; + + public static final String CRITICAL_LEVEL = "CRIT"; + + public SimpleLogEntry() + { + this.lineNumber = 0; + this.date = null; + this.level = null; + this.loggingClass = null; + this.message = null; + } + + public SimpleLogEntry(Date date, String level, String loggingClass, + String message) + { + this.lineNumber = 0; + this.date = date; + this.level = level; + this.loggingClass = loggingClass; + this.message = message; + } + + public String getFilename() + { + return filename; + } + + public int getLineNumber() + { + return lineNumber; + } + + public Date getDate() + { + return date; + } + + public void setDate(Date date) + { + this.date = date; + } + + public void setLevel(String level) + { + this.level = level; + } + + public void setLoggingClass(String loggingClass) + { + this.loggingClass = loggingClass; + } + + public void setMessage(String message) + { + this.message = message; + } + + public String getLevel() + { + return level; + } + + public String getLoggingClass() + { + return loggingClass; + } + + public String getMessage() + { + return message; + } + + public void setLineNumber(int lineNumber) + { + this.lineNumber = lineNumber; + } + + public void setFilename(String filename) + { + this.filename = filename; + } + + public boolean isValid() + { + return valid; + } + + public void setValid(boolean valid) + { + this.valid = valid; + } + + public boolean isError() + { + return ERROR_LEVEL.equals(level); + } + + public boolean isWarning() + { + return WARNING_LEVEL.equals(level); + } + + public boolean isInfo() + { + return INFO_LEVEL.equals(level); + } + + public boolean isDebug() + { + return DEBUG_LEVEL.equals(level); + } + + public boolean isFatal() + { + return FATAL_LEVEL.equals(level); + } + + public boolean isCritical() + { + return CRITICAL_LEVEL.equals(level); + } + + public String toString() + { + return String.format("" + "Date: %s\n" + "Level: %s\n" + + "Logging class: %s\n" + "Message: %s\n", date.toString(), + level, loggingClass, message); + } +} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntryParser.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntryParser.java new file mode 100644 index 000000000000..f9ec7ed51fbb --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntryParser.java @@ -0,0 +1,57 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health.additionalUtilities; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class SimpleLogEntryParser implements RecordParser { + private final static String LOG_ENTRY_PATTERN = "^(\\d{4}-\\d{2}-\\d{2} +\\d{2}:\\d{2}:\\d{2},\\d{3}) +([^ ]+) +([^ ]+) +@ +(.*)$"; + + private final static Pattern pattern = Pattern.compile(LOG_ENTRY_PATTERN, Pattern.DOTALL); + + public SimpleLogEntry parse(String s) + { + + SimpleLogEntry entry = new SimpleLogEntry(); + Matcher matcher = pattern.matcher(s); + if (matcher.find()) + { + String dateString = matcher.group(1); + entry.setValid(true); + entry.setLevel(matcher.group(2)); + entry.setLoggingClass(matcher.group(3)); + entry.setMessage(matcher.group(4)); + + try + { + Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS") + .parse(dateString); + entry.setDate(date); + } + catch (ParseException e) + { + entry.setValid(false); + } + } + else + { + entry.setValid(false); + } + return entry; + } + + public boolean matches(String s) + { + + return pattern.matcher(s).matches(); + } +} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogFile.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogFile.java new file mode 100644 index 000000000000..c4565b4fae95 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogFile.java @@ -0,0 +1,66 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.health.additionalUtilities; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStreamReader; +import java.nio.charset.Charset; + +public class SimpleLogFile implements Iterable { + private static org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(SimpleLogFile.class); + + private InputStreamReader inputReader; + + public SimpleLogFile(String dirname, String filename) + { + this(new File(dirname, filename)); + } + + public SimpleLogFile(String filePath) + { + this(new File(filePath)); + } + + public SimpleLogFile(File file) + { + if (file == null) { + throw new IllegalArgumentException("File cannot be null"); + } + else if (!file.exists()) + { + log.warn(String.format("Logfile [%s] not found at [%s]", + file.getName(), file.getPath())); + } + else if (file.exists() && file.length() == 0) + { + log.warn(String.format("Logfile [%s] at [%s] is empty", + file.getName(), file.getPath())); + } + else + { + try + { + this.inputReader = new InputStreamReader(new FileInputStream( + file), Charset.forName("UTF8")); + } + catch (FileNotFoundException e) + { + log.error(e.toString()); + } + } + + } + + public RecordFileLineIterator iterator() + { + return new RecordFileLineIterator(inputReader, + new SimpleLogEntryParser()); + } +} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__init__.py b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__init__.py new file mode 100644 index 000000000000..36e499ebb47f --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__init__.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +""" + oval + ~~~~ + + BASE OAI-PMH Validity Checker + + :copyright: Copyright 2011 Mathias Loesch. +""" + +import os +import oval + +this_dir, this_filename = os.path.split(__file__) + +DATA_PATH = os.path.join(this_dir, "data") +__version__ = '0.2.0' +OAI_PMH_VERSION = '2.0' + + +def compress(_list): + _list.remove(_list[0]) + return [item for item in _list if item != ''] + + +iso_639_file = open( + os.path.join(DATA_PATH, 'iso-639-3.tab'), 'r', encoding='utf-8' +) +ISO_639_3_CODES = compress([line.split('\t')[0] for line in iso_639_file]) +iso_639_file.seek(0) +ISO_639_2B_CODES = compress([line.split('\t')[1] for line in iso_639_file]) +iso_639_file.seek(0) +ISO_639_2T_CODES = compress([line.split('\t')[2] for line in iso_639_file]) +iso_639_file.seek(0) +ISO_639_1_CODES = compress([line.split('\t')[3] for line in iso_639_file]) diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/__init__.cpython-311.pyc b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5257b1b4858740ad94ab559a0dfd0ffba8e132b1 GIT binary patch literal 2516 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 literal 0 HcmV?d00001 diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/validator.cpython-311.pyc b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/validator.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cf141f65c82d465e70dec5135a5693766b42c03 GIT binary patch literal 40555 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 literal 0 HcmV?d00001 diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/data/iso-639-3.tab b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/data/iso-639-3.tab new file mode 100644 index 000000000000..75037a65b286 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/data/iso-639-3.tab @@ -0,0 +1,7705 @@ +Id Part2B Part2T Part1 Scope Language_Type Ref_Name Comment +aaa I L Ghotuo +aab I L Alumu-Tesu +aac I L Ari +aad I L Amal +aae I L Arbëreshë Albanian +aaf I L Aranadan +aag I L Ambrak +aah I L Abu' Arapesh +aai I L Arifama-Miniafia +aak I L Ankave +aal I L Afade +aam I L Aramanik +aan I L Anambé +aao I L Algerian Saharan Arabic +aap I L Pará Arára +aaq I E Eastern Abnaki +aar aar aar aa I L Afar +aas I L Aasáx +aat I L Arvanitika Albanian +aau I L Abau +aaw I L Solong +aax I L Mandobo Atas +aaz I L Amarasi +aba I L Abé +abb I L Bankon +abc I L Ambala Ayta +abd I L Manide +abe I E Western Abnaki +abf I L Abai Sungai +abg I L Abaga +abh I L Tajiki Arabic +abi I L Abidji +abj I E Aka-Bea +abk abk abk ab I L Abkhazian +abl I L Lampung Nyo +abm I L Abanyom +abn I L Abua +abo I L Abon +abp I L Abellen Ayta +abq I L Abaza +abr I L Abron +abs I L Ambonese Malay +abt I L Ambulas +abu I L Abure +abv I L Baharna Arabic +abw I L Pal +abx I L Inabaknon +aby I L Aneme Wake +abz I L Abui +aca I L Achagua +acb I L Áncá +acd I L Gikyode +ace ace ace I L Achinese +acf I L Saint Lucian Creole French +ach ach ach I L Acoli +aci I E Aka-Cari +ack I E Aka-Kora +acl I E Akar-Bale +acm I L Mesopotamian Arabic +acn I L Achang +acp I L Eastern Acipa +acq I L Ta'izzi-Adeni Arabic +acr I L Achi +acs I E Acroá +act I L Achterhoeks +acu I L Achuar-Shiwiar +acv I L Achumawi +acw I L Hijazi Arabic +acx I L Omani Arabic +acy I L Cypriot Arabic +acz I L Acheron +ada ada ada I L Adangme +adb I L Adabe +add I L Dzodinka +ade I L Adele +adf I L Dhofari Arabic +adg I L Andegerebinha +adh I L Adhola +adi I L Adi +adj I L Adioukrou +adl I L Galo +adn I L Adang +ado I L Abu +adp I L Adap +adq I L Adangbe +adr I L Adonara +ads I L Adamorobe Sign Language +adt I L Adnyamathanha +adu I L Aduge +adw I L Amundava +adx I L Amdo Tibetan +ady ady ady I L Adyghe +adz I L Adzera +aea I E Areba +aeb I L Tunisian Arabic +aec I L Saidi Arabic +aed I L Argentine Sign Language +aee I L Northeast Pashayi +aek I L Haeke +ael I L Ambele +aem I L Arem +aen I L Armenian Sign Language +aeq I L Aer +aer I L Eastern Arrernte +aes I E Alsea +aeu I L Akeu +aew I L Ambakich +aey I L Amele +aez I L Aeka +afb I L Gulf Arabic +afd I L Andai +afe I L Putukwam +afg I L Afghan Sign Language +afh afh afh I C Afrihili +afi I L Akrukay +afk I L Nanubae +afn I L Defaka +afo I L Eloyi +afp I L Tapei +afr afr afr af I L Afrikaans +afs I L Afro-Seminole Creole +aft I L Afitti +afu I L Awutu +afz I L Obokuitai +aga I E Aguano +agb I L Legbo +agc I L Agatu +agd I L Agarabi +age I L Angal +agf I L Arguni +agg I L Angor +agh I L Ngelima +agi I L Agariya +agj I L Argobba +agk I L Isarog Agta +agl I L Fembe +agm I L Angaataha +agn I L Agutaynen +ago I L Tainae +agq I L Aghem +agr I L Aguaruna +ags I L Esimbi +agt I L Central Cagayan Agta +agu I L Aguacateco +agv I L Remontado Dumagat +agw I L Kahua +agx I L Aghul +agy I L Southern Alta +agz I L Mt. Iriga Agta +aha I L Ahanta +ahb I L Axamb +ahg I L Qimant +ahh I L Aghu +ahi I L Tiagbamrin Aizi +ahk I L Akha +ahl I L Igo +ahm I L Mobumrin Aizi +ahn I L Àhàn +aho I E Ahom +ahp I L Aproumu Aizi +ahr I L Ahirani +ahs I L Ashe +aht I L Ahtena +aia I L Arosi +aib I L Ainu (China) +aic I L Ainbai +aid I E Alngith +aie I L Amara +aif I L Agi +aig I L Antigua and Barbuda Creole English +aih I L Ai-Cham +aii I L Assyrian Neo-Aramaic +aij I L Lishanid Noshan +aik I L Ake +ail I L Aimele +aim I L Aimol +ain ain ain I L Ainu (Japan) +aio I L Aiton +aip I L Burumakok +aiq I L Aimaq +air I L Airoran +ais I L Nataoran Amis +ait I E Arikem +aiw I L Aari +aix I L Aighon +aiy I L Ali +aja I L Aja (Sudan) +ajg I L Aja (Benin) +aji I L Ajië +ajp I L South Levantine Arabic +ajt I L Judeo-Tunisian Arabic +aju I L Judeo-Moroccan Arabic +ajw I E Ajawa +ajz I L Amri Karbi +aka aka aka ak M L Akan +akb I L Batak Angkola +akc I L Mpur +akd I L Ukpet-Ehom +ake I L Akawaio +akf I L Akpa +akg I L Anakalangu +akh I L Angal Heneng +aki I L Aiome +akj I E Aka-Jeru +akk akk akk I A Akkadian +akl I L Aklanon +akm I E Aka-Bo +ako I L Akurio +akp I L Siwu +akq I L Ak +akr I L Araki +aks I L Akaselem +akt I L Akolet +aku I L Akum +akv I L Akhvakh +akw I L Akwa +akx I E Aka-Kede +aky I E Aka-Kol +akz I L Alabama +ala I L Alago +alc I L Qawasqar +ald I L Alladian +ale ale ale I L Aleut +alf I L Alege +alh I L Alawa +ali I L Amaimon +alj I L Alangan +alk I L Alak +all I L Allar +alm I L Amblong +aln I L Gheg Albanian +alo I L Larike-Wakasihu +alp I L Alune +alq I L Algonquin +alr I L Alutor +als I L Tosk Albanian +alt alt alt I L Southern Altai +alu I L 'Are'are +alw I L Alaba-K’abeena +alx I L Amol +aly I L Alyawarr +alz I L Alur +ama I E Amanayé +amb I L Ambo +amc I L Amahuaca +ame I L Yanesha' +amf I L Hamer-Banna +amg I L Amarag +amh amh amh am I L Amharic +ami I L Amis +amj I L Amdang +amk I L Ambai +aml I L War-Jaintia +amm I L Ama (Papua New Guinea) +amn I L Amanab +amo I L Amo +amp I L Alamblak +amq I L Amahai +amr I L Amarakaeri +ams I L Southern Amami-Oshima +amt I L Amto +amu I L Guerrero Amuzgo +amv I L Ambelau +amw I L Western Neo-Aramaic +amx I L Anmatyerre +amy I L Ami +amz I E Atampaya +ana I E Andaqui +anb I E Andoa +anc I L Ngas +and I L Ansus +ane I L Xârâcùù +anf I L Animere +ang ang ang I H Old English (ca. 450-1100) +anh I L Nend +ani I L Andi +anj I L Anor +ank I L Goemai +anl I L Anu +anm I L Anal +ann I L Obolo +ano I L Andoque +anp anp anp I L Angika +anq I L Jarawa (India) +anr I L Andh +ans I E Anserma +ant I L Antakarinya +anu I L Anuak +anv I L Denya +anw I L Anaang +anx I L Andra-Hus +any I L Anyin +anz I L Anem +aoa I L Angolar +aob I L Abom +aoc I L Pemon +aod I L Andarum +aoe I L Angal Enen +aof I L Bragat +aog I L Angoram +aoh I E Arma +aoi I L Anindilyakwa +aoj I L Mufian +aok I L Arhö +aol I L Alor +aom I L Ömie +aon I L Bumbita Arapesh +aor I E Aore +aos I L Taikat +aot I L A'tong +aox I L Atorada +aoz I L Uab Meto +apb I L Sa'a +apc I L North Levantine Arabic +apd I L Sudanese Arabic +ape I L Bukiyip +apf I L Pahanan Agta +apg I L Ampanang +aph I L Athpariya +api I L Apiaká +apj I L Jicarilla Apache +apk I L Kiowa Apache +apl I L Lipan Apache +apm I L Mescalero-Chiricahua Apache +apn I L Apinayé +apo I L Apalik +app I L Apma +apq I L A-Pucikwar +apr I L Arop-Lokep +aps I L Arop-Sissano +apt I L Apatani +apu I L Apurinã +apv I E Alapmunte +apw I L Western Apache +apx I L Aputai +apy I L Apalaí +apz I L Safeyoka +aqc I L Archi +aqg I L Arigidi +aqm I L Atohwaim +aqn I L Northern Alta +aqp I E Atakapa +aqr I L Arhâ +aqz I L Akuntsu +ara ara ara ar M L Arabic +arb I L Standard Arabic +arc arc arc I A Official Aramaic (700-300 BCE) +ard I E Arabana +are I L Western Arrarnta +arg arg arg an I L Aragonese +arh I L Arhuaco +ari I L Arikara +arj I E Arapaso +ark I L Arikapú +arl I L Arabela +arn arn arn I L Mapudungun +aro I L Araona +arp arp arp I L Arapaho +arq I L Algerian Arabic +arr I L Karo (Brazil) +ars I L Najdi Arabic +aru I E Aruá (Amazonas State) +arv I L Arbore +arw arw arw I L Arawak +arx I L Aruá (Rodonia State) +ary I L Moroccan Arabic +arz I L Egyptian Arabic +asa I L Asu (Tanzania) +asb I L Assiniboine +asc I L Casuarina Coast Asmat +asd I L Asas +ase I L American Sign Language +asf I L Australian Sign Language +asg I L Cishingini +ash I E Abishira +asi I L Buruwai +asj I L Nsari +ask I L Ashkun +asl I L Asilulu +asm asm asm as I L Assamese +asn I L Xingú Asuriní +aso I L Dano +asp I L Algerian Sign Language +asq I L Austrian Sign Language +asr I L Asuri +ass I L Ipulo +ast ast ast I L Asturian +asu I L Tocantins Asurini +asv I L Asoa +asw I L Australian Aborigines Sign Language +asx I L Muratayak +asy I L Yaosakor Asmat +asz I L As +ata I L Pele-Ata +atb I L Zaiwa +atc I E Atsahuaca +atd I L Ata Manobo +ate I L Atemble +atg I L Ivbie North-Okpela-Arhe +ati I L Attié +atj I L Atikamekw +atk I L Ati +atl I L Mt. Iraya Agta +atm I L Ata +atn I L Ashtiani +ato I L Atong +atp I L Pudtol Atta +atq I L Aralle-Tabulahan +atr I L Waimiri-Atroari +ats I L Gros Ventre +att I L Pamplona Atta +atu I L Reel +atv I L Northern Altai +atw I L Atsugewi +atx I L Arutani +aty I L Aneityum +atz I L Arta +aua I L Asumboa +aub I L Alugu +auc I L Waorani +aud I L Anuta +aue I L =/Kx'au//'ein +aug I L Aguna +auh I L Aushi +aui I L Anuki +auj I L Awjilah +auk I L Heyo +aul I L Aulua +aum I L Asu (Nigeria) +aun I L Molmo One +auo I E Auyokawa +aup I L Makayam +auq I L Anus +aur I L Aruek +aut I L Austral +auu I L Auye +auw I L Awyi +aux I E Aurá +auy I L Awiyaana +auz I L Uzbeki Arabic +ava ava ava av I L Avaric +avb I L Avau +avd I L Alviri-Vidari +ave ave ave ae I A Avestan +avi I L Avikam +avk I C Kotava +avl I L Eastern Egyptian Bedawi Arabic +avn I L Avatime +avo I E Agavotaguerra +avs I E Aushiri +avt I L Au +avu I L Avokaya +avv I L Avá-Canoeiro +awa awa awa I L Awadhi +awb I L Awa (Papua New Guinea) +awc I L Cicipu +awe I L Awetí +awh I L Awbono +awi I L Aekyom +awk I E Awabakal +awm I L Arawum +awn I L Awngi +awo I L Awak +awr I L Awera +aws I L South Awyu +awt I L Araweté +awu I L Central Awyu +awv I L Jair Awyu +aww I L Awun +awx I L Awara +awy I L Edera Awyu +axb I E Abipon +axg I E Mato Grosso Arára +axk I L Yaka (Central African Republic) +axm I H Middle Armenian +axx I L Xaragure +aya I L Awar +ayb I L Ayizo Gbe +ayc I L Southern Aymara +ayd I E Ayabadhu +aye I L Ayere +ayg I L Ginyanga +ayh I L Hadrami Arabic +ayi I L Leyigha +ayk I L Akuku +ayl I L Libyan Arabic +aym aym aym ay M L Aymara +ayn I L Sanaani Arabic +ayo I L Ayoreo +ayp I L North Mesopotamian Arabic +ayq I L Ayi (Papua New Guinea) +ayr I L Central Aymara +ays I L Sorsogon Ayta +ayt I L Magbukun Ayta +ayu I L Ayu +ayx I L Ayi (China) +ayy I E Tayabas Ayta +ayz I L Mai Brat +aza I L Azha +azb I L South Azerbaijani +aze aze aze az M L Azerbaijani +azg I L San Pedro Amuzgos Amuzgo +azj I L North Azerbaijani +azm I L Ipalapa Amuzgo +azo I L Awing +azt I L Faire Atta +azz I L Highland Puebla Nahuatl +baa I L Babatana +bab I L Bainouk-Gunyuño +bac I L Badui +bae I E Baré +baf I L Nubaca +bag I L Tuki +bah I L Bahamas Creole English +baj I L Barakai +bak bak bak ba I L Bashkir +bal bal bal M L Baluchi +bam bam bam bm I L Bambara +ban ban ban I L Balinese +bao I L Waimaha +bap I L Bantawa +bar I L Bavarian +bas bas bas I L Basa (Cameroon) +bau I L Bada (Nigeria) +bav I L Vengo +baw I L Bambili-Bambui +bax I L Bamun +bay I L Batuley +baz I L Tunen +bba I L Baatonum +bbb I L Barai +bbc I L Batak Toba +bbd I L Bau +bbe I L Bangba +bbf I L Baibai +bbg I L Barama +bbh I L Bugan +bbi I L Barombi +bbj I L Ghomálá' +bbk I L Babanki +bbl I L Bats +bbm I L Babango +bbn I L Uneapa +bbo I L Northern Bobo Madaré +bbp I L West Central Banda +bbq I L Bamali +bbr I L Girawa +bbs I L Bakpinka +bbt I L Mburku +bbu I L Kulung (Nigeria) +bbv I L Karnai +bbw I L Baba +bbx I L Bubia +bby I L Befang +bbz I L Babalia Creole Arabic +bca I L Central Bai +bcb I L Bainouk-Samik +bcc I L Southern Balochi +bcd I L North Babar +bce I L Bamenyam +bcf I L Bamu +bcg I L Baga Binari +bch I L Bariai +bci I L Baoulé +bcj I L Bardi +bck I L Bunaba +bcl I L Central Bicolano +bcm I L Bannoni +bcn I L Bali (Nigeria) +bco I L Kaluli +bcp I L Bali (Democratic Republic of Congo) +bcq I L Bench +bcr I L Babine +bcs I L Kohumono +bct I L Bendi +bcu I L Awad Bing +bcv I L Shoo-Minda-Nye +bcw I L Bana +bcy I L Bacama +bcz I L Bainouk-Gunyaamolo +bda I L Bayot +bdb I L Basap +bdc I L Emberá-Baudó +bdd I L Bunama +bde I L Bade +bdf I L Biage +bdg I L Bonggi +bdh I L Baka (Sudan) +bdi I L Burun +bdj I L Bai +bdk I L Budukh +bdl I L Indonesian Bajau +bdm I L Buduma +bdn I L Baldemu +bdo I L Morom +bdp I L Bende +bdq I L Bahnar +bdr I L West Coast Bajau +bds I L Burunge +bdt I L Bokoto +bdu I L Oroko +bdv I L Bodo Parja +bdw I L Baham +bdx I L Budong-Budong +bdy I L Bandjalang +bdz I L Badeshi +bea I L Beaver +beb I L Bebele +bec I L Iceve-Maci +bed I L Bedoanas +bee I L Byangsi +bef I L Benabena +beg I L Belait +beh I L Biali +bei I L Bekati' +bej bej bej I L Beja +bek I L Bebeli +bel bel bel be I L Belarusian +bem bem bem I L Bemba (Zambia) +ben ben ben bn I L Bengali +beo I L Beami +bep I L Besoa +beq I L Beembe +bes I L Besme +bet I L Guiberoua Béte +beu I L Blagar +bev I L Daloa Bété +bew I L Betawi +bex I L Jur Modo +bey I L Beli (Papua New Guinea) +bez I L Bena (Tanzania) +bfa I L Bari +bfb I L Pauri Bareli +bfc I L Northern Bai +bfd I L Bafut +bfe I L Betaf +bff I L Bofi +bfg I L Busang Kayan +bfh I L Blafe +bfi I L British Sign Language +bfj I L Bafanji +bfk I L Ban Khor Sign Language +bfl I L Banda-Ndélé +bfm I L Mmen +bfn I L Bunak +bfo I L Malba Birifor +bfp I L Beba +bfq I L Badaga +bfr I L Bazigar +bfs I L Southern Bai +bft I L Balti +bfu I L Gahri +bfw I L Bondo +bfx I L Bantayanon +bfy I L Bagheli +bfz I L Mahasu Pahari +bga I L Gwamhi-Wuri +bgb I L Bobongko +bgc I L Haryanvi +bgd I L Rathwi Bareli +bge I L Bauria +bgf I L Bangandu +bgg I L Bugun +bgi I L Giangan +bgj I L Bangolan +bgk I L Bit +bgl I L Bo (Laos) +bgm I L Baga Mboteni +bgn I L Western Balochi +bgo I L Baga Koga +bgp I L Eastern Balochi +bgq I L Bagri +bgr I L Bawm Chin +bgs I L Tagabawa +bgt I L Bughotu +bgu I L Mbongno +bgv I L Warkay-Bipim +bgw I L Bhatri +bgx I L Balkan Gagauz Turkish +bgy I L Benggoi +bgz I L Banggai +bha I L Bharia +bhb I L Bhili +bhc I L Biga +bhd I L Bhadrawahi +bhe I L Bhaya +bhf I L Odiai +bhg I L Binandere +bhh I L Bukharic +bhi I L Bhilali +bhj I L Bahing +bhl I L Bimin +bhm I L Bathari +bhn I L Bohtan Neo-Aramaic +bho bho bho I L Bhojpuri +bhp I L Bima +bhq I L Tukang Besi South +bhr I L Bara Malagasy +bhs I L Buwal +bht I L Bhattiyali +bhu I L Bhunjia +bhv I L Bahau +bhw I L Biak +bhx I L Bhalay +bhy I L Bhele +bhz I L Bada (Indonesia) +bia I L Badimaya +bib I L Bissa +bic I L Bikaru +bid I L Bidiyo +bie I L Bepour +bif I L Biafada +big I L Biangai +bij I L Vaghat-Ya-Bijim-Legeri +bik bik bik M L Bikol +bil I L Bile +bim I L Bimoba +bin bin bin I L Bini +bio I L Nai +bip I L Bila +biq I L Bipi +bir I L Bisorio +bis bis bis bi I L Bislama +bit I L Berinomo +biu I L Biete +biv I L Southern Birifor +biw I L Kol (Cameroon) +bix I L Bijori +biy I L Birhor +biz I L Baloi +bja I L Budza +bjb I E Banggarla +bjc I L Bariji +bjd I L Bandjigali +bje I L Biao-Jiao Mien +bjf I L Barzani Jewish Neo-Aramaic +bjg I L Bidyogo +bjh I L Bahinemo +bji I L Burji +bjj I L Kanauji +bjk I L Barok +bjl I L Bulu (Papua New Guinea) +bjm I L Bajelani +bjn I L Banjar +bjo I L Mid-Southern Banda +bjq I L Southern Betsimisaraka Malagasy +bjr I L Binumarien +bjs I L Bajan +bjt I L Balanta-Ganja +bju I L Busuu +bjv I L Bedjond +bjw I L Bakwé +bjx I L Banao Itneg +bjy I E Bayali +bjz I L Baruga +bka I L Kyak +bkc I L Baka (Cameroon) +bkd I L Binukid +bkf I L Beeke +bkg I L Buraka +bkh I L Bakoko +bki I L Baki +bkj I L Pande +bkk I L Brokskat +bkl I L Berik +bkm I L Kom (Cameroon) +bkn I L Bukitan +bko I L Kwa' +bkp I L Boko (Democratic Republic of Congo) +bkq I L Bakairí +bkr I L Bakumpai +bks I L Northern Sorsoganon +bkt I L Boloki +bku I L Buhid +bkv I L Bekwarra +bkw I L Bekwil +bkx I L Baikeno +bky I L Bokyi +bkz I L Bungku +bla bla bla I L Siksika +blb I L Bilua +blc I L Bella Coola +bld I L Bolango +ble I L Balanta-Kentohe +blf I L Buol +blg I L Balau +blh I L Kuwaa +bli I L Bolia +blj I L Bolongan +blk I L Pa'o Karen +bll I E Biloxi +blm I L Beli (Sudan) +bln I L Southern Catanduanes Bicolano +blo I L Anii +blp I L Blablanga +blq I L Baluan-Pam +blr I L Blang +bls I L Balaesang +blt I L Tai Dam +blv I L Bolo +blw I L Balangao +blx I L Mag-Indi Ayta +bly I L Notre +blz I L Balantak +bma I L Lame +bmb I L Bembe +bmc I L Biem +bmd I L Baga Manduri +bme I L Limassa +bmf I L Bom +bmg I L Bamwe +bmh I L Kein +bmi I L Bagirmi +bmj I L Bote-Majhi +bmk I L Ghayavi +bml I L Bomboli +bmm I L Northern Betsimisaraka Malagasy +bmn I E Bina (Papua New Guinea) +bmo I L Bambalang +bmp I L Bulgebi +bmq I L Bomu +bmr I L Muinane +bms I L Bilma Kanuri +bmt I L Biao Mon +bmu I L Burum-Mindik +bmv I L Bum +bmw I L Bomwali +bmx I L Baimak +bmy I L Bemba (Democratic Republic of Congo) +bmz I L Baramu +bna I L Bonerate +bnb I L Bookan +bnc M L Bontok +bnd I L Banda (Indonesia) +bne I L Bintauna +bnf I L Masiwang +bng I L Benga +bni I L Bangi +bnj I L Eastern Tawbuid +bnk I L Bierebo +bnl I L Boon +bnm I L Batanga +bnn I L Bunun +bno I L Bantoanon +bnp I L Bola +bnq I L Bantik +bnr I L Butmas-Tur +bns I L Bundeli +bnu I L Bentong +bnv I L Bonerif +bnw I L Bisis +bnx I L Bangubangu +bny I L Bintulu +bnz I L Beezen +boa I L Bora +bob I L Aweer +bod tib bod bo I L Tibetan +boe I L Mundabli +bof I L Bolon +bog I L Bamako Sign Language +boh I L Boma +boi I E Barbareño +boj I L Anjam +bok I L Bonjo +bol I L Bole +bom I L Berom +bon I L Bine +boo I L Tiemacèwè Bozo +bop I L Bonkiman +boq I L Bogaya +bor I L Borôro +bos bos bos bs I L Bosnian +bot I L Bongo +bou I L Bondei +bov I L Tuwuli +bow I E Rema +box I L Buamu +boy I L Bodo (Central African Republic) +boz I L Tiéyaxo Bozo +bpa I L Dakaka +bpb I E Barbacoas +bpd I L Banda-Banda +bpg I L Bonggo +bph I L Botlikh +bpi I L Bagupi +bpj I L Binji +bpk I L Orowe +bpl I L Broome Pearling Lugger Pidgin +bpm I L Biyom +bpn I L Dzao Min +bpo I L Anasi +bpp I L Kaure +bpq I L Banda Malay +bpr I L Koronadal Blaan +bps I L Sarangani Blaan +bpt I E Barrow Point +bpu I L Bongu +bpv I L Bian Marind +bpw I L Bo (Papua New Guinea) +bpx I L Palya Bareli +bpy I L Bishnupriya +bpz I L Bilba +bqa I L Tchumbuli +bqb I L Bagusa +bqc I L Boko (Benin) +bqd I L Bung +bqf I E Baga Kaloum +bqg I L Bago-Kusuntu +bqh I L Baima +bqi I L Bakhtiari +bqj I L Bandial +bqk I L Banda-Mbrès +bql I L Bilakura +bqm I L Wumboko +bqn I L Bulgarian Sign Language +bqo I L Balo +bqp I L Busa +bqq I L Biritai +bqr I L Burusu +bqs I L Bosngun +bqt I L Bamukumbit +bqu I L Boguru +bqv I L Begbere-Ejar +bqw I L Buru (Nigeria) +bqx I L Baangi +bqy I L Bengkala Sign Language +bqz I L Bakaka +bra bra bra I L Braj +brb I L Lave +brc I E Berbice Creole Dutch +brd I L Baraamu +bre bre bre br I L Breton +brf I L Bera +brg I L Baure +brh I L Brahui +bri I L Mokpwe +brj I L Bieria +brk I E Birked +brl I L Birwa +brm I L Barambu +brn I L Boruca +bro I L Brokkat +brp I L Barapasi +brq I L Breri +brr I L Birao +brs I L Baras +brt I L Bitare +bru I L Eastern Bru +brv I L Western Bru +brw I L Bellari +brx I L Bodo (India) +bry I L Burui +brz I L Bilbil +bsa I L Abinomn +bsb I L Brunei Bisaya +bsc I L Bassari +bse I L Wushi +bsf I L Bauchi +bsg I L Bashkardi +bsh I L Kati +bsi I L Bassossi +bsj I L Bangwinji +bsk I L Burushaski +bsl I E Basa-Gumna +bsm I L Busami +bsn I L Barasana-Eduria +bso I L Buso +bsp I L Baga Sitemu +bsq I L Bassa +bsr I L Bassa-Kontagora +bss I L Akoose +bst I L Basketo +bsu I L Bahonsuai +bsv I E Baga Sobané +bsw I L Baiso +bsx I L Yangkam +bsy I L Sabah Bisaya +bta I L Bata +btc I L Bati (Cameroon) +btd I L Batak Dairi +bte I E Gamo-Ningi +btf I L Birgit +btg I L Gagnoa Bété +bth I L Biatah Bidayuh +bti I L Burate +btj I L Bacanese Malay +btl I L Bhatola +btm I L Batak Mandailing +btn I L Ratagnon +bto I L Rinconada Bikol +btp I L Budibud +btq I L Batek +btr I L Baetora +bts I L Batak Simalungun +btt I L Bete-Bendi +btu I L Batu +btv I L Bateri +btw I L Butuanon +btx I L Batak Karo +bty I L Bobot +btz I L Batak Alas-Kluet +bua bua bua M L Buriat +bub I L Bua +buc I L Bushi +bud I L Ntcham +bue I E Beothuk +buf I L Bushoong +bug bug bug I L Buginese +buh I L Younuo Bunu +bui I L Bongili +buj I L Basa-Gurmana +buk I L Bugawac +bul bul bul bg I L Bulgarian +bum I L Bulu (Cameroon) +bun I L Sherbro +buo I L Terei +bup I L Busoa +buq I L Brem +bus I L Bokobaru +but I L Bungain +buu I L Budu +buv I L Bun +buw I L Bubi +bux I L Boghom +buy I L Bullom So +buz I L Bukwen +bva I L Barein +bvb I L Bube +bvc I L Baelelea +bvd I L Baeggu +bve I L Berau Malay +bvf I L Boor +bvg I L Bonkeng +bvh I L Bure +bvi I L Belanda Viri +bvj I L Baan +bvk I L Bukat +bvl I L Bolivian Sign Language +bvm I L Bamunka +bvn I L Buna +bvo I L Bolgo +bvq I L Birri +bvr I L Burarra +bvt I L Bati (Indonesia) +bvu I L Bukit Malay +bvv I E Baniva +bvw I L Boga +bvx I L Dibole +bvy I L Baybayanon +bvz I L Bauzi +bwa I L Bwatoo +bwb I L Namosi-Naitasiri-Serua +bwc I L Bwile +bwd I L Bwaidoka +bwe I L Bwe Karen +bwf I L Boselewa +bwg I L Barwe +bwh I L Bishuo +bwi I L Baniwa +bwj I L Láá Láá Bwamu +bwk I L Bauwaki +bwl I L Bwela +bwm I L Biwat +bwn I L Wunai Bunu +bwo I L Boro (Ethiopia) +bwp I L Mandobo Bawah +bwq I L Southern Bobo Madaré +bwr I L Bura-Pabir +bws I L Bomboma +bwt I L Bafaw-Balong +bwu I L Buli (Ghana) +bww I L Bwa +bwx I L Bu-Nao Bunu +bwy I L Cwi Bwamu +bwz I L Bwisi +bxa I L Bauro +bxb I L Belanda Bor +bxc I L Molengue +bxd I L Pela +bxe I L Birale +bxf I L Bilur +bxg I L Bangala +bxh I L Buhutu +bxi I E Pirlatapa +bxj I L Bayungu +bxk I L Bukusu +bxl I L Jalkunan +bxm I L Mongolia Buriat +bxn I L Burduna +bxo I L Barikanchi +bxp I L Bebil +bxq I L Beele +bxr I L Russia Buriat +bxs I L Busam +bxu I L China Buriat +bxv I L Berakou +bxw I L Bankagooma +bxx I L Borna (Democratic Republic of Congo) +bxz I L Binahari +bya I L Batak +byb I L Bikya +byc I L Ubaghara +byd I L Benyadu' +bye I L Pouye +byf I L Bete +byg I E Baygo +byh I L Bhujel +byi I L Buyu +byj I L Bina (Nigeria) +byk I L Biao +byl I L Bayono +bym I L Bidyara +byn byn byn I L Bilin +byo I L Biyo +byp I L Bumaji +byq I E Basay +byr I L Baruya +bys I L Burak +byt I E Berti +byv I L Medumba +byw I L Belhariya +byx I L Qaqet +byy I L Buya +byz I L Banaro +bza I L Bandi +bzb I L Andio +bzd I L Bribri +bze I L Jenaama Bozo +bzf I L Boikin +bzg I L Babuza +bzh I L Mapos Buang +bzi I L Bisu +bzj I L Belize Kriol English +bzk I L Nicaragua Creole English +bzl I L Boano (Sulawesi) +bzm I L Bolondo +bzn I L Boano (Maluku) +bzo I L Bozaba +bzp I L Kemberano +bzq I L Buli (Indonesia) +bzr I E Biri +bzs I L Brazilian Sign Language +bzt I C Brithenig +bzu I L Burmeso +bzv I L Bebe +bzw I L Basa (Nigeria) +bzx I L Hainyaxo Bozo +bzy I L Obanliku +bzz I L Evant +caa I L Chortí +cab I L Garifuna +cac I L Chuj +cad cad cad I L Caddo +cae I L Lehar +caf I L Southern Carrier +cag I L Nivaclé +cah I L Cahuarano +caj I E Chané +cak I L Kaqchikel +cal I L Carolinian +cam I L Cemuhî +can I L Chambri +cao I L Chácobo +cap I L Chipaya +caq I L Car Nicobarese +car car car I L Galibi Carib +cas I L Tsimané +cat cat cat ca I L Catalan +cav I L Cavineña +caw I L Callawalla +cax I L Chiquitano +cay I L Cayuga +caz I E Canichana +cbb I L Cabiyarí +cbc I L Carapana +cbd I L Carijona +cbe I E Chipiajes +cbg I L Chimila +cbh I E Cagua +cbi I L Chachi +cbj I L Ede Cabe +cbk I L Chavacano +cbl I L Bualkhaw Chin +cbn I L Nyahkur +cbo I L Izora +cbr I L Cashibo-Cacataibo +cbs I L Cashinahua +cbt I L Chayahuita +cbu I L Candoshi-Shapra +cbv I L Cacua +cbw I L Kinabalian +cby I L Carabayo +cca I E Cauca +ccc I L Chamicuro +ccd I L Cafundo Creole +cce I L Chopi +ccg I L Samba Daka +cch I L Atsam +ccj I L Kasanga +ccl I L Cutchi-Swahili +ccm I L Malaccan Creole Malay +cco I L Comaltepec Chinantec +ccp I L Chakma +ccq I L Chaungtha +ccr I E Cacaopera +cda I L Choni +cde I L Chenchu +cdf I L Chiru +cdg I L Chamari +cdh I L Chambeali +cdi I L Chodri +cdj I L Churahi +cdm I L Chepang +cdn I L Chaudangsi +cdo I L Min Dong Chinese +cdr I L Cinda-Regi-Tiyal +cds I L Chadian Sign Language +cdy I L Chadong +cdz I L Koda +cea I E Lower Chehalis +ceb ceb ceb I L Cebuano +ceg I L Chamacoco +cen I L Cen +ces cze ces cs I L Czech +cet I L Centúúm +cfa I L Dijim-Bwilim +cfd I L Cara +cfg I L Como Karim +cfm I L Falam Chin +cga I L Changriwa +cgc I L Kagayanen +cgg I L Chiga +cgk I L Chocangacakha +cha cha cha ch I L Chamorro +chb chb chb I E Chibcha +chc I E Catawba +chd I L Highland Oaxaca Chontal +che che che ce I L Chechen +chf I L Tabasco Chontal +chg chg chg I E Chagatai +chh I L Chinook +chj I L Ojitlán Chinantec +chk chk chk I L Chuukese +chl I L Cahuilla +chm chm chm M L Mari (Russia) +chn chn chn I L Chinook jargon +cho cho cho I L Choctaw +chp chp chp I L Chipewyan +chq I L Quiotepec Chinantec +chr chr chr I L Cherokee +cht I E Cholón +chu chu chu cu I A Church Slavic +chv chv chv cv I L Chuvash +chw I L Chuwabu +chx I L Chantyal +chy chy chy I L Cheyenne +chz I L Ozumacín Chinantec +cia I L Cia-Cia +cib I L Ci Gbe +cic I L Chickasaw +cid I E Chimariko +cie I L Cineni +cih I L Chinali +cik I L Chitkuli Kinnauri +cim I L Cimbrian +cin I L Cinta Larga +cip I L Chiapanec +cir I L Tiri +ciw I L Chippewa +ciy I L Chaima +cja I L Western Cham +cje I L Chru +cjh I E Upper Chehalis +cji I L Chamalal +cjk I L Chokwe +cjm I L Eastern Cham +cjn I L Chenapian +cjo I L Ashéninka Pajonal +cjp I L Cabécar +cjs I L Shor +cjv I L Chuave +cjy I L Jinyu Chinese +cka I L Khumi Awa Chin +ckb I L Central Kurdish +ckh I L Chak +ckl I L Cibak +cko I L Anufo +ckq I L Kajakse +ckr I L Kairak +cks I L Tayo +ckt I L Chukot +cku I L Koasati +ckv I L Kavalan +ckx I L Caka +cky I L Cakfem-Mushere +ckz I L Cakchiquel-Quiché Mixed Language +cla I L Ron +clc I L Chilcotin +cld I L Chaldean Neo-Aramaic +cle I L Lealao Chinantec +clh I L Chilisso +cli I L Chakali +clk I L Idu-Mishmi +cll I L Chala +clm I L Clallam +clo I L Lowland Oaxaca Chontal +clu I L Caluyanun +clw I L Chulym +cly I L Eastern Highland Chatino +cma I L Maa +cme I L Cerma +cmg I H Classical Mongolian +cmi I L Emberá-Chamí +cml I L Campalagian +cmm I E Michigamea +cmn I L Mandarin Chinese +cmo I L Central Mnong +cmr I L Mro Chin +cms I A Messapic +cmt I L Camtho +cna I L Changthang +cnb I L Chinbon Chin +cnc I L Côông +cng I L Northern Qiang +cnh I L Haka Chin +cni I L Asháninka +cnk I L Khumi Chin +cnl I L Lalana Chinantec +cno I L Con +cns I L Central Asmat +cnt I L Tepetotutla Chinantec +cnu I L Chenoua +cnw I L Ngawn Chin +cnx I H Middle Cornish +coa I L Cocos Islands Malay +cob I E Chicomuceltec +coc I L Cocopa +cod I L Cocama-Cocamilla +coe I L Koreguaje +cof I L Colorado +cog I L Chong +coh I L Chonyi-Dzihana-Kauma +coj I E Cochimi +cok I L Santa Teresa Cora +col I L Columbia-Wenatchi +com I L Comanche +con I L Cofán +coo I L Comox +cop cop cop I E Coptic +coq I E Coquille +cor cor cor kw I L Cornish +cos cos cos co I L Corsican +cot I L Caquinte +cou I L Wamey +cov I L Cao Miao +cow I E Cowlitz +cox I L Nanti +coy I E Coyaima +coz I L Chochotec +cpa I L Palantla Chinantec +cpb I L Ucayali-Yurúa Ashéninka +cpc I L Ajyíninka Apurucayali +cpg I E Cappadocian Greek +cpi I L Chinese Pidgin English +cpn I L Cherepon +cps I L Capiznon +cpu I L Pichis Ashéninka +cpx I L Pu-Xian Chinese +cpy I L South Ucayali Ashéninka +cqd I L Chuanqiandian Cluster Miao +cqu I L Chilean Quechua +cra I L Chara +crb I E Island Carib +crc I L Lonwolwol +crd I L Coeur d'Alene +cre cre cre cr M L Cree +crf I E Caramanta +crg I L Michif +crh crh crh I L Crimean Tatar +cri I L Sãotomense +crj I L Southern East Cree +crk I L Plains Cree +crl I L Northern East Cree +crm I L Moose Cree +crn I L El Nayar Cora +cro I L Crow +crq I L Iyo'wujwa Chorote +crr I E Carolina Algonquian +crs I L Seselwa Creole French +crt I L Iyojwa'ja Chorote +crv I L Chaura +crw I L Chrau +crx I L Carrier +cry I L Cori +crz I E Cruzeño +csa I L Chiltepec Chinantec +csb csb csb I L Kashubian +csc I L Catalan Sign Language +csd I L Chiangmai Sign Language +cse I L Czech Sign Language +csf I L Cuba Sign Language +csg I L Chilean Sign Language +csh I L Asho Chin +csi I E Coast Miwok +csk I L Jola-Kasa +csl I L Chinese Sign Language +csm I L Central Sierra Miwok +csn I L Colombian Sign Language +cso I L Sochiapam Chinantec +csq I L Croatia Sign Language +csr I L Costa Rican Sign Language +css I E Southern Ohlone +cst I L Northern Ohlone +csw I L Swampy Cree +csy I L Siyin Chin +csz I L Coos +cta I L Tataltepec Chatino +ctc I L Chetco +ctd I L Tedim Chin +cte I L Tepinapa Chinantec +ctg I L Chittagonian +ctl I L Tlacoatzintepec Chinantec +ctm I E Chitimacha +ctn I L Chhintange +cto I L Emberá-Catío +ctp I L Western Highland Chatino +cts I L Northern Catanduanes Bicolano +ctt I L Wayanad Chetti +ctu I L Chol +ctz I L Zacatepec Chatino +cua I L Cua +cub I L Cubeo +cuc I L Usila Chinantec +cug I L Cung +cuh I L Chuka +cui I L Cuiba +cuj I L Mashco Piro +cuk I L San Blas Kuna +cul I L Culina +cum I E Cumeral +cuo I E Cumanagoto +cup I E Cupeño +cuq I L Cun +cur I L Chhulung +cut I L Teutila Cuicatec +cuu I L Tai Ya +cuv I L Cuvok +cuw I L Chukwa +cux I L Tepeuxila Cuicatec +cvg I L Chug +cvn I L Valle Nacional Chinantec +cwa I L Kabwa +cwb I L Maindo +cwd I L Woods Cree +cwe I L Kwere +cwg I L Chewong +cwt I L Kuwaataay +cya I L Nopala Chatino +cyb I E Cayubaba +cym wel cym cy I L Welsh +cyo I L Cuyonon +czh I L Huizhou Chinese +czk I E Knaanic +czn I L Zenzontepec Chatino +czo I L Min Zhong Chinese +czt I L Zotung Chin +daa I L Dangaléat +dac I L Dambi +dad I L Marik +dae I L Duupa +daf I L Dan +dag I L Dagbani +dah I L Gwahatike +dai I L Day +daj I L Dar Fur Daju +dak dak dak I L Dakota +dal I L Dahalo +dam I L Damakawa +dan dan dan da I L Danish +dao I L Daai Chin +dap I L Nisi (India) +daq I L Dandami Maria +dar dar dar I L Dargwa +das I L Daho-Doo +dau I L Dar Sila Daju +dav I L Taita +daw I L Davawenyo +dax I L Dayi +daz I L Dao +dba I L Bangi Me +dbb I L Deno +dbd I L Dadiya +dbe I L Dabe +dbf I L Edopi +dbg I L Dogul Dom Dogon +dbi I L Doka +dbj I L Ida'an +dbl I L Dyirbal +dbm I L Duguri +dbn I L Duriankere +dbo I L Dulbu +dbp I L Duwai +dbq I L Daba +dbr I L Dabarre +dbu I L Bondum Dom Dogon +dbv I L Dungu +dby I L Dibiyaso +dcc I L Deccan +dcr I E Negerhollands +ddd I L Dongotono +dde I L Doondo +ddg I L Fataluku +ddi I L West Goodenough +ddj I L Jaru +ddn I L Dendi (Benin) +ddo I L Dido +dds I L Donno So Dogon +ddw I L Dawera-Daweloor +dec I L Dagik +ded I L Dedua +dee I L Dewoin +def I L Dezfuli +deg I L Degema +deh I L Dehwari +dei I L Demisa +dek I L Dek +del del del M L Delaware +dem I L Dem +den den den M L Slave (Athapascan) +dep I E Pidgin Delaware +deq I L Dendi (Central African Republic) +der I L Deori +des I L Desano +deu ger deu de I L German +dev I L Domung +dez I L Dengese +dga I L Southern Dagaare +dgb I L Bunoge Dogon +dgc I L Casiguran Dumagat Agta +dgd I L Dagaari Dioula +dge I L Degenan +dgg I L Doga +dgh I L Dghwede +dgi I L Northern Dagara +dgk I L Dagba +dgn I E Dagoman +dgo I L Dogri (individual language) +dgr dgr dgr I L Dogrib +dgs I L Dogoso +dgu I L Degaru +dgx I L Doghoro +dgz I L Daga +dha I L Dhanwar (India) +dhd I L Dhundari +dhg I L Dhangu +dhi I L Dhimal +dhl I L Dhalandji +dhm I L Zemba +dhn I L Dhanki +dho I L Dhodia +dhr I L Dhargari +dhs I L Dhaiso +dhu I E Dhurga +dhv I L Dehu +dhw I L Dhanwar (Nepal) +dia I L Dia +dib I L South Central Dinka +dic I L Lakota Dida +did I L Didinga +dif I E Dieri +dig I L Digo +dih I L Kumiai +dii I L Dimbong +dij I L Dai +dik I L Southwestern Dinka +dil I L Dilling +dim I L Dime +din din din M L Dinka +dio I L Dibo +dip I L Northeastern Dinka +diq I L Dimli (individual language) +dir I L Dirim +dis I L Dimasa +dit I E Dirari +diu I L Diriku +div div div dv I L Dhivehi +diw I L Northwestern Dinka +dix I L Dixon Reef +diy I L Diuwe +diz I L Ding +djb I L Djinba +djc I L Dar Daju Daju +djd I L Djamindjung +dje I L Zarma +djf I E Djangun +dji I L Djinang +djj I L Djeebbana +djk I L Eastern Maroon Creole +djl I E Djiwarli +djm I L Jamsay Dogon +djn I L Djauan +djo I L Jangkang +djr I L Djambarrpuyngu +dju I L Kapriman +djw I E Djawi +dka I L Dakpakha +dkk I L Dakka +dkl I L Kolum So Dogon +dkr I L Kuijau +dks I L Southeastern Dinka +dkx I L Mazagway +dlg I L Dolgan +dlm I E Dalmatian +dln I L Darlong +dma I L Duma +dmc I L Dimir +dme I L Dugwor +dmg I L Upper Kinabatangan +dmk I L Domaaki +dml I L Dameli +dmm I L Dama +dmo I L Kemezung +dmr I L East Damar +dms I L Dampelas +dmu I L Dubu +dmv I L Dumpas +dmx I L Dema +dmy I L Demta +dna I L Upper Grand Valley Dani +dnd I L Daonda +dne I L Ndendeule +dng I L Dungan +dni I L Lower Grand Valley Dani +dnk I L Dengka +dnn I L Dzùùngoo +dnr I L Danaru +dnt I L Mid Grand Valley Dani +dnu I L Danau +dnw I L Western Dani +dny I L Dení +doa I L Dom +dob I L Dobu +doc I L Northern Dong +doe I L Doe +dof I L Domu +doh I L Dong +doi doi doi M L Dogri (macrolanguage) +dok I L Dondo +dol I L Doso +don I L Toura (Papua New Guinea) +doo I L Dongo +dop I L Lukpa +doq I L Dominican Sign Language +dor I L Dori'o +dos I L Dogosé +dot I L Dass +dov I L Dombe +dow I L Doyayo +dox I L Bussa +doy I L Dompo +doz I L Dorze +dpp I L Papar +drb I L Dair +drd I L Darmiya +dre I L Dolpo +drg I L Rungus +dri I L C'lela +drl I L Darling +drn I L West Damar +dro I L Daro-Matu Melanau +drq I E Dura +drr I E Dororo +drs I L Gedeo +drt I L Drents +dru I L Rukai +dry I L Darai +dsb dsb dsb I L Lower Sorbian +dse I L Dutch Sign Language +dsh I L Daasanach +dsi I L Disa +dsl I L Danish Sign Language +dsn I L Dusner +dso I L Desiya +dsq I L Tadaksahak +dta I L Daur +dtb I L Labuk-Kinabatangan Kadazan +dti I L Ana Tinga Dogon +dtk I L Tene Kan Dogon +dtm I L Tomo Kan Dogon +dtp I L Central Dusun +dtr I L Lotud +dts I L Toro So Dogon +dtt I L Toro Tegu Dogon +dtu I L Tebul Ure Dogon +dua dua dua I L Duala +dub I L Dubli +duc I L Duna +dud I L Hun-Saare +due I L Umiray Dumaget Agta +duf I L Dumbea +dug I L Duruma +duh I L Dungra Bhil +dui I L Dumun +duj I L Dhuwal +duk I L Duduela +dul I L Alabat Island Agta +dum dum dum I H Middle Dutch (ca. 1050-1350) +dun I L Dusun Deyah +duo I L Dupaninan Agta +dup I L Duano +duq I L Dusun Malang +dur I L Dii +dus I L Dumi +duu I L Drung +duv I L Duvle +duw I L Dusun Witu +dux I L Duungooma +duy I E Dicamay Agta +duz I E Duli +dva I L Duau +dwa I L Diri +dwl I L Walo Kumbe Dogon +dwr I L Dawro +dws I C Dutton World Speedwords +dww I L Dawawa +dya I L Dyan +dyb I E Dyaberdyaber +dyd I E Dyugun +dyg I E Villa Viciosa Agta +dyi I L Djimini Senoufo +dym I L Yanda Dom Dogon +dyn I L Dyangadi +dyo I L Jola-Fonyi +dyu dyu dyu I L Dyula +dyy I L Dyaabugay +dza I L Tunzu +dzd I L Daza +dzg I L Dazaga +dzl I L Dzalakha +dzn I L Dzando +dzo dzo dzo dz I L Dzongkha +ebg I L Ebughu +ebk I L Eastern Bontok +ebo I L Teke-Ebo +ebr I L Ebrié +ebu I L Embu +ecr I A Eteocretan +ecs I L Ecuadorian Sign Language +ecy I A Eteocypriot +eee I L E +efa I L Efai +efe I L Efe +efi efi efi I L Efik +ega I L Ega +egl I L Emilian +ego I L Eggon +egy egy egy I A Egyptian (Ancient) +ehu I L Ehueun +eip I L Eipomek +eit I L Eitiep +eiv I L Askopan +eja I L Ejamat +eka eka eka I L Ekajuk +eke I L Ekit +ekg I L Ekari +eki I L Eki +ekk I L Standard Estonian +ekl I L Kol +ekm I L Elip +eko I L Koti +ekp I L Ekpeye +ekr I L Yace +eky I L Eastern Kayah +ele I L Elepi +elh I L El Hugeirat +eli I E Nding +elk I L Elkei +ell gre ell el I L Modern Greek (1453-) +elm I L Eleme +elo I L El Molo +elp I L Elpaputih +elu I L Elu +elx elx elx I A Elamite +ema I L Emai-Iuleha-Ora +emb I L Embaloh +eme I L Emerillon +emg I L Eastern Meohang +emi I L Mussau-Emira +emk I L Eastern Maninkakan +emm I E Mamulique +emn I L Eman +emo I E Emok +emp I L Northern Emberá +ems I L Pacific Gulf Yupik +emu I L Eastern Muria +emw I L Emplawas +emx I L Erromintxela +emy I E Epigraphic Mayan +ena I L Apali +enb I L Markweeta +enc I L En +end I L Ende +enf I L Forest Enets +eng eng eng en I L English +enh I L Tundra Enets +enm enm enm I H Middle English (1100-1500) +enn I L Engenni +eno I L Enggano +enq I L Enga +enr I L Emumu +enu I L Enu +env I L Enwan (Edu State) +enw I L Enwan (Akwa Ibom State) +eot I L Beti (Côte d'Ivoire) +epi I L Epie +epo epo epo eo I C Esperanto +era I L Eravallan +erg I L Sie +erh I L Eruwa +eri I L Ogea +erk I L South Efate +ero I L Horpa +err I E Erre +ers I L Ersu +ert I L Eritai +erw I L Erokwanas +ese I L Ese Ejja +esh I L Eshtehardi +esi I L North Alaskan Inupiatun +esk I L Northwest Alaska Inupiatun +esl I L Egypt Sign Language +esm I E Esuma +esn I L Salvadoran Sign Language +eso I L Estonian Sign Language +esq I E Esselen +ess I L Central Siberian Yupik +est est est et M L Estonian +esu I L Central Yupik +etb I L Etebi +etc I E Etchemin +eth I L Ethiopian Sign Language +etn I L Eton (Vanuatu) +eto I L Eton (Cameroon) +etr I L Edolo +ets I L Yekhee +ett I A Etruscan +etu I L Ejagham +etx I L Eten +etz I L Semimi +eus baq eus eu I L Basque +eve I L Even +evh I L Uvbie +evn I L Evenki +ewe ewe ewe ee I L Ewe +ewo ewo ewo I L Ewondo +ext I L Extremaduran +eya I E Eyak +eyo I L Keiyo +eze I L Uzekwe +faa I L Fasu +fab I L Fa D'ambu +fad I L Wagi +faf I L Fagani +fag I L Finongan +fah I L Baissa Fali +fai I L Faiwol +faj I L Faita +fak I L Fang (Cameroon) +fal I L South Fali +fam I L Fam +fan fan fan I L Fang (Equatorial Guinea) +fao fao fao fo I L Faroese +fap I L Palor +far I L Fataleka +fas per fas fa M L Persian +fat fat fat I L Fanti +fau I L Fayu +fax I L Fala +fay I L Southwestern Fars +faz I L Northwestern Fars +fbl I L West Albay Bikol +fcs I L Quebec Sign Language +fer I L Feroge +ffi I L Foia Foia +ffm I L Maasina Fulfulde +fgr I L Fongoro +fia I L Nobiin +fie I L Fyer +fij fij fij fj I L Fijian +fil fil fil I L Filipino +fin fin fin fi I L Finnish +fip I L Fipa +fir I L Firan +fit I L Tornedalen Finnish +fiw I L Fiwaga +fkv I L Kven Finnish +fla I L Kalispel-Pend d'Oreille +flh I L Foau +fli I L Fali +fll I L North Fali +fln I E Flinders Island +flr I L Fuliiru +fly I L Tsotsitaal +fmp I L Fe'fe' +fmu I L Far Western Muria +fng I L Fanagalo +fni I L Fania +fod I L Foodo +foi I L Foi +fom I L Foma +fon fon fon I L Fon +for I L Fore +fos I E Siraya +fpe I L Fernando Po Creole English +fqs I L Fas +fra fre fra fr I L French +frc I L Cajun French +frd I L Fordata +frk I E Frankish +frm frm frm I H Middle French (ca. 1400-1600) +fro fro fro I H Old French (842-ca. 1400) +frp I L Arpitan +frq I L Forak +frr frr frr I L Northern Frisian +frs frs frs I L Eastern Frisian +frt I L Fortsenal +fry fry fry fy I L Western Frisian +fse I L Finnish Sign Language +fsl I L French Sign Language +fss I L Finland-Swedish Sign Language +fub I L Adamawa Fulfulde +fuc I L Pulaar +fud I L East Futuna +fue I L Borgu Fulfulde +fuf I L Pular +fuh I L Western Niger Fulfulde +fui I L Bagirmi Fulfulde +fuj I L Ko +ful ful ful ff M L Fulah +fum I L Fum +fun I L Fulniô +fuq I L Central-Eastern Niger Fulfulde +fur fur fur I L Friulian +fut I L Futuna-Aniwa +fuu I L Furu +fuv I L Nigerian Fulfulde +fuy I L Fuyug +fvr I L Fur +fwa I L Fwâi +fwe I L Fwe +gaa gaa gaa I L Ga +gab I L Gabri +gac I L Mixed Great Andamanese +gad I L Gaddang +gae I L Guarequena +gaf I L Gende +gag I L Gagauz +gah I L Alekano +gai I L Borei +gaj I L Gadsup +gak I L Gamkonora +gal I L Galoli +gam I L Kandawo +gan I L Gan Chinese +gao I L Gants +gap I L Gal +gaq I L Gata' +gar I L Galeya +gas I L Adiwasi Garasia +gat I L Kenati +gau I L Mudhili Gadaba +gaw I L Nobonob +gax I L Borana-Arsi-Guji Oromo +gay gay gay I L Gayo +gaz I L West Central Oromo +gba gba gba M L Gbaya (Central African Republic) +gbb I L Kaytetye +gbc I L Garawa +gbd I L Karadjeri +gbe I L Niksek +gbf I L Gaikundi +gbg I L Gbanziri +gbh I L Defi Gbe +gbi I L Galela +gbj I L Bodo Gadaba +gbk I L Gaddi +gbl I L Gamit +gbm I L Garhwali +gbn I L Mo'da +gbo I L Northern Grebo +gbp I L Gbaya-Bossangoa +gbq I L Gbaya-Bozoum +gbr I L Gbagyi +gbs I L Gbesi Gbe +gbu I L Gagadu +gbv I L Gbanu +gbx I L Eastern Xwla Gbe +gby I L Gbari +gbz I L Zoroastrian Dari +gcc I L Mali +gcd I E Ganggalida +gce I E Galice +gcf I L Guadeloupean Creole French +gcl I L Grenadian Creole English +gcn I L Gaina +gcr I L Guianese Creole French +gct I L Colonia Tovar German +gda I L Gade Lohar +gdb I L Pottangi Ollar Gadaba +gdc I E Gugu Badhun +gdd I L Gedaged +gde I L Gude +gdf I L Guduf-Gava +gdg I L Ga'dang +gdh I L Gadjerawang +gdi I L Gundi +gdj I L Gurdjar +gdk I L Gadang +gdl I L Dirasha +gdm I L Laal +gdn I L Umanakaina +gdo I L Ghodoberi +gdq I L Mehri +gdr I L Wipi +gdu I L Gudu +gdx I L Godwari +gea I L Geruma +geb I L Kire +gec I L Gboloo Grebo +ged I L Gade +geg I L Gengle +geh I L Hutterite German +gei I L Gebe +gej I L Gen +gek I L Yiwom +gel I L Kag-Fer-Jiir-Koor-Ror-Us-Zuksun +geq I L Geme +ges I L Geser-Gorom +gew I L Gera +gex I L Garre +gey I L Enya +gez gez gez I A Geez +gfk I L Patpatar +gft I E Gafat +gga I L Gao +ggb I L Gbii +ggd I E Gugadj +gge I L Guragone +ggg I L Gurgula +ggk I E Kungarakany +ggl I L Ganglau +ggn I L Eastern Gurung +ggo I L Southern Gondi +ggr I E Aghu Tharnggalu +ggt I L Gitua +ggu I L Gagu +ggw I L Gogodala +gha I L Ghadamès +ghc I E Hiberno-Scottish Gaelic +ghe I L Southern Ghale +ghh I L Northern Ghale +ghk I L Geko Karen +ghl I L Ghulfan +ghn I L Ghanongga +gho I E Ghomara +ghr I L Ghera +ghs I L Guhu-Samane +ght I L Kutang Ghale +gia I L Kitja +gib I L Gibanawa +gic I L Gail +gid I L Gidar +gig I L Goaria +gil gil gil I L Gilbertese +gim I L Gimi (Eastern Highlands) +gin I L Hinukh +gio I L Gelao +gip I L Gimi (West New Britain) +giq I L Green Gelao +gir I L Red Gelao +gis I L North Giziga +git I L Gitxsan +giw I L White Gelao +gix I L Gilima +giy I L Giyug +giz I L South Giziga +gji I L Geji +gjk I L Kachi Koli +gjn I L Gonja +gju I L Gujari +gka I L Guya +gke I L Ndai +gkn I L Gokana +gkp I L Guinea Kpelle +gla gla gla gd I L Scottish Gaelic +glc I L Bon Gula +gld I L Nanai +gle gle gle ga I L Irish +glg glg glg gl I L Galician +glh I L Northwest Pashayi +gli I E Guliguli +glj I L Gula Iro +glk I L Gilaki +glo I L Galambu +glr I L Glaro-Twabo +glu I L Gula (Chad) +glv glv glv gv I L Manx +glw I L Glavda +gly I E Gule +gma I E Gambera +gmb I L Gula'alaa +gmd I L Mághdì +gmh gmh gmh I H Middle High German (ca. 1050-1500) +gml I H Middle Low German +gmm I L Gbaya-Mbodomo +gmn I L Gimnime +gmu I L Gumalu +gmv I L Gamo +gmx I L Magoma +gmy I A Mycenaean Greek +gna I L Kaansa +gnb I L Gangte +gnc I E Guanche +gnd I L Zulgo-Gemzek +gne I L Ganang +gng I L Ngangam +gnh I L Lere +gni I L Gooniyandi +gnk I L //Gana +gnl I E Gangulu +gnm I L Ginuman +gnn I L Gumatj +gno I L Northern Gondi +gnq I L Gana +gnr I E Gureng Gureng +gnt I L Guntai +gnu I L Gnau +gnw I L Western Bolivian Guaraní +gnz I L Ganzi +goa I L Guro +gob I L Playero +goc I L Gorakor +god I L Godié +goe I L Gongduk +gof I L Gofa +gog I L Gogo +goh goh goh I H Old High German (ca. 750-1050) +goi I L Gobasi +goj I L Gowlan +gok I L Gowli +gol I L Gola +gom I L Goan Konkani +gon gon gon M L Gondi +goo I L Gone Dau +gop I L Yeretuar +goq I L Gorap +gor gor gor I L Gorontalo +gos I L Gronings +got got got I A Gothic +gou I L Gavar +gow I L Gorowa +gox I L Gobu +goy I L Goundo +goz I L Gozarkhani +gpa I L Gupa-Abawa +gpn I L Taiap +gqa I L Ga'anda +gqi I L Guiqiong +gqn I E Guana (Brazil) +gqr I L Gor +gra I L Rajput Garasia +grb grb grb M L Grebo +grc grc grc I H Ancient Greek (to 1453) +grd I L Guruntum-Mbaaru +grg I L Madi +grh I L Gbiri-Niragu +gri I L Ghari +grj I L Southern Grebo +grm I L Kota Marudu Talantang +grn grn grn gn M L Guarani +gro I L Groma +grq I L Gorovu +grr I L Taznatit +grs I L Gresi +grt I L Garo +gru I L Kistane +grv I L Central Grebo +grw I L Gweda +grx I L Guriaso +gry I L Barclayville Grebo +grz I L Guramalum +gse I L Ghanaian Sign Language +gsg I L German Sign Language +gsl I L Gusilay +gsm I L Guatemalan Sign Language +gsn I L Gusan +gso I L Southwest Gbaya +gsp I L Wasembo +gss I L Greek Sign Language +gsw gsw gsw I L Swiss German +gta I L Guató +gti I L Gbati-ri +gua I L Shiki +gub I L Guajajára +guc I L Wayuu +gud I L Yocoboué Dida +gue I L Gurinji +guf I L Gupapuyngu +gug I L Paraguayan Guaraní +guh I L Guahibo +gui I L Eastern Bolivian Guaraní +guj guj guj gu I L Gujarati +guk I L Gumuz +gul I L Sea Island Creole English +gum I L Guambiano +gun I L Mbyá Guaraní +guo I L Guayabero +gup I L Gunwinggu +guq I L Aché +gur I L Farefare +gus I L Guinean Sign Language +gut I L Maléku Jaíka +guu I L Yanomamö +guv I E Gey +guw I L Gun +gux I L Gourmanchéma +guz I L Gusii +gva I L Guana (Paraguay) +gvc I L Guanano +gve I L Duwet +gvf I L Golin +gvj I L Guajá +gvl I L Gulay +gvm I L Gurmana +gvn I L Kuku-Yalanji +gvo I L Gavião Do Jiparaná +gvp I L Pará Gavião +gvr I L Western Gurung +gvs I L Gumawana +gvy I E Guyani +gwa I L Mbato +gwb I L Gwa +gwc I L Kalami +gwd I L Gawwada +gwe I L Gweno +gwf I L Gowro +gwg I L Moo +gwi gwi gwi I L Gwichʼin +gwj I L /Gwi +gwn I L Gwandara +gwr I L Gwere +gwt I L Gawar-Bati +gwu I E Guwamu +gww I L Kwini +gwx I L Gua +gxx I L Wè Southern +gya I L Northwest Gbaya +gyb I L Garus +gyd I L Kayardild +gye I L Gyem +gyf I E Gungabula +gyg I L Gbayi +gyi I L Gyele +gyl I L Gayil +gym I L Ngäbere +gyn I L Guyanese Creole English +gyr I L Guarayu +gyy I E Gunya +gza I L Ganza +gzi I L Gazi +gzn I L Gane +haa I L Han +hab I L Hanoi Sign Language +hac I L Gurani +had I L Hatam +hae I L Eastern Oromo +haf I L Haiphong Sign Language +hag I L Hanga +hah I L Hahon +hai hai hai M L Haida +haj I L Hajong +hak I L Hakka Chinese +hal I L Halang +ham I L Hewa +han I L Hangaza +hao I L Hakö +hap I L Hupla +haq I L Ha +har I L Harari +has I L Haisla +hat hat hat ht I L Haitian +hau hau hau ha I L Hausa +hav I L Havu +haw haw haw I L Hawaiian +hax I L Southern Haida +hay I L Haya +haz I L Hazaragi +hba I L Hamba +hbb I L Huba +hbn I L Heiban +hbo I H Ancient Hebrew +hbs sh M L Serbo-Croatian Code element for 639-1 has been deprecated +hbu I L Habu +hca I L Andaman Creole Hindi +hch I L Huichol +hdn I L Northern Haida +hds I L Honduras Sign Language +hdy I L Hadiyya +hea I L Northern Qiandong Miao +heb heb heb he I L Hebrew +hed I L Herdé +heg I L Helong +heh I L Hehe +hei I L Heiltsuk +hem I L Hemba +her her her hz I L Herero +hgm I L Hai//om +hgw I L Haigwai +hhi I L Hoia Hoia +hhr I L Kerak +hhy I L Hoyahoya +hia I L Lamang +hib I E Hibito +hid I L Hidatsa +hif I L Fiji Hindi +hig I L Kamwe +hih I L Pamosu +hii I L Hinduri +hij I L Hijuk +hik I L Seit-Kaitetu +hil hil hil I L Hiligaynon +hin hin hin hi I L Hindi +hio I L Tsoa +hir I L Himarimã +hit hit hit I A Hittite +hiw I L Hiw +hix I L Hixkaryána +hji I L Haji +hka I L Kahe +hke I L Hunde +hkk I L Hunjara-Kaina Ke +hks I L Hong Kong Sign Language +hla I L Halia +hlb I L Halbi +hld I L Halang Doan +hle I L Hlersu +hlt I L Nga La +hlu I A Hieroglyphic Luwian +hma I L Southern Mashan Hmong +hmb I L Humburi Senni Songhay +hmc I L Central Huishui Hmong +hmd I L Large Flowery Miao +hme I L Eastern Huishui Hmong +hmf I L Hmong Don +hmg I L Southwestern Guiyang Hmong +hmh I L Southwestern Huishui Hmong +hmi I L Northern Huishui Hmong +hmj I L Ge +hmk I E Maek +hml I L Luopohe Hmong +hmm I L Central Mashan Hmong +hmn hmn hmn M L Hmong +hmo hmo hmo ho I L Hiri Motu +hmp I L Northern Mashan Hmong +hmq I L Eastern Qiandong Miao +hmr I L Hmar +hms I L Southern Qiandong Miao +hmt I L Hamtai +hmu I L Hamap +hmv I L Hmong Dô +hmw I L Western Mashan Hmong +hmy I L Southern Guiyang Hmong +hmz I L Hmong Shua +hna I L Mina (Cameroon) +hnd I L Southern Hindko +hne I L Chhattisgarhi +hnh I L //Ani +hni I L Hani +hnj I L Hmong Njua +hnn I L Hanunoo +hno I L Northern Hindko +hns I L Caribbean Hindustani +hnu I L Hung +hoa I L Hoava +hob I L Mari (Madang Province) +hoc I L Ho +hod I E Holma +hoe I L Horom +hoh I L Hobyót +hoi I L Holikachuk +hoj I L Hadothi +hol I L Holu +hom I E Homa +hoo I L Holoholo +hop I L Hopi +hor I E Horo +hos I L Ho Chi Minh City Sign Language +hot I L Hote +hov I L Hovongan +how I L Honi +hoy I L Holiya +hoz I L Hozo +hpo I L Hpon +hps I L Hawai'i Pidgin Sign Language +hra I L Hrangkhol +hre I L Hre +hrk I L Haruku +hrm I L Horned Miao +hro I L Haroi +hrr I L Horuru +hrt I L Hértevin +hru I L Hruso +hrv hrv hrv hr I L Croatian +hrx I L Hunsrik +hrz I L Harzani +hsb hsb hsb I L Upper Sorbian +hsh I L Hungarian Sign Language +hsl I L Hausa Sign Language +hsn I L Xiang Chinese +hss I L Harsusi +hti I L Hoti +hto I L Minica Huitoto +hts I L Hadza +htu I L Hitu +htx I A Middle Hittite +hub I L Huambisa +huc I L =/Hua +hud I L Huaulu +hue I L San Francisco Del Mar Huave +huf I L Humene +hug I L Huachipaeri +huh I L Huilliche +hui I L Huli +huj I L Northern Guiyang Hmong +huk I L Hulung +hul I L Hula +hum I L Hungana +hun hun hun hu I L Hungarian +huo I L Hu +hup hup hup I L Hupa +huq I L Tsat +hur I L Halkomelem +hus I L Huastec +hut I L Humla +huu I L Murui Huitoto +huv I L San Mateo Del Mar Huave +huw I E Hukumina +hux I L Nüpode Huitoto +huy I L Hulaulá +huz I L Hunzib +hvc I L Haitian Vodoun Culture Language +hve I L San Dionisio Del Mar Huave +hvk I L Haveke +hvn I L Sabu +hvv I L Santa María Del Mar Huave +hwa I L Wané +hwc I L Hawai'i Creole English +hwo I L Hwana +hya I L Hya +hye arm hye hy I L Armenian +iai I L Iaai +ian I L Iatmul +iap I L Iapama +iar I L Purari +iba iba iba I L Iban +ibb I L Ibibio +ibd I L Iwaidja +ibe I L Akpes +ibg I L Ibanag +ibi I L Ibilo +ibl I L Ibaloi +ibm I L Agoi +ibn I L Ibino +ibo ibo ibo ig I L Igbo +ibr I L Ibuoro +ibu I L Ibu +iby I L Ibani +ica I L Ede Ica +ich I L Etkywan +icl I L Icelandic Sign Language +icr I L Islander Creole English +ida I L Idakho-Isukha-Tiriki +idb I L Indo-Portuguese +idc I L Idon +idd I L Ede Idaca +ide I L Idere +idi I L Idi +ido ido ido io I C Ido +idr I L Indri +ids I L Idesa +idt I L Idaté +idu I L Idoma +ifa I L Amganad Ifugao +ifb I L Batad Ifugao +ife I L Ifè +iff I E Ifo +ifk I L Tuwali Ifugao +ifm I L Teke-Fuumu +ifu I L Mayoyao Ifugao +ify I L Keley-I Kallahan +igb I L Ebira +ige I L Igede +igg I L Igana +igl I L Igala +igm I L Kanggape +ign I L Ignaciano +igo I L Isebe +igs I C Interglossa +igw I L Igwe +ihb I L Iha Based Pidgin +ihi I L Ihievbe +ihp I L Iha +iii iii iii ii I L Sichuan Yi +ijc I L Izon +ije I L Biseni +ijj I L Ede Ije +ijn I L Kalabari +ijs I L Southeast Ijo +ike I L Eastern Canadian Inuktitut +iki I L Iko +ikk I L Ika +ikl I L Ikulu +iko I L Olulumo-Ikom +ikp I L Ikpeshi +ikt I L Western Canadian Inuktitut +iku iku iku iu M L Inuktitut +ikv I L Iku-Gora-Ankwa +ikw I L Ikwere +ikx I L Ik +ikz I L Ikizu +ila I L Ile Ape +ilb I L Ila +ile ile ile ie I C Interlingue +ilg I E Garig-Ilgar +ili I L Ili Turki +ilk I L Ilongot +ill I L Iranun +ilo ilo ilo I L Iloko +ils I L International Sign +ilu I L Ili'uun +ilv I L Ilue +ilw I L Talur +ima I L Mala Malasar +ime I L Imeraguen +imi I L Anamgura +iml I E Miluk +imn I L Imonda +imo I L Imbongu +imr I L Imroing +ims I A Marsian +imy I A Milyan +ina ina ina ia I C Interlingua (International Auxiliary Language Association) +inb I L Inga +ind ind ind id I L Indonesian +ing I L Degexit'an +inh inh inh I L Ingush +inj I L Jungle Inga +inl I L Indonesian Sign Language +inm I A Minaean +inn I L Isinai +ino I L Inoke-Yate +inp I L Iñapari +ins I L Indian Sign Language +int I L Intha +inz I E Ineseño +ior I L Inor +iou I L Tuma-Irumu +iow I E Iowa-Oto +ipi I L Ipili +ipk ipk ipk ik M L Inupiaq +ipo I L Ipiko +iqu I L Iquito +ire I L Iresim +irh I L Irarutu +iri I L Irigwe +irk I L Iraqw +irn I L Irántxe +irr I L Ir +iru I L Irula +irx I L Kamberau +iry I L Iraya +isa I L Isabi +isc I L Isconahua +isd I L Isnag +ise I L Italian Sign Language +isg I L Irish Sign Language +ish I L Esan +isi I L Nkem-Nkum +isk I L Ishkashimi +isl ice isl is I L Icelandic +ism I L Masimasi +isn I L Isanzu +iso I L Isoko +isr I L Israeli Sign Language +ist I L Istriot +isu I L Isu (Menchum Division) +ita ita ita it I L Italian +itb I L Binongan Itneg +ite I E Itene +iti I L Inlaod Itneg +itk I L Judeo-Italian +itl I L Itelmen +itm I L Itu Mbon Uzo +ito I L Itonama +itr I L Iteri +its I L Isekiri +itt I L Maeng Itneg +itv I L Itawit +itw I L Ito +itx I L Itik +ity I L Moyadan Itneg +itz I L Itzá +ium I L Iu Mien +ivb I L Ibatan +ivv I L Ivatan +iwk I L I-Wak +iwm I L Iwam +iwo I L Iwur +iws I L Sepik Iwam +ixc I L Ixcatec +ixl I L Ixil +iya I L Iyayu +iyo I L Mesaka +iyx I L Yaka (Congo) +izh I L Ingrian +izi I L Izi-Ezaa-Ikwo-Mgbo +izr I L Izere +jaa I L Jamamadí +jab I L Hyam +jac I L Popti' +jad I L Jahanka +jae I L Yabem +jaf I L Jara +jah I L Jah Hut +jaj I L Zazao +jak I L Jakun +jal I L Yalahatan +jam I L Jamaican Creole English +jao I L Yanyuwa +jaq I L Yaqay +jar I L Jarawa (Nigeria) +jas I L New Caledonian Javanese +jat I L Jakati +jau I L Yaur +jav jav jav jv I L Javanese +jax I L Jambi Malay +jay I L Yan-nhangu +jaz I L Jawe +jbe I L Judeo-Berber +jbj I L Arandai +jbn I L Nafusi +jbo jbo jbo I C Lojban +jbr I L Jofotek-Bromnya +jbt I L Jabutí +jbu I L Jukun Takum +jcs I L Jamaican Country Sign Language +jct I L Krymchak +jda I L Jad +jdg I L Jadgali +jdt I L Judeo-Tat +jeb I L Jebero +jee I L Jerung +jeg I L Jeng +jeh I L Jeh +jei I L Yei +jek I L Jeri Kuo +jel I L Yelmek +jen I L Dza +jer I L Jere +jet I L Manem +jeu I L Jonkor Bourmataguil +jgb I E Ngbee +jge I L Judeo-Georgian +jgo I L Ngomba +jhi I L Jehai +jhs I L Jhankot Sign Language +jia I L Jina +jib I L Jibu +jic I L Tol +jid I L Bu +jie I L Jilbe +jig I L Djingili +jih I L Shangzhai +jii I L Jiiddu +jil I L Jilim +jim I L Jimi (Cameroon) +jio I L Jiamao +jiq I L Guanyinqiao +jit I L Jita +jiu I L Youle Jinuo +jiv I L Shuar +jiy I L Buyuan Jinuo +jko I L Kubo +jku I L Labir +jle I L Ngile +jls I L Jamaican Sign Language +jma I L Dima +jmb I L Zumbun +jmc I L Machame +jmd I L Yamdena +jmi I L Jimi (Nigeria) +jml I L Jumli +jmn I L Makuri Naga +jmr I L Kamara +jms I L Mashi (Nigeria) +jmx I L Western Juxtlahuaca Mixtec +jna I L Jangshung +jnd I L Jandavra +jng I E Yangman +jni I L Janji +jnj I L Yemsa +jnl I L Rawat +jns I L Jaunsari +job I L Joba +jod I L Wojenaka +jor I E Jorá +jos I L Jordanian Sign Language +jow I L Jowulu +jpa I H Jewish Palestinian Aramaic +jpn jpn jpn ja I L Japanese +jpr jpr jpr I L Judeo-Persian +jqr I L Jaqaru +jra I L Jarai +jrb jrb jrb M L Judeo-Arabic +jrr I L Jiru +jrt I L Jorto +jru I L Japrería +jsl I L Japanese Sign Language +jua I L Júma +jub I L Wannu +juc I E Jurchen +jud I L Worodougou +juh I L Hõne +juk I L Wapan +jul I L Jirel +jum I L Jumjum +jun I L Juang +juo I L Jiba +jup I L Hupdë +jur I L Jurúna +jus I L Jumla Sign Language +jut I L Jutish +juu I L Ju +juw I L Wãpha +juy I L Juray +jvd I E Javindo +jvn I L Caribbean Javanese +jwi I L Jwira-Pepesa +jya I L Jiarong +jye I L Judeo-Yemeni Arabic +jyy I L Jaya +kaa kaa kaa I L Kara-Kalpak +kab kab kab I L Kabyle +kac kac kac I L Kachin +kad I L Kadara +kae I E Ketangalan +kaf I L Katso +kag I L Kajaman +kah I L Kara (Central African Republic) +kai I L Karekare +kaj I L Jju +kak I L Kayapa Kallahan +kal kal kal kl I L Kalaallisut +kam kam kam I L Kamba (Kenya) +kan kan kan kn I L Kannada +kao I L Xaasongaxango +kap I L Bezhta +kaq I L Capanahua +kas kas kas ks I L Kashmiri +kat geo kat ka I L Georgian +kau kau kau kr M L Kanuri +kav I L Katukína +kaw kaw kaw I A Kawi +kax I L Kao +kay I L Kamayurá +kaz kaz kaz kk I L Kazakh +kba I E Kalarko +kbb I E Kaxuiâna +kbc I L Kadiwéu +kbd kbd kbd I L Kabardian +kbe I L Kanju +kbf I E Kakauhua +kbg I L Khamba +kbh I L Camsá +kbi I L Kaptiau +kbj I L Kari +kbk I L Grass Koiari +kbl I L Kanembu +kbm I L Iwal +kbn I L Kare (Central African Republic) +kbo I L Keliko +kbp I L Kabiyè +kbq I L Kamano +kbr I L Kafa +kbs I L Kande +kbt I L Abadi +kbu I L Kabutra +kbv I L Dera (Indonesia) +kbw I L Kaiep +kbx I L Ap Ma +kby I L Manga Kanuri +kbz I L Duhwa +kca I L Khanty +kcb I L Kawacha +kcc I L Lubila +kcd I L Ngkâlmpw Kanum +kce I L Kaivi +kcf I L Ukaan +kcg I L Tyap +kch I L Vono +kci I L Kamantan +kcj I L Kobiana +kck I L Kalanga +kcl I L Kela (Papua New Guinea) +kcm I L Gula (Central African Republic) +kcn I L Nubi +kco I L Kinalakna +kcp I L Kanga +kcq I L Kamo +kcr I L Katla +kcs I L Koenoem +kct I L Kaian +kcu I L Kami (Tanzania) +kcv I L Kete +kcw I L Kabwari +kcx I L Kachama-Ganjule +kcy I L Korandje +kcz I L Konongo +kda I E Worimi +kdc I L Kutu +kdd I L Yankunytjatjara +kde I L Makonde +kdf I L Mamusi +kdg I L Seba +kdh I L Tem +kdi I L Kumam +kdj I L Karamojong +kdk I L Numee +kdl I L Tsikimba +kdm I L Kagoma +kdn I L Kunda +kdp I L Kaningdon-Nindem +kdq I L Koch +kdr I L Karaim +kdt I L Kuy +kdu I L Kadaru +kdv I L Kado +kdw I L Koneraw +kdx I L Kam +kdy I L Keder +kdz I L Kwaja +kea I L Kabuverdianu +keb I L Kélé +kec I L Keiga +ked I L Kerewe +kee I L Eastern Keres +kef I L Kpessi +keg I L Tese +keh I L Keak +kei I L Kei +kej I L Kadar +kek I L Kekchí +kel I L Kela (Democratic Republic of Congo) +kem I L Kemak +ken I L Kenyang +keo I L Kakwa +kep I L Kaikadi +keq I L Kamar +ker I L Kera +kes I L Kugbo +ket I L Ket +keu I L Akebu +kev I L Kanikkaran +kew I L West Kewa +kex I L Kukna +key I L Kupia +kez I L Kukele +kfa I L Kodava +kfb I L Northwestern Kolami +kfc I L Konda-Dora +kfd I L Korra Koraga +kfe I L Kota (India) +kff I L Koya +kfg I L Kudiya +kfh I L Kurichiya +kfi I L Kannada Kurumba +kfj I L Kemiehua +kfk I L Kinnauri +kfl I L Kung +kfm I L Khunsari +kfn I L Kuk +kfo I L Koro (Côte d'Ivoire) +kfp I L Korwa +kfq I L Korku +kfr I L Kachchi +kfs I L Bilaspuri +kft I L Kanjari +kfu I L Katkari +kfv I L Kurmukar +kfw I L Kharam Naga +kfx I L Kullu Pahari +kfy I L Kumaoni +kfz I L Koromfé +kga I L Koyaga +kgb I L Kawe +kgc I L Kasseng +kgd I L Kataang +kge I L Komering +kgf I L Kube +kgg I L Kusunda +kgh I L Upper Tanudan Kalinga +kgi I L Selangor Sign Language +kgj I L Gamale Kham +kgk I L Kaiwá +kgl I E Kunggari +kgm I E Karipúna +kgn I L Karingani +kgo I L Krongo +kgp I L Kaingang +kgq I L Kamoro +kgr I L Abun +kgs I L Kumbainggar +kgt I L Somyev +kgu I L Kobol +kgv I L Karas +kgw I L Karon Dori +kgx I L Kamaru +kgy I L Kyerung +kha kha kha I L Khasi +khb I L Lü +khc I L Tukang Besi North +khd I L Bädi Kanum +khe I L Korowai +khf I L Khuen +khg I L Khams Tibetan +khh I L Kehu +khj I L Kuturmi +khk I L Halh Mongolian +khl I L Lusi +khm khm khm km I L Central Khmer +khn I L Khandesi +kho kho kho I A Khotanese +khp I L Kapori +khq I L Koyra Chiini Songhay +khr I L Kharia +khs I L Kasua +kht I L Khamti +khu I L Nkhumbi +khv I L Khvarshi +khw I L Khowar +khx I L Kanu +khy I L Kele (Democratic Republic of Congo) +khz I L Keapara +kia I L Kim +kib I L Koalib +kic I L Kickapoo +kid I L Koshin +kie I L Kibet +kif I L Eastern Parbate Kham +kig I L Kimaama +kih I L Kilmeri +kii I E Kitsai +kij I L Kilivila +kik kik kik ki I L Kikuyu +kil I L Kariya +kim I L Karagas +kin kin kin rw I L Kinyarwanda +kio I L Kiowa +kip I L Sheshi Kham +kiq I L Kosadle +kir kir kir ky I L Kirghiz +kis I L Kis +kit I L Agob +kiu I L Kirmanjki (individual language) +kiv I L Kimbu +kiw I L Northeast Kiwai +kix I L Khiamniungan Naga +kiy I L Kirikiri +kiz I L Kisi +kja I L Mlap +kjb I L Q'anjob'al +kjc I L Coastal Konjo +kjd I L Southern Kiwai +kje I L Kisar +kjf I L Khalaj +kjg I L Khmu +kjh I L Khakas +kji I L Zabana +kjj I L Khinalugh +kjk I L Highland Konjo +kjl I L Western Parbate Kham +kjm I L Kháng +kjn I L Kunjen +kjo I L Harijan Kinnauri +kjp I L Pwo Eastern Karen +kjq I L Western Keres +kjr I L Kurudu +kjs I L East Kewa +kjt I L Phrae Pwo Karen +kju I L Kashaya +kjx I L Ramopa +kjy I L Erave +kjz I L Bumthangkha +kka I L Kakanda +kkb I L Kwerisa +kkc I L Odoodee +kkd I L Kinuku +kke I L Kakabe +kkf I L Kalaktang Monpa +kkg I L Mabaka Valley Kalinga +kkh I L Khün +kki I L Kagulu +kkj I L Kako +kkk I L Kokota +kkl I L Kosarek Yale +kkm I L Kiong +kkn I L Kon Keu +kko I L Karko +kkp I L Gugubera +kkq I L Kaiku +kkr I L Kir-Balar +kks I L Giiwo +kkt I L Koi +kku I L Tumi +kkv I L Kangean +kkw I L Teke-Kukuya +kkx I L Kohin +kky I L Guguyimidjir +kkz I L Kaska +kla I E Klamath-Modoc +klb I L Kiliwa +klc I L Kolbila +kld I L Gamilaraay +kle I L Kulung (Nepal) +klf I L Kendeje +klg I L Tagakaulo +klh I L Weliki +kli I L Kalumpang +klj I L Turkic Khalaj +klk I L Kono (Nigeria) +kll I L Kagan Kalagan +klm I L Migum +kln M L Kalenjin +klo I L Kapya +klp I L Kamasa +klq I L Rumu +klr I L Khaling +kls I L Kalasha +klt I L Nukna +klu I L Klao +klv I L Maskelynes +klw I L Lindu +klx I L Koluwawa +kly I L Kalao +klz I L Kabola +kma I L Konni +kmb kmb kmb I L Kimbundu +kmc I L Southern Dong +kmd I L Majukayang Kalinga +kme I L Bakole +kmf I L Kare (Papua New Guinea) +kmg I L Kâte +kmh I L Kalam +kmi I L Kami (Nigeria) +kmj I L Kumarbhag Paharia +kmk I L Limos Kalinga +kml I L Lower Tanudan Kalinga +kmm I L Kom (India) +kmn I L Awtuw +kmo I L Kwoma +kmp I L Gimme +kmq I L Kwama +kmr I L Northern Kurdish +kms I L Kamasau +kmt I L Kemtuik +kmu I L Kanite +kmv I L Karipúna Creole French +kmw I L Komo (Democratic Republic of Congo) +kmx I L Waboda +kmy I L Koma +kmz I L Khorasani Turkish +kna I L Dera (Nigeria) +knb I L Lubuagan Kalinga +knc I L Central Kanuri +knd I L Konda +kne I L Kankanaey +knf I L Mankanya +kng I L Koongo +kni I L Kanufi +knj I L Western Kanjobal +knk I L Kuranko +knl I L Keninjal +knm I L Kanamarí +knn I L Konkani (individual language) +kno I L Kono (Sierra Leone) +knp I L Kwanja +knq I L Kintaq +knr I L Kaningra +kns I L Kensiu +knt I L Panoan Katukína +knu I L Kono (Guinea) +knv I L Tabo +knw I L Kung-Ekoka +knx I L Kendayan +kny I L Kanyok +knz I L Kalamsé +koa I L Konomala +koc I E Kpati +kod I L Kodi +koe I L Kacipo-Balesi +kof I E Kubi +kog I L Cogui +koh I L Koyo +koi I L Komi-Permyak +koj I L Sara Dunjo +kok kok kok M L Konkani (macrolanguage) +kol I L Kol (Papua New Guinea) +kom kom kom kv M L Komi +kon kon kon kg M L Kongo +koo I L Konzo +kop I L Kwato +koq I L Kota (Gabon) +kor kor kor ko I L Korean +kos kos kos I L Kosraean +kot I L Lagwan +kou I L Koke +kov I L Kudu-Camo +kow I L Kugama +kox I E Coxima +koy I L Koyukon +koz I L Korak +kpa I L Kutto +kpb I L Mullu Kurumba +kpc I L Curripaco +kpd I L Koba +kpe kpe kpe M L Kpelle +kpf I L Komba +kpg I L Kapingamarangi +kph I L Kplang +kpi I L Kofei +kpj I L Karajá +kpk I L Kpan +kpl I L Kpala +kpm I L Koho +kpn I E Kepkiriwát +kpo I L Ikposo +kpp I L Paku Karen +kpq I L Korupun-Sela +kpr I L Korafe-Yegha +kps I L Tehit +kpt I L Karata +kpu I L Kafoa +kpv I L Komi-Zyrian +kpw I L Kobon +kpx I L Mountain Koiali +kpy I L Koryak +kpz I L Kupsabiny +kqa I L Mum +kqb I L Kovai +kqc I L Doromu-Koki +kqd I L Koy Sanjaq Surat +kqe I L Kalagan +kqf I L Kakabai +kqg I L Khe +kqh I L Kisankasa +kqi I L Koitabu +kqj I L Koromira +kqk I L Kotafon Gbe +kql I L Kyenele +kqm I L Khisa +kqn I L Kaonde +kqo I L Eastern Krahn +kqp I L Kimré +kqq I L Krenak +kqr I L Kimaragang +kqs I L Northern Kissi +kqt I L Klias River Kadazan +kqu I E Seroa +kqv I L Okolod +kqw I L Kandas +kqx I L Mser +kqy I L Koorete +kqz I E Korana +kra I L Kumhali +krb I E Karkin +krc krc krc I L Karachay-Balkar +krd I L Kairui-Midiki +kre I L Panará +krf I L Koro (Vanuatu) +krh I L Kurama +kri I L Krio +krj I L Kinaray-A +krk I E Kerek +krl krl krl I L Karelian +krm I L Krim +krn I L Sapo +krp I L Korop +krr I L Kru'ng 2 +krs I L Gbaya (Sudan) +krt I L Tumari Kanuri +kru kru kru I L Kurukh +krv I L Kavet +krw I L Western Krahn +krx I L Karon +kry I L Kryts +krz I L Sota Kanum +ksa I L Shuwa-Zamani +ksb I L Shambala +ksc I L Southern Kalinga +ksd I L Kuanua +kse I L Kuni +ksf I L Bafia +ksg I L Kusaghe +ksh I L Kölsch +ksi I L Krisa +ksj I L Uare +ksk I L Kansa +ksl I L Kumalu +ksm I L Kumba +ksn I L Kasiguranin +kso I L Kofa +ksp I L Kaba +ksq I L Kwaami +ksr I L Borong +kss I L Southern Kisi +kst I L Winyé +ksu I L Khamyang +ksv I L Kusu +ksw I L S'gaw Karen +ksx I L Kedang +ksy I L Kharia Thar +ksz I L Kodaku +kta I L Katua +ktb I L Kambaata +ktc I L Kholok +ktd I L Kokata +kte I L Nubri +ktf I L Kwami +ktg I E Kalkutung +kth I L Karanga +kti I L North Muyu +ktj I L Plapo Krumen +ktk I E Kaniet +ktl I L Koroshi +ktm I L Kurti +ktn I L Karitiâna +kto I L Kuot +ktp I L Kaduo +ktq I E Katabaga +ktr I L Kota Marudu Tinagas +kts I L South Muyu +ktt I L Ketum +ktu I L Kituba (Democratic Republic of Congo) +ktv I L Eastern Katu +ktw I E Kato +ktx I L Kaxararí +kty I L Kango (Bas-Uélé District) +ktz I L Ju/'hoan +kua kua kua kj I L Kuanyama +kub I L Kutep +kuc I L Kwinsu +kud I L 'Auhelawa +kue I L Kuman +kuf I L Western Katu +kug I L Kupa +kuh I L Kushi +kui I L Kuikúro-Kalapálo +kuj I L Kuria +kuk I L Kepo' +kul I L Kulere +kum kum kum I L Kumyk +kun I L Kunama +kuo I L Kumukio +kup I L Kunimaipa +kuq I L Karipuna +kur kur kur ku M L Kurdish +kus I L Kusaal +kut kut kut I L Kutenai +kuu I L Upper Kuskokwim +kuv I L Kur +kuw I L Kpagua +kux I L Kukatja +kuy I L Kuuku-Ya'u +kuz I E Kunza +kva I L Bagvalal +kvb I L Kubu +kvc I L Kove +kvd I L Kui (Indonesia) +kve I L Kalabakan +kvf I L Kabalai +kvg I L Kuni-Boazi +kvh I L Komodo +kvi I L Kwang +kvj I L Psikye +kvk I L Korean Sign Language +kvl I L Brek Karen +kvm I L Kendem +kvn I L Border Kuna +kvo I L Dobel +kvp I L Kompane +kvq I L Geba Karen +kvr I L Kerinci +kvs I L Kunggara +kvt I L Lahta Karen +kvu I L Yinbaw Karen +kvv I L Kola +kvw I L Wersing +kvx I L Parkari Koli +kvy I L Yintale Karen +kvz I L Tsakwambo +kwa I L Dâw +kwb I L Kwa +kwc I L Likwala +kwd I L Kwaio +kwe I L Kwerba +kwf I L Kwara'ae +kwg I L Sara Kaba Deme +kwh I L Kowiai +kwi I L Awa-Cuaiquer +kwj I L Kwanga +kwk I L Kwakiutl +kwl I L Kofyar +kwm I L Kwambi +kwn I L Kwangali +kwo I L Kwomtari +kwp I L Kodia +kwq I L Kwak +kwr I L Kwer +kws I L Kwese +kwt I L Kwesten +kwu I L Kwakum +kwv I L Sara Kaba Náà +kww I L Kwinti +kwx I L Khirwar +kwy I L San Salvador Kongo +kwz I E Kwadi +kxa I L Kairiru +kxb I L Krobu +kxc I L Konso +kxd I L Brunei +kxe I L Kakihum +kxf I L Manumanaw Karen +kxh I L Karo (Ethiopia) +kxi I L Keningau Murut +kxj I L Kulfa +kxk I L Zayein Karen +kxl I L Nepali Kurux +kxm I L Northern Khmer +kxn I L Kanowit-Tanjong Melanau +kxo I E Kanoé +kxp I L Wadiyara Koli +kxq I L Smärky Kanum +kxr I L Koro (Papua New Guinea) +kxs I L Kangjia +kxt I L Koiwat +kxu I L Kui (India) +kxv I L Kuvi +kxw I L Konai +kxx I L Likuba +kxy I L Kayong +kxz I L Kerewo +kya I L Kwaya +kyb I L Butbut Kalinga +kyc I L Kyaka +kyd I L Karey +kye I L Krache +kyf I L Kouya +kyg I L Keyagana +kyh I L Karok +kyi I L Kiput +kyj I L Karao +kyk I L Kamayo +kyl I L Kalapuya +kym I L Kpatili +kyn I L Northern Binukidnon +kyo I L Kelon +kyp I L Kang +kyq I L Kenga +kyr I L Kuruáya +kys I L Baram Kayan +kyt I L Kayagar +kyu I L Western Kayah +kyv I L Kayort +kyw I L Kudmali +kyx I L Rapoisi +kyy I L Kambaira +kyz I L Kayabí +kza I L Western Karaboro +kzb I L Kaibobo +kzc I L Bondoukou Kulango +kzd I L Kadai +kze I L Kosena +kzf I L Da'a Kaili +kzg I L Kikai +kzh I L Kenuzi-Dongola +kzi I L Kelabit +kzj I L Coastal Kadazan +kzk I E Kazukuru +kzl I L Kayeli +kzm I L Kais +kzn I L Kokola +kzo I L Kaningi +kzp I L Kaidipang +kzq I L Kaike +kzr I L Karang +kzs I L Sugut Dusun +kzt I L Tambunan Dusun +kzu I L Kayupulau +kzv I L Komyandaret +kzw I E Karirí-Xocó +kzx I L Kamarian +kzy I L Kango (Tshopo District) +kzz I L Kalabra +laa I L Southern Subanen +lab I A Linear A +lac I L Lacandon +lad lad lad I L Ladino +lae I L Pattani +laf I L Lafofa +lag I L Langi +lah lah lah M L Lahnda +lai I L Lambya +laj I L Lango (Uganda) +lak I L Laka (Nigeria) +lal I L Lalia +lam lam lam I L Lamba +lan I L Laru +lao lao lao lo I L Lao +lap I L Laka (Chad) +laq I L Qabiao +lar I L Larteh +las I L Lama (Togo) +lat lat lat la I A Latin +lau I L Laba +lav lav lav lv M L Latvian +law I L Lauje +lax I L Tiwa +lay I L Lama (Myanmar) +laz I E Aribwatsa +lba I L Lui +lbb I L Label +lbc I L Lakkia +lbe I L Lak +lbf I L Tinani +lbg I L Laopang +lbi I L La'bi +lbj I L Ladakhi +lbk I L Central Bontok +lbl I L Libon Bikol +lbm I L Lodhi +lbn I L Lamet +lbo I L Laven +lbq I L Wampar +lbr I L Northern Lorung +lbs I L Libyan Sign Language +lbt I L Lachi +lbu I L Labu +lbv I L Lavatbura-Lamusong +lbw I L Tolaki +lbx I L Lawangan +lby I E Lamu-Lamu +lbz I L Lardil +lcc I L Legenyem +lcd I L Lola +lce I L Loncong +lcf I L Lubu +lch I L Luchazi +lcl I L Lisela +lcm I L Tungag +lcp I L Western Lawa +lcq I L Luhu +lcs I L Lisabata-Nuniali +ldb I L Idun +ldd I L Luri +ldg I L Lenyima +ldh I L Lamja-Dengsa-Tola +ldi I L Laari +ldj I L Lemoro +ldk I L Leelau +ldl I L Kaan +ldm I L Landoma +ldn I C Láadan +ldo I L Loo +ldp I L Tso +ldq I L Lufu +lea I L Lega-Shabunda +leb I L Lala-Bisa +lec I L Leco +led I L Lendu +lee I L Lyélé +lef I L Lelemi +leg I L Lengua +leh I L Lenje +lei I L Lemio +lej I L Lengola +lek I L Leipon +lel I L Lele (Democratic Republic of Congo) +lem I L Nomaande +len I E Lenca +leo I L Leti (Cameroon) +lep I L Lepcha +leq I L Lembena +ler I L Lenkau +les I L Lese +let I L Lesing-Gelimi +leu I L Kara (Papua New Guinea) +lev I L Lamma +lew I L Ledo Kaili +lex I L Luang +ley I L Lemolang +lez lez lez I L Lezghian +lfa I L Lefa +lfn I C Lingua Franca Nova +lga I L Lungga +lgb I L Laghu +lgg I L Lugbara +lgh I L Laghuu +lgi I L Lengilu +lgk I L Lingarak +lgl I L Wala +lgm I L Lega-Mwenga +lgn I L Opuuo +lgq I L Logba +lgr I L Lengo +lgt I L Pahi +lgu I L Longgu +lgz I L Ligenza +lha I L Laha (Viet Nam) +lhh I L Laha (Indonesia) +lhi I L Lahu Shi +lhl I L Lahul Lohar +lhm I L Lhomi +lhn I L Lahanan +lhp I L Lhokpu +lhs I E Mlahsö +lht I L Lo-Toga +lhu I L Lahu +lia I L West-Central Limba +lib I L Likum +lic I L Hlai +lid I L Nyindrou +lie I L Likila +lif I L Limbu +lig I L Ligbi +lih I L Lihir +lii I L Lingkhim +lij I L Ligurian +lik I L Lika +lil I L Lillooet +lim lim lim li I L Limburgan +lin lin lin ln I L Lingala +lio I L Liki +lip I L Sekpele +liq I L Libido +lir I L Liberian English +lis I L Lisu +lit lit lit lt I L Lithuanian +liu I L Logorik +liv I L Liv +liw I L Col +lix I L Liabuku +liy I L Banda-Bambari +liz I L Libinza +lje I L Rampi +lji I L Laiyolo +ljl I L Li'o +ljp I L Lampung Api +lka I L Lakalei +lkb I L Kabras +lkc I L Kucong +lkd I L Lakondê +lke I L Kenyi +lkh I L Lakha +lki I L Laki +lkj I L Remun +lkl I L Laeko-Libuat +lkn I L Lakon +lko I L Khayo +lkr I L Päri +lks I L Kisa +lkt I L Lakota +lky I L Lokoya +lla I L Lala-Roba +llb I L Lolo +llc I L Lele (Guinea) +lld I L Ladin +lle I L Lele (Papua New Guinea) +llf I E Hermit +llg I L Lole +llh I L Lamu +lli I L Teke-Laali +llk I E Lelak +lll I L Lilau +llm I L Lasalimu +lln I L Lele (Chad) +llo I L Khlor +llp I L North Efate +llq I L Lolak +lls I L Lithuanian Sign Language +llu I L Lau +llx I L Lauan +lma I L East Limba +lmb I L Merei +lmc I E Limilngan +lmd I L Lumun +lme I L Pévé +lmf I L South Lembata +lmg I L Lamogai +lmh I L Lambichhong +lmi I L Lombi +lmj I L West Lembata +lmk I L Lamkang +lml I L Hano +lmm I L Lamam +lmn I L Lambadi +lmo I L Lombard +lmp I L Limbum +lmq I L Lamatuka +lmr I L Lamalera +lmu I L Lamenu +lmv I L Lomaiviti +lmw I L Lake Miwok +lmx I L Laimbue +lmy I L Lamboya +lmz I E Lumbee +lna I L Langbashe +lnb I L Mbalanhu +lnd I L Lundayeh +lng I A Langobardic +lnh I L Lanoh +lni I L Daantanai' +lnj I E Leningitij +lnl I L South Central Banda +lnm I L Langam +lnn I L Lorediakarkar +lno I L Lango (Sudan) +lns I L Lamnso' +lnu I L Longuda +lnz I L Lonzo +loa I L Loloda +lob I L Lobi +loc I L Inonhan +loe I L Saluan +lof I L Logol +log I L Logo +loh I L Narim +loi I L Loma (Côte d'Ivoire) +loj I L Lou +lok I L Loko +lol lol lol I L Mongo +lom I L Loma (Liberia) +lon I L Malawi Lomwe +loo I L Lombo +lop I L Lopa +loq I L Lobala +lor I L Téén +los I L Loniu +lot I L Otuho +lou I L Louisiana Creole French +lov I L Lopi +low I L Tampias Lobu +lox I L Loun +loy I L Lowa +loz loz loz I L Lozi +lpa I L Lelepa +lpe I L Lepki +lpn I L Long Phuri Naga +lpo I L Lipo +lpx I L Lopit +lra I L Rara Bakati' +lrc I L Northern Luri +lre I E Laurentian +lrg I E Laragia +lri I L Marachi +lrk I L Loarki +lrl I L Lari +lrm I L Marama +lrn I L Lorang +lro I L Laro +lrr I L Southern Lorung +lrt I L Larantuka Malay +lrv I L Larevat +lrz I L Lemerig +lsa I L Lasgerdi +lsd I L Lishana Deni +lse I L Lusengo +lsg I L Lyons Sign Language +lsh I L Lish +lsi I L Lashi +lsl I L Latvian Sign Language +lsm I L Saamia +lso I L Laos Sign Language +lsp I L Panamanian Sign Language +lsr I L Aruop +lss I L Lasi +lst I L Trinidad and Tobago Sign Language +lsy I L Mauritian Sign Language +ltc I H Late Middle Chinese +ltg I L Latgalian +lti I L Leti (Indonesia) +ltn I L Latundê +lto I L Tsotso +lts I L Tachoni +ltu I L Latu +ltz ltz ltz lb I L Luxembourgish +lua lua lua I L Luba-Lulua +lub lub lub lu I L Luba-Katanga +luc I L Aringa +lud I L Ludian +lue I L Luvale +luf I L Laua +lug lug lug lg I L Ganda +lui lui lui I L Luiseno +luj I L Luna +luk I L Lunanakha +lul I L Olu'bo +lum I L Luimbi +lun lun lun I L Lunda +luo luo luo I L Luo (Kenya and Tanzania) +lup I L Lumbu +luq I L Lucumi +lur I L Laura +lus lus lus I L Lushai +lut I L Lushootseed +luu I L Lumba-Yakkha +luv I L Luwati +luw I L Luo (Cameroon) +luy M L Luyia +luz I L Southern Luri +lva I L Maku'a +lvk I L Lavukaleve +lvs I L Standard Latvian +lvu I L Levuka +lwa I L Lwalu +lwe I L Lewo Eleng +lwg I L Wanga +lwh I L White Lachi +lwl I L Eastern Lawa +lwm I L Laomian +lwo I L Luwo +lwt I L Lewotobi +lww I L Lewo +lya I L Layakha +lyg I L Lyngngam +lyn I L Luyana +lzh I H Literary Chinese +lzl I L Litzlitz +lzn I L Leinong Naga +lzz I L Laz +maa I L San Jerónimo Tecóatl Mazatec +mab I L Yutanduchi Mixtec +mad mad mad I L Madurese +mae I L Bo-Rukul +maf I L Mafa +mag mag mag I L Magahi +mah mah mah mh I L Marshallese +mai mai mai I L Maithili +maj I L Jalapa De Díaz Mazatec +mak mak mak I L Makasar +mal mal mal ml I L Malayalam +mam I L Mam +man man man M L Mandingo +maq I L Chiquihuitlán Mazatec +mar mar mar mr I L Marathi +mas mas mas I L Masai +mat I L San Francisco Matlatzinca +mau I L Huautla Mazatec +mav I L Sateré-Mawé +maw I L Mampruli +max I L North Moluccan Malay +maz I L Central Mazahua +mba I L Higaonon +mbb I L Western Bukidnon Manobo +mbc I L Macushi +mbd I L Dibabawon Manobo +mbe I E Molale +mbf I L Baba Malay +mbh I L Mangseng +mbi I L Ilianen Manobo +mbj I L Nadëb +mbk I L Malol +mbl I L Maxakalí +mbm I L Ombamba +mbn I L Macaguán +mbo I L Mbo (Cameroon) +mbp I L Malayo +mbq I L Maisin +mbr I L Nukak Makú +mbs I L Sarangani Manobo +mbt I L Matigsalug Manobo +mbu I L Mbula-Bwazza +mbv I L Mbulungish +mbw I L Maring +mbx I L Mari (East Sepik Province) +mby I L Memoni +mbz I L Amoltepec Mixtec +mca I L Maca +mcb I L Machiguenga +mcc I L Bitur +mcd I L Sharanahua +mce I L Itundujia Mixtec +mcf I L Matsés +mcg I L Mapoyo +mch I L Maquiritari +mci I L Mese +mcj I L Mvanip +mck I L Mbunda +mcl I E Macaguaje +mcm I L Malaccan Creole Portuguese +mcn I L Masana +mco I L Coatlán Mixe +mcp I L Makaa +mcq I L Ese +mcr I L Menya +mcs I L Mambai +mct I L Mengisa +mcu I L Cameroon Mambila +mcv I L Minanibai +mcw I L Mawa (Chad) +mcx I L Mpiemo +mcy I L South Watut +mcz I L Mawan +mda I L Mada (Nigeria) +mdb I L Morigi +mdc I L Male (Papua New Guinea) +mdd I L Mbum +mde I L Maba (Chad) +mdf mdf mdf I L Moksha +mdg I L Massalat +mdh I L Maguindanaon +mdi I L Mamvu +mdj I L Mangbetu +mdk I L Mangbutu +mdl I L Maltese Sign Language +mdm I L Mayogo +mdn I L Mbati +mdp I L Mbala +mdq I L Mbole +mdr mdr mdr I L Mandar +mds I L Maria (Papua New Guinea) +mdt I L Mbere +mdu I L Mboko +mdv I L Santa Lucía Monteverde Mixtec +mdw I L Mbosi +mdx I L Dizin +mdy I L Male (Ethiopia) +mdz I L Suruí Do Pará +mea I L Menka +meb I L Ikobi-Mena +mec I L Mara +med I L Melpa +mee I L Mengen +mef I L Megam +meg I L Mea +meh I L Southwestern Tlaxiaco Mixtec +mei I L Midob +mej I L Meyah +mek I L Mekeo +mel I L Central Melanau +mem I E Mangala +men men men I L Mende (Sierra Leone) +meo I L Kedah Malay +mep I L Miriwung +meq I L Merey +mer I L Meru +mes I L Masmaje +met I L Mato +meu I L Motu +mev I L Mann +mew I L Maaka +mey I L Hassaniyya +mez I L Menominee +mfa I L Pattani Malay +mfb I L Bangka +mfc I L Mba +mfd I L Mendankwe-Nkwen +mfe I L Morisyen +mff I L Naki +mfg I L Mixifore +mfh I L Matal +mfi I L Wandala +mfj I L Mefele +mfk I L North Mofu +mfl I L Putai +mfm I L Marghi South +mfn I L Cross River Mbembe +mfo I L Mbe +mfp I L Makassar Malay +mfq I L Moba +mfr I L Marithiel +mfs I L Mexican Sign Language +mft I L Mokerang +mfu I L Mbwela +mfv I L Mandjak +mfw I E Mulaha +mfx I L Melo +mfy I L Mayo +mfz I L Mabaan +mga mga mga I H Middle Irish (900-1200) +mgb I L Mararit +mgc I L Morokodo +mgd I L Moru +mge I L Mango +mgf I L Maklew +mgg I L Mpongmpong +mgh I L Makhuwa-Meetto +mgi I L Lijili +mgj I L Abureni +mgk I L Mawes +mgl I L Maleu-Kilenge +mgm I L Mambae +mgn I L Mbangi +mgo I L Meta' +mgp I L Eastern Magar +mgq I L Malila +mgr I L Mambwe-Lungu +mgs I L Manda (Tanzania) +mgt I L Mongol +mgu I L Mailu +mgv I L Matengo +mgw I L Matumbi +mgx I L Omati +mgy I L Mbunga +mgz I L Mbugwe +mha I L Manda (India) +mhb I L Mahongwe +mhc I L Mocho +mhd I L Mbugu +mhe I L Besisi +mhf I L Mamaa +mhg I L Margu +mhh I L Maskoy Pidgin +mhi I L Ma'di +mhj I L Mogholi +mhk I L Mungaka +mhl I L Mauwake +mhm I L Makhuwa-Moniga +mhn I L Mócheno +mho I L Mashi (Zambia) +mhp I L Balinese Malay +mhq I L Mandan +mhr I L Eastern Mari +mhs I L Buru (Indonesia) +mht I L Mandahuaca +mhu I L Digaro-Mishmi +mhw I L Mbukushu +mhx I L Maru +mhy I L Ma'anyan +mhz I L Mor (Mor Islands) +mia I L Miami +mib I L Atatláhuca Mixtec +mic mic mic I L Mi'kmaq +mid I L Mandaic +mie I L Ocotepec Mixtec +mif I L Mofu-Gudur +mig I L San Miguel El Grande Mixtec +mih I L Chayuco Mixtec +mii I L Chigmecatitlán Mixtec +mij I L Abar +mik I L Mikasuki +mil I L Peñoles Mixtec +mim I L Alacatlatzala Mixtec +min min min I L Minangkabau +mio I L Pinotepa Nacional Mixtec +mip I L Apasco-Apoala Mixtec +miq I L Mískito +mir I L Isthmus Mixe +mis mis mis S S Uncoded languages +mit I L Southern Puebla Mixtec +miu I L Cacaloxtepec Mixtec +miw I L Akoye +mix I L Mixtepec Mixtec +miy I L Ayutla Mixtec +miz I L Coatzospan Mixtec +mja I L Mahei +mjc I L San Juan Colorado Mixtec +mjd I L Northwest Maidu +mje I E Muskum +mjg I L Tu +mjh I L Mwera (Nyasa) +mji I L Kim Mun +mjj I L Mawak +mjk I L Matukar +mjl I L Mandeali +mjm I L Medebur +mjn I L Ma (Papua New Guinea) +mjo I L Malankuravan +mjp I L Malapandaram +mjq I E Malaryan +mjr I L Malavedan +mjs I L Miship +mjt I L Sauria Paharia +mju I L Manna-Dora +mjv I L Mannan +mjw I L Karbi +mjx I L Mahali +mjy I E Mahican +mjz I L Majhi +mka I L Mbre +mkb I L Mal Paharia +mkc I L Siliput +mkd mac mkd mk I L Macedonian +mke I L Mawchi +mkf I L Miya +mkg I L Mak (China) +mki I L Dhatki +mkj I L Mokilese +mkk I L Byep +mkl I L Mokole +mkm I L Moklen +mkn I L Kupang Malay +mko I L Mingang Doso +mkp I L Moikodi +mkq I E Bay Miwok +mkr I L Malas +mks I L Silacayoapan Mixtec +mkt I L Vamale +mku I L Konyanka Maninka +mkv I L Mafea +mkw I L Kituba (Congo) +mkx I L Kinamiging Manobo +mky I L East Makian +mkz I L Makasae +mla I L Malo +mlb I L Mbule +mlc I L Cao Lan +mld I L Malakhel +mle I L Manambu +mlf I L Mal +mlg mlg mlg mg M L Malagasy +mlh I L Mape +mli I L Malimpung +mlj I L Miltu +mlk I L Ilwana +mll I L Malua Bay +mlm I L Mulam +mln I L Malango +mlo I L Mlomp +mlp I L Bargam +mlq I L Western Maninkakan +mlr I L Vame +mls I L Masalit +mlt mlt mlt mt I L Maltese +mlu I L To'abaita +mlv I L Motlav +mlw I L Moloko +mlx I L Malfaxal +mlz I L Malaynon +mma I L Mama +mmb I L Momina +mmc I L Michoacán Mazahua +mmd I L Maonan +mme I L Mae +mmf I L Mundat +mmg I L North Ambrym +mmh I L Mehináku +mmi I L Musar +mmj I L Majhwar +mmk I L Mukha-Dora +mml I L Man Met +mmm I L Maii +mmn I L Mamanwa +mmo I L Mangga Buang +mmp I L Siawi +mmq I L Musak +mmr I L Western Xiangxi Miao +mmt I L Malalamai +mmu I L Mmaala +mmv I E Miriti +mmw I L Emae +mmx I L Madak +mmy I L Migaama +mmz I L Mabaale +mna I L Mbula +mnb I L Muna +mnc mnc mnc I L Manchu +mnd I L Mondé +mne I L Naba +mnf I L Mundani +mng I L Eastern Mnong +mnh I L Mono (Democratic Republic of Congo) +mni mni mni I L Manipuri +mnj I L Munji +mnk I L Mandinka +mnl I L Tiale +mnm I L Mapena +mnn I L Southern Mnong +mnp I L Min Bei Chinese +mnq I L Minriq +mnr I L Mono (USA) +mns I L Mansi +mnt I E Maykulan +mnu I L Mer +mnv I L Rennell-Bellona +mnw I L Mon +mnx I L Manikion +mny I L Manyawa +mnz I L Moni +moa I L Mwan +moc I L Mocoví +mod I E Mobilian +moe I L Montagnais +mog I L Mongondow +moh moh moh I L Mohawk +moi I L Mboi +moj I L Monzombo +mok I L Morori +mom I E Mangue +mon mon mon mn M L Mongolian +moo I L Monom +mop I L Mopán Maya +moq I L Mor (Bomberai Peninsula) +mor I L Moro +mos mos mos I L Mossi +mot I L Barí +mou I L Mogum +mov I L Mohave +mow I L Moi (Congo) +mox I L Molima +moy I L Shekkacho +moz I L Mukulu +mpa I L Mpoto +mpb I L Mullukmulluk +mpc I L Mangarayi +mpd I L Machinere +mpe I L Majang +mpg I L Marba +mph I L Maung +mpi I L Mpade +mpj I L Martu Wangka +mpk I L Mbara (Chad) +mpl I L Middle Watut +mpm I L Yosondúa Mixtec +mpn I L Mindiri +mpo I L Miu +mpp I L Migabac +mpq I L Matís +mpr I L Vangunu +mps I L Dadibi +mpt I L Mian +mpu I L Makuráp +mpv I L Mungkip +mpw I L Mapidian +mpx I L Misima-Paneati +mpy I L Mapia +mpz I L Mpi +mqa I L Maba (Indonesia) +mqb I L Mbuko +mqc I L Mangole +mqe I L Matepi +mqf I L Momuna +mqg I L Kota Bangun Kutai Malay +mqh I L Tlazoyaltepec Mixtec +mqi I L Mariri +mqj I L Mamasa +mqk I L Rajah Kabunsuwan Manobo +mql I L Mbelime +mqm I L South Marquesan +mqn I L Moronene +mqo I L Modole +mqp I L Manipa +mqq I L Minokok +mqr I L Mander +mqs I L West Makian +mqt I L Mok +mqu I L Mandari +mqv I L Mosimo +mqw I L Murupi +mqx I L Mamuju +mqy I L Manggarai +mqz I L Malasanga +mra I L Mlabri +mrb I L Marino +mrc I L Maricopa +mrd I L Western Magar +mre I E Martha's Vineyard Sign Language +mrf I L Elseng +mrg I L Miri +mrh I L Mara Chin +mri mao mri mi I L Maori +mrj I L Western Mari +mrk I L Hmwaveke +mrl I L Mortlockese +mrm I L Merlav +mrn I L Cheke Holo +mro I L Mru +mrp I L Morouas +mrq I L North Marquesan +mrr I L Maria (India) +mrs I L Maragus +mrt I L Marghi Central +mru I L Mono (Cameroon) +mrv I L Mangareva +mrw I L Maranao +mrx I L Maremgi +mry I L Mandaya +mrz I L Marind +msa may msa ms M L Malay (macrolanguage) +msb I L Masbatenyo +msc I L Sankaran Maninka +msd I L Yucatec Maya Sign Language +mse I L Musey +msf I L Mekwei +msg I L Moraid +msh I L Masikoro Malagasy +msi I L Sabah Malay +msj I L Ma (Democratic Republic of Congo) +msk I L Mansaka +msl I L Molof +msm I L Agusan Manobo +msn I L Vurës +mso I L Mombum +msp I E Maritsauá +msq I L Caac +msr I L Mongolian Sign Language +mss I L West Masela +msu I L Musom +msv I L Maslam +msw I L Mansoanka +msx I L Moresada +msy I L Aruamu +msz I L Momare +mta I L Cotabato Manobo +mtb I L Anyin Morofo +mtc I L Munit +mtd I L Mualang +mte I L Mono (Solomon Islands) +mtf I L Murik (Papua New Guinea) +mtg I L Una +mth I L Munggui +mti I L Maiwa (Papua New Guinea) +mtj I L Moskona +mtk I L Mbe' +mtl I L Montol +mtm I E Mator +mtn I E Matagalpa +mto I L Totontepec Mixe +mtp I L Wichí Lhamtés Nocten +mtq I L Muong +mtr I L Mewari +mts I L Yora +mtt I L Mota +mtu I L Tututepec Mixtec +mtv I L Asaro'o +mtw I L Southern Binukidnon +mtx I L Tidaá Mixtec +mty I L Nabi +mua I L Mundang +mub I L Mubi +muc I L Mbu' +mud I L Mednyj Aleut +mue I L Media Lengua +mug I L Musgu +muh I L Mündü +mui I L Musi +muj I L Mabire +muk I L Mugom +mul mul mul S S Multiple languages +mum I L Maiwala +muo I L Nyong +mup I L Malvi +muq I L Eastern Xiangxi Miao +mur I L Murle +mus mus mus I L Creek +mut I L Western Muria +muu I L Yaaku +muv I L Muthuvan +mux I L Bo-Ung +muy I L Muyang +muz I L Mursi +mva I L Manam +mvb I E Mattole +mvd I L Mamboru +mve I L Marwari (Pakistan) +mvf I L Peripheral Mongolian +mvg I L Yucuañe Mixtec +mvh I L Mire +mvi I L Miyako +mvk I L Mekmek +mvl I E Mbara (Australia) +mvm I L Muya +mvn I L Minaveha +mvo I L Marovo +mvp I L Duri +mvq I L Moere +mvr I L Marau +mvs I L Massep +mvt I L Mpotovoro +mvu I L Marfa +mvv I L Tagal Murut +mvw I L Machinga +mvx I L Meoswar +mvy I L Indus Kohistani +mvz I L Mesqan +mwa I L Mwatebu +mwb I L Juwal +mwc I L Are +mwd I L Mudbura +mwe I L Mwera (Chimwera) +mwf I L Murrinh-Patha +mwg I L Aiklep +mwh I L Mouk-Aria +mwi I L Labo +mwj I L Maligo +mwk I L Kita Maninkakan +mwl mwl mwl I L Mirandese +mwm I L Sar +mwn I L Nyamwanga +mwo I L Central Maewo +mwp I L Kala Lagaw Ya +mwq I L Mün Chin +mwr mwr mwr M L Marwari +mws I L Mwimbi-Muthambi +mwt I L Moken +mwu I E Mittu +mwv I L Mentawai +mww I L Hmong Daw +mwx I L Mediak +mwy I L Mosiro +mwz I L Moingi +mxa I L Northwest Oaxaca Mixtec +mxb I L Tezoatlán Mixtec +mxc I L Manyika +mxd I L Modang +mxe I L Mele-Fila +mxf I L Malgbe +mxg I L Mbangala +mxh I L Mvuba +mxi I E Mozarabic +mxj I L Miju-Mishmi +mxk I L Monumbo +mxl I L Maxi Gbe +mxm I L Meramera +mxn I L Moi (Indonesia) +mxo I L Mbowe +mxp I L Tlahuitoltepec Mixe +mxq I L Juquila Mixe +mxr I L Murik (Malaysia) +mxs I L Huitepec Mixtec +mxt I L Jamiltepec Mixtec +mxu I L Mada (Cameroon) +mxv I L Metlatónoc Mixtec +mxw I L Namo +mxx I L Mahou +mxy I L Southeastern Nochixtlán Mixtec +mxz I L Central Masela +mya bur mya my I L Burmese +myb I L Mbay +myc I L Mayeka +myd I L Maramba +mye I L Myene +myf I L Bambassi +myg I L Manta +myh I L Makah +myi I L Mina (India) +myj I L Mangayat +myk I L Mamara Senoufo +myl I L Moma +mym I L Me'en +myo I L Anfillo +myp I L Pirahã +myq I L Forest Maninka +myr I L Muniche +mys I E Mesmes +myu I L Mundurukú +myv myv myv I L Erzya +myw I L Muyuw +myx I L Masaaba +myy I L Macuna +myz I H Classical Mandaic +mza I L Santa María Zacatepec Mixtec +mzb I L Tumzabt +mzc I L Madagascar Sign Language +mzd I L Malimba +mze I L Morawa +mzg I L Monastic Sign Language +mzh I L Wichí Lhamtés Güisnay +mzi I L Ixcatlán Mazatec +mzj I L Manya +mzk I L Nigeria Mambila +mzl I L Mazatlán Mixe +mzm I L Mumuye +mzn I L Mazanderani +mzo I E Matipuhy +mzp I L Movima +mzq I L Mori Atas +mzr I L Marúbo +mzs I L Macanese +mzt I L Mintil +mzu I L Inapang +mzv I L Manza +mzw I L Deg +mzx I L Mawayana +mzy I L Mozambican Sign Language +mzz I L Maiadomu +naa I L Namla +nab I L Southern Nambikuára +nac I L Narak +nad I L Nijadali +nae I L Naka'ela +naf I L Nabak +nag I L Naga Pidgin +naj I L Nalu +nak I L Nakanai +nal I L Nalik +nam I L Nangikurrunggurr +nan I L Min Nan Chinese +nao I L Naaba +nap nap nap I L Neapolitan +naq I L Nama (Namibia) +nar I L Iguta +nas I L Naasioi +nat I L Hungworo +nau nau nau na I L Nauru +nav nav nav nv I L Navajo +naw I L Nawuri +nax I L Nakwi +nay I E Narrinyeri +naz I L Coatepec Nahuatl +nba I L Nyemba +nbb I L Ndoe +nbc I L Chang Naga +nbd I L Ngbinda +nbe I L Konyak Naga +nbf I L Naxi +nbg I L Nagarchal +nbh I L Ngamo +nbi I L Mao Naga +nbj I L Ngarinman +nbk I L Nake +nbl nbl nbl nr I L South Ndebele +nbm I L Ngbaka Ma'bo +nbn I L Kuri +nbo I L Nkukoli +nbp I L Nnam +nbq I L Nggem +nbr I L Numana-Nunku-Gbantu-Numbu +nbs I L Namibian Sign Language +nbt I L Na +nbu I L Rongmei Naga +nbv I L Ngamambo +nbw I L Southern Ngbandi +nbx I E Ngura +nby I L Ningera +nca I L Iyo +ncb I L Central Nicobarese +ncc I L Ponam +ncd I L Nachering +nce I L Yale +ncf I L Notsi +ncg I L Nisga'a +nch I L Central Huasteca Nahuatl +nci I H Classical Nahuatl +ncj I L Northern Puebla Nahuatl +nck I L Nakara +ncl I L Michoacán Nahuatl +ncm I L Nambo +ncn I L Nauna +nco I L Sibe +ncp I L Ndaktup +ncr I L Ncane +ncs I L Nicaraguan Sign Language +nct I L Chothe Naga +ncu I L Chumburung +ncx I L Central Puebla Nahuatl +ncz I E Natchez +nda I L Ndasa +ndb I L Kenswei Nsei +ndc I L Ndau +ndd I L Nde-Nsele-Nta +nde nde nde nd I L North Ndebele +ndf I E Nadruvian +ndg I L Ndengereko +ndh I L Ndali +ndi I L Samba Leko +ndj I L Ndamba +ndk I L Ndaka +ndl I L Ndolo +ndm I L Ndam +ndn I L Ngundi +ndo ndo ndo ng I L Ndonga +ndp I L Ndo +ndq I L Ndombe +ndr I L Ndoola +nds nds nds I L Low German +ndt I L Ndunga +ndu I L Dugun +ndv I L Ndut +ndw I L Ndobo +ndx I L Nduga +ndy I L Lutos +ndz I L Ndogo +nea I L Eastern Ngad'a +neb I L Toura (Côte d'Ivoire) +nec I L Nedebang +ned I L Nde-Gbite +nee I L Kumak +nef I L Nefamese +neg I L Negidal +neh I L Nyenkha +nei I A Neo-Hittite +nej I L Neko +nek I L Neku +nem I L Nemi +nen I L Nengone +neo I L Ná-Meo +nep nep nep ne I L Nepali +neq I L North Central Mixe +ner I L Yahadian +nes I L Bhoti Kinnauri +net I L Nete +nev I L Nyaheun +new new new I L Newari +nex I L Neme +ney I L Neyo +nez I L Nez Perce +nfa I L Dhao +nfd I L Ahwai +nfl I L Ayiwo +nfr I L Nafaanra +nfu I L Mfumte +nga I L Ngbaka +ngb I L Northern Ngbandi +ngc I L Ngombe (Democratic Republic of Congo) +ngd I L Ngando (Central African Republic) +nge I L Ngemba +ngg I L Ngbaka Manza +ngh I L N/u +ngi I L Ngizim +ngj I L Ngie +ngk I L Ngalkbun +ngl I L Lomwe +ngm I L Ngatik Men's Creole +ngn I L Ngwo +ngo I L Ngoni +ngp I L Ngulu +ngq I L Ngurimi +ngr I L Nanggu +ngs I L Gvoko +ngt I L Ngeq +ngu I L Guerrero Nahuatl +ngv I E Nagumi +ngw I L Ngwaba +ngx I L Nggwahyi +ngy I L Tibea +ngz I L Ngungwel +nha I L Nhanda +nhb I L Beng +nhc I E Tabasco Nahuatl +nhd I L Chiripá +nhe I L Eastern Huasteca Nahuatl +nhf I L Nhuwala +nhg I L Tetelcingo Nahuatl +nhh I L Nahari +nhi I L Zacatlán-Ahuacatlán-Tepetzintla Nahuatl +nhk I L Isthmus-Cosoleacaque Nahuatl +nhm I L Morelos Nahuatl +nhn I L Central Nahuatl +nho I L Takuu +nhp I L Isthmus-Pajapan Nahuatl +nhq I L Huaxcaleca Nahuatl +nhr I L Naro +nht I L Ometepec Nahuatl +nhu I L Noone +nhv I L Temascaltepec Nahuatl +nhw I L Western Huasteca Nahuatl +nhx I L Isthmus-Mecayapan Nahuatl +nhy I L Northern Oaxaca Nahuatl +nhz I L Santa María La Alta Nahuatl +nia nia nia I L Nias +nib I L Nakama +nid I E Ngandi +nie I L Niellim +nif I L Nek +nig I E Ngalakan +nih I L Nyiha (Tanzania) +nii I L Nii +nij I L Ngaju +nik I L Southern Nicobarese +nil I L Nila +nim I L Nilamba +nin I L Ninzo +nio I L Nganasan +niq I L Nandi +nir I L Nimboran +nis I L Nimi +nit I L Southeastern Kolami +niu niu niu I L Niuean +niv I L Gilyak +niw I L Nimo +nix I L Hema +niy I L Ngiti +niz I L Ningil +nja I L Nzanyi +njb I L Nocte Naga +njd I L Ndonde Hamba +njh I L Lotha Naga +nji I L Gudanji +njj I L Njen +njl I L Njalgulgule +njm I L Angami Naga +njn I L Liangmai Naga +njo I L Ao Naga +njr I L Njerep +njs I L Nisa +njt I L Ndyuka-Trio Pidgin +nju I L Ngadjunmaya +njx I L Kunyi +njy I L Njyem +nka I L Nkoya +nkb I L Khoibu Naga +nkc I L Nkongho +nkd I L Koireng +nke I L Duke +nkf I L Inpui Naga +nkg I L Nekgini +nkh I L Khezha Naga +nki I L Thangal Naga +nkj I L Nakai +nkk I L Nokuku +nkm I L Namat +nkn I L Nkangala +nko I L Nkonya +nkp I E Niuatoputapu +nkq I L Nkami +nkr I L Nukuoro +nks I L North Asmat +nkt I L Nyika (Tanzania) +nku I L Bouna Kulango +nkv I L Nyika (Malawi and Zambia) +nkw I L Nkutu +nkx I L Nkoroo +nkz I L Nkari +nla I L Ngombale +nlc I L Nalca +nld dut nld nl I L Dutch +nle I L East Nyala +nlg I L Gela +nli I L Grangali +nlj I L Nyali +nlk I L Ninia Yali +nll I L Nihali +nln I L Durango Nahuatl +nlo I L Ngul +nlr I L Ngarla +nlu I L Nchumbulu +nlv I L Orizaba Nahuatl +nlx I L Nahali +nly I L Nyamal +nlz I L Nalögo +nma I L Maram Naga +nmb I L Big Nambas +nmc I L Ngam +nmd I L Ndumu +nme I L Mzieme Naga +nmf I L Tangkhul Naga +nmg I L Kwasio +nmh I L Monsang Naga +nmi I L Nyam +nmj I L Ngombe (Central African Republic) +nmk I L Namakura +nml I L Ndemli +nmm I L Manangba +nmn I L !Xóõ +nmo I L Moyon Naga +nmp I E Nimanbur +nmq I L Nambya +nmr I E Nimbari +nms I L Letemboi +nmt I L Namonuito +nmu I L Northeast Maidu +nmv I E Ngamini +nmw I L Nimoa +nmx I L Nama (Papua New Guinea) +nmy I L Namuyi +nmz I L Nawdm +nna I L Nyangumarta +nnb I L Nande +nnc I L Nancere +nnd I L West Ambae +nne I L Ngandyera +nnf I L Ngaing +nng I L Maring Naga +nnh I L Ngiemboon +nni I L North Nuaulu +nnj I L Nyangatom +nnk I L Nankina +nnl I L Northern Rengma Naga +nnm I L Namia +nnn I L Ngete +nno nno nno nn I L Norwegian Nynorsk +nnp I L Wancho Naga +nnq I L Ngindo +nnr I E Narungga +nns I L Ningye +nnt I E Nanticoke +nnu I L Dwang +nnv I E Nugunu (Australia) +nnw I L Southern Nuni +nnx I L Ngong +nny I E Nyangga +nnz I L Nda'nda' +noa I L Woun Meu +nob nob nob nb I L Norwegian Bokmål +noc I L Nuk +nod I L Northern Thai +noe I L Nimadi +nof I L Nomane +nog nog nog I L Nogai +noh I L Nomu +noi I L Noiri +noj I L Nonuya +nok I E Nooksack +nom I E Nocamán +non non non I H Old Norse +noo I L Nootka +nop I L Numanggang +noq I L Ngongo +nor nor nor no M L Norwegian +nos I L Eastern Nisu +not I L Nomatsiguenga +nou I L Ewage-Notu +nov I C Novial +now I L Nyambo +noy I L Noy +noz I L Nayi +npa I L Nar Phu +npb I L Nupbikha +nph I L Phom Naga +npl I L Southeastern Puebla Nahuatl +npn I L Mondropolon +npo I L Pochuri Naga +nps I L Nipsan +npu I L Puimei Naga +npy I L Napu +nqg I L Southern Nago +nqk I L Kura Ede Nago +nqm I L Ndom +nqn I L Nen +nqo nqo nqo I L N'Ko +nra I L Ngom +nrb I L Nara +nrc I A Noric +nre I L Southern Rengma Naga +nrg I L Narango +nri I L Chokri Naga +nrl I L Ngarluma +nrm I L Narom +nrn I E Norn +nrp I A North Picene +nrr I L Norra +nrt I E Northern Kalapuya +nrx I E Ngurmbur +nrz I L Lala +nsa I L Sangtam Naga +nsc I L Nshi +nsd I L Southern Nisu +nse I L Nsenga +nsg I L Ngasa +nsh I L Ngoshie +nsi I L Nigerian Sign Language +nsk I L Naskapi +nsl I L Norwegian Sign Language +nsm I L Sumi Naga +nsn I L Nehan +nso nso nso I L Pedi +nsp I L Nepalese Sign Language +nsq I L Northern Sierra Miwok +nsr I L Maritime Sign Language +nss I L Nali +nst I L Tase Naga +nsu I L Sierra Negra Nahuatl +nsv I L Southwestern Nisu +nsw I L Navut +nsx I L Nsongo +nsy I L Nasal +nsz I L Nisenan +nte I L Nathembo +nti I L Natioro +ntj I L Ngaanyatjarra +ntk I L Ikoma-Nata-Isenye +ntm I L Nateni +nto I L Ntomba +ntp I L Northern Tepehuan +ntr I L Delo +nts I E Natagaimas +ntu I L Natügu +ntw I E Nottoway +nty I L Mantsi +ntz I L Natanzi +nua I L Yuaga +nuc I E Nukuini +nud I L Ngala +nue I L Ngundu +nuf I L Nusu +nug I E Nungali +nuh I L Ndunda +nui I L Ngumbi +nuj I L Nyole +nul I L Nusa Laut +num I L Niuafo'ou +nun I L Nung (Myanmar) +nuo I L Nguôn +nup I L Nupe-Nupe-Tako +nuq I L Nukumanu +nur I L Nukuria +nus I L Nuer +nut I L Nung (Viet Nam) +nuu I L Ngbundu +nuv I L Northern Nuni +nuw I L Nguluwan +nux I L Mehek +nuy I L Nunggubuyu +nuz I L Tlamacazapa Nahuatl +nvh I L Nasarian +nvm I L Namiae +nwa I E Nawathinehena +nwb I L Nyabwa +nwc nwc nwc I H Classical Newari +nwe I L Ngwe +nwi I L Southwest Tanna +nwm I L Nyamusa-Molo +nwr I L Nawaru +nwx I H Middle Newar +nwy I E Nottoway-Meherrin +nxa I L Nauete +nxd I L Ngando (Democratic Republic of Congo) +nxe I L Nage +nxg I L Ngad'a +nxi I L Nindi +nxl I L South Nuaulu +nxm I A Numidian +nxn I E Ngawun +nxr I L Ninggerum +nxu I L Narau +nxx I L Nafri +nya nya nya ny I L Nyanja +nyb I L Nyangbo +nyc I L Nyanga-li +nyd I L Nyore +nye I L Nyengo +nyf I L Giryama +nyg I L Nyindu +nyh I L Nyigina +nyi I L Ama (Sudan) +nyj I L Nyanga +nyk I L Nyaneka +nyl I L Nyeu +nym nym nym I L Nyamwezi +nyn nyn nyn I L Nyankole +nyo nyo nyo I L Nyoro +nyp I E Nyang'i +nyq I L Nayini +nyr I L Nyiha (Malawi) +nys I L Nyunga +nyt I E Nyawaygi +nyu I L Nyungwe +nyv I E Nyulnyul +nyw I L Nyaw +nyx I E Nganyaywana +nyy I L Nyakyusa-Ngonde +nza I L Tigon Mbembe +nzb I L Njebi +nzi nzi nzi I L Nzima +nzk I L Nzakara +nzm I L Zeme Naga +nzs I L New Zealand Sign Language +nzu I L Teke-Nzikou +nzy I L Nzakambay +nzz I L Nanga Dama Dogon +oaa I L Orok +oac I L Oroch +oar I A Old Aramaic (up to 700 BCE) +oav I H Old Avar +obi I E Obispeño +obk I L Southern Bontok +obl I L Oblo +obm I A Moabite +obo I L Obo Manobo +obr I H Old Burmese +obt I H Old Breton +obu I L Obulom +oca I L Ocaina +och I A Old Chinese +oci oci oci oc I L Occitan (post 1500) +oco I H Old Cornish +ocu I L Atzingo Matlatzinca +oda I L Odut +odk I L Od +odt I H Old Dutch +odu I L Odual +ofo I E Ofo +ofs I H Old Frisian +ofu I L Efutop +ogb I L Ogbia +ogc I L Ogbah +oge I H Old Georgian +ogg I L Ogbogolo +ogo I L Khana +ogu I L Ogbronuagum +oht I A Old Hittite +ohu I H Old Hungarian +oia I L Oirata +oin I L Inebu One +ojb I L Northwestern Ojibwa +ojc I L Central Ojibwa +ojg I L Eastern Ojibwa +oji oji oji oj M L Ojibwa +ojp I H Old Japanese +ojs I L Severn Ojibwa +ojv I L Ontong Java +ojw I L Western Ojibwa +oka I L Okanagan +okb I L Okobo +okd I L Okodia +oke I L Okpe (Southwestern Edo) +okh I L Koresh-e Rostam +oki I L Okiek +okj I E Oko-Juwoi +okk I L Kwamtim One +okl I E Old Kentish Sign Language +okm I H Middle Korean (10th-16th cent.) +okn I L Oki-No-Erabu +oko I H Old Korean (3rd-9th cent.) +okr I L Kirike +oks I L Oko-Eni-Osayen +oku I L Oku +okv I L Orokaiva +okx I L Okpe (Northwestern Edo) +ola I L Walungge +old I L Mochi +ole I L Olekha +olm I L Oloma +olo I L Livvi +olr I L Olrat +oma I L Omaha-Ponca +omb I L East Ambae +omc I E Mochica +ome I E Omejes +omg I L Omagua +omi I L Omi +omk I E Omok +oml I L Ombo +omn I A Minoan +omo I L Utarmbung +omp I H Old Manipuri +omr I H Old Marathi +omt I L Omotik +omu I E Omurano +omw I L South Tairora +omx I H Old Mon +ona I L Ona +onb I L Lingao +one I L Oneida +ong I L Olo +oni I L Onin +onj I L Onjob +onk I L Kabore One +onn I L Onobasulu +ono I L Onondaga +onp I L Sartang +onr I L Northern One +ons I L Ono +ont I L Ontenu +onu I L Unua +onw I H Old Nubian +onx I L Onin Based Pidgin +ood I L Tohono O'odham +oog I L Ong +oon I L Önge +oor I L Oorlams +oos I A Old Ossetic +opa I L Okpamheri +opk I L Kopkaka +opm I L Oksapmin +opo I L Opao +opt I E Opata +opy I L Ofayé +ora I L Oroha +orc I L Orma +ore I L Orejón +org I L Oring +orh I L Oroqen +ori ori ori or I L Oriya +orm orm orm om M L Oromo +orn I L Orang Kanaq +oro I L Orokolo +orr I L Oruma +ors I L Orang Seletar +ort I L Adivasi Oriya +oru I L Ormuri +orv I H Old Russian +orw I L Oro Win +orx I L Oro +orz I L Ormu +osa osa osa I L Osage +osc I A Oscan +osi I L Osing +oso I L Ososo +osp I H Old Spanish +oss oss oss os I L Ossetian +ost I L Osatu +osu I L Southern One +osx I H Old Saxon +ota ota ota I H Ottoman Turkish (1500-1928) +otb I H Old Tibetan +otd I L Ot Danum +ote I L Mezquital Otomi +oti I E Oti +otk I H Old Turkish +otl I L Tilapa Otomi +otm I L Eastern Highland Otomi +otn I L Tenango Otomi +otq I L Querétaro Otomi +otr I L Otoro +ots I L Estado de México Otomi +ott I L Temoaya Otomi +otu I E Otuke +otw I L Ottawa +otx I L Texcatepec Otomi +oty I A Old Tamil +otz I L Ixtenco Otomi +oua I L Tagargrent +oub I L Glio-Oubi +oue I L Ounge +oui I H Old Uighur +oum I E Ouma +oun I L !O!ung +owi I L Owiniga +owl I H Old Welsh +oyb I L Oy +oyd I L Oyda +oym I L Wayampi +oyy I L Oya'oya +ozm I L Koonzime +pab I L Parecís +pac I L Pacoh +pad I L Paumarí +pae I L Pagibete +paf I E Paranawát +pag pag pag I L Pangasinan +pah I L Tenharim +pai I L Pe +pak I L Parakanã +pal pal pal I A Pahlavi +pam pam pam I L Pampanga +pan pan pan pa I L Panjabi +pao I L Northern Paiute +pap pap pap I L Papiamento +paq I L Parya +par I L Panamint +pas I L Papasena +pat I L Papitalai +pau pau pau I L Palauan +pav I L Pakaásnovos +paw I L Pawnee +pax I E Pankararé +pay I L Pech +paz I E Pankararú +pbb I L Páez +pbc I L Patamona +pbe I L Mezontla Popoloca +pbf I L Coyotepec Popoloca +pbg I E Paraujano +pbh I L E'ñapa Woromaipu +pbi I L Parkwa +pbl I L Mak (Nigeria) +pbn I L Kpasam +pbo I L Papel +pbp I L Badyara +pbr I L Pangwa +pbs I L Central Pame +pbt I L Southern Pashto +pbu I L Northern Pashto +pbv I L Pnar +pby I L Pyu +pbz I L Palu +pca I L Santa Inés Ahuatempan Popoloca +pcb I L Pear +pcc I L Bouyei +pcd I L Picard +pce I L Ruching Palaung +pcf I L Paliyan +pcg I L Paniya +pch I L Pardhan +pci I L Duruwa +pcj I L Parenga +pck I L Paite Chin +pcl I L Pardhi +pcm I L Nigerian Pidgin +pcn I L Piti +pcp I L Pacahuara +pcr I L Panang +pcw I L Pyapun +pda I L Anam +pdc I L Pennsylvania German +pdi I L Pa Di +pdn I L Podena +pdo I L Padoe +pdt I L Plautdietsch +pdu I L Kayan +pea I L Peranakan Indonesian +peb I E Eastern Pomo +ped I L Mala (Papua New Guinea) +pee I L Taje +pef I E Northeastern Pomo +peg I L Pengo +peh I L Bonan +pei I L Chichimeca-Jonaz +pej I E Northern Pomo +pek I L Penchal +pel I L Pekal +pem I L Phende +peo peo peo I H Old Persian (ca. 600-400 B.C.) +pep I L Kunja +peq I L Southern Pomo +pes I L Iranian Persian +pev I L Pémono +pex I L Petats +pey I L Petjo +pez I L Eastern Penan +pfa I L Pááfang +pfe I L Peere +pfl I L Pfaelzisch +pga I L Sudanese Creole Arabic +pgg I L Pangwali +pgi I L Pagi +pgk I L Rerep +pgn I A Paelignian +pgs I L Pangseng +pgu I L Pagu +pgy I L Pongyong +pha I L Pa-Hng +phd I L Phudagi +phg I L Phuong +phh I L Phukha +phk I L Phake +phl I L Phalura +phm I L Phimbi +phn phn phn I A Phoenician +pho I L Phunoi +phq I L Phana' +phr I L Pahari-Potwari +pht I L Phu Thai +phu I L Phuan +phv I L Pahlavani +phw I L Phangduwali +pia I L Pima Bajo +pib I L Yine +pic I L Pinji +pid I L Piaroa +pie I E Piro +pif I L Pingelapese +pig I L Pisabo +pih I L Pitcairn-Norfolk +pii I L Pini +pij I E Pijao +pil I L Yom +pim I E Powhatan +pin I L Piame +pio I L Piapoco +pip I L Pero +pir I L Piratapuyo +pis I L Pijin +pit I E Pitta Pitta +piu I L Pintupi-Luritja +piv I L Pileni +piw I L Pimbwe +pix I L Piu +piy I L Piya-Kwonci +piz I L Pije +pjt I L Pitjantjatjara +pka I H Ardhamāgadhī Prākrit +pkb I L Pokomo +pkc I E Paekche +pkg I L Pak-Tong +pkh I L Pankhu +pkn I L Pakanha +pko I L Pökoot +pkp I L Pukapuka +pkr I L Attapady Kurumba +pks I L Pakistan Sign Language +pkt I L Maleng +pku I L Paku +pla I L Miani +plb I L Polonombauk +plc I L Central Palawano +pld I L Polari +ple I L Palu'e +plg I L Pilagá +plh I L Paulohi +pli pli pli pi I A Pali +plj I L Polci +plk I L Kohistani Shina +pll I L Shwe Palaung +pln I L Palenquero +plo I L Oluta Popoluca +plp I L Palpa +plq I A Palaic +plr I L Palaka Senoufo +pls I L San Marcos Tlalcoyalco Popoloca +plt I L Plateau Malagasy +plu I L Palikúr +plv I L Southwest Palawano +plw I L Brooke's Point Palawano +ply I L Bolyu +plz I L Paluan +pma I L Paama +pmb I L Pambia +pmc I E Palumata +pme I L Pwaamei +pmf I L Pamona +pmh I H Māhārāṣṭri Prākrit +pmi I L Northern Pumi +pmj I L Southern Pumi +pmk I E Pamlico +pml I E Lingua Franca +pmm I L Pomo +pmn I L Pam +pmo I L Pom +pmq I L Northern Pame +pmr I L Paynamar +pms I L Piemontese +pmt I L Tuamotuan +pmu I L Mirpur Panjabi +pmw I L Plains Miwok +pmx I L Poumei Naga +pmy I L Papuan Malay +pmz I E Southern Pame +pna I L Punan Bah-Biau +pnb I L Western Panjabi +pnc I L Pannei +pne I L Western Penan +png I L Pongu +pnh I L Penrhyn +pni I L Aoheng +pnm I L Punan Batu 1 +pnn I L Pinai-Hagahai +pno I E Panobo +pnp I L Pancana +pnq I L Pana (Burkina Faso) +pnr I L Panim +pns I L Ponosakan +pnt I L Pontic +pnu I L Jiongnai Bunu +pnv I L Pinigura +pnw I L Panytyima +pnx I L Phong-Kniang +pny I L Pinyin +pnz I L Pana (Central African Republic) +poc I L Poqomam +pod I E Ponares +poe I L San Juan Atzingo Popoloca +pof I L Poke +pog I E Potiguára +poh I L Poqomchi' +poi I L Highland Popoluca +pok I L Pokangá +pol pol pol pl I L Polish +pom I L Southeastern Pomo +pon pon pon I L Pohnpeian +poo I L Central Pomo +pop I L Pwapwa +poq I L Texistepec Popoluca +por por por pt I L Portuguese +pos I L Sayula Popoluca +pot I L Potawatomi +pov I L Upper Guinea Crioulo +pow I L San Felipe Otlaltepec Popoloca +pox I E Polabian +poy I L Pogolo +ppa I L Pao +ppe I L Papi +ppi I L Paipai +ppk I L Uma +ppl I L Pipil +ppm I L Papuma +ppn I L Papapana +ppo I L Folopa +ppp I L Pelende +ppq I L Pei +ppr I L Piru +pps I L San Luís Temalacayuca Popoloca +ppt I L Pare +ppu I E Papora +pqa I L Pa'a +pqm I L Malecite-Passamaquoddy +prb I L Lua' +prc I L Parachi +prd I L Parsi-Dari +pre I L Principense +prf I L Paranan +prg I L Prussian +prh I L Porohanon +pri I L Paicî +prk I L Parauk +prl I L Peruvian Sign Language +prm I L Kibiri +prn I L Prasuni +pro pro pro I H Old Provençal (to 1500) +prp I L Parsi +prq I L Ashéninka Perené +prr I E Puri +prs I L Dari +prt I L Phai +pru I L Puragi +prw I L Parawen +prx I L Purik +pry I L Pray 3 +prz I L Providencia Sign Language +psa I L Asue Awyu +psc I L Persian Sign Language +psd I L Plains Indian Sign Language +pse I L Central Malay +psg I L Penang Sign Language +psh I L Southwest Pashayi +psi I L Southeast Pashayi +psl I L Puerto Rican Sign Language +psm I E Pauserna +psn I L Panasuan +pso I L Polish Sign Language +psp I L Philippine Sign Language +psq I L Pasi +psr I L Portuguese Sign Language +pss I L Kaulong +pst I L Central Pashto +psu I H Sauraseni Prākrit +psw I L Port Sandwich +psy I E Piscataway +pta I L Pai Tavytera +pth I E Pataxó Hã-Ha-Hãe +pti I L Pintiini +ptn I L Patani +pto I L Zo'é +ptp I L Patep +ptr I L Piamatsina +ptt I L Enrekang +ptu I L Bambam +ptv I L Port Vato +ptw I E Pentlatch +pty I L Pathiya +pua I L Western Highland Purepecha +pub I L Purum +puc I L Punan Merap +pud I L Punan Aput +pue I L Puelche +puf I L Punan Merah +pug I L Phuie +pui I L Puinave +puj I L Punan Tubu +puk I L Pu Ko +pum I L Puma +puo I L Puoc +pup I L Pulabu +puq I E Puquina +pur I L Puruborá +pus pus pus ps M L Pushto +put I L Putoh +puu I L Punu +puw I L Puluwatese +pux I L Puare +puy I E Purisimeño +puz I L Purum Naga +pwa I L Pawaia +pwb I L Panawa +pwg I L Gapapaiwa +pwm I L Molbog +pwn I L Paiwan +pwo I L Pwo Western Karen +pwr I L Powari +pww I L Pwo Northern Karen +pxm I L Quetzaltepec Mixe +pye I L Pye Krumen +pym I L Fyam +pyn I L Poyanáwa +pys I L Paraguayan Sign Language +pyu I L Puyuma +pyx I A Pyu (Myanmar) +pyy I L Pyen +pzn I L Para Naga +qua I L Quapaw +qub I L Huallaga Huánuco Quechua +quc I L K'iche' +qud I L Calderón Highland Quichua +que que que qu M L Quechua +quf I L Lambayeque Quechua +qug I L Chimborazo Highland Quichua +quh I L South Bolivian Quechua +qui I L Quileute +quk I L Chachapoyas Quechua +qul I L North Bolivian Quechua +qum I L Sipacapense +qun I E Quinault +qup I L Southern Pastaza Quechua +quq I L Quinqui +qur I L Yanahuanca Pasco Quechua +qus I L Santiago del Estero Quichua +quv I L Sacapulteco +quw I L Tena Lowland Quichua +qux I L Yauyos Quechua +quy I L Ayacucho Quechua +quz I L Cusco Quechua +qva I L Ambo-Pasco Quechua +qvc I L Cajamarca Quechua +qve I L Eastern Apurímac Quechua +qvh I L Huamalíes-Dos de Mayo Huánuco Quechua +qvi I L Imbabura Highland Quichua +qvj I L Loja Highland Quichua +qvl I L Cajatambo North Lima Quechua +qvm I L Margos-Yarowilca-Lauricocha Quechua +qvn I L North Junín Quechua +qvo I L Napo Lowland Quechua +qvp I L Pacaraos Quechua +qvs I L San Martín Quechua +qvw I L Huaylla Wanca Quechua +qvy I L Queyu +qvz I L Northern Pastaza Quichua +qwa I L Corongo Ancash Quechua +qwc I H Classical Quechua +qwh I L Huaylas Ancash Quechua +qwm I E Kuman (Russia) +qws I L Sihuas Ancash Quechua +qwt I E Kwalhioqua-Tlatskanai +qxa I L Chiquián Ancash Quechua +qxc I L Chincha Quechua +qxh I L Panao Huánuco Quechua +qxl I L Salasaca Highland Quichua +qxn I L Northern Conchucos Ancash Quechua +qxo I L Southern Conchucos Ancash Quechua +qxp I L Puno Quechua +qxq I L Qashqa'i +qxr I L Cañar Highland Quichua +qxs I L Southern Qiang +qxt I L Santa Ana de Tusi Pasco Quechua +qxu I L Arequipa-La Unión Quechua +qxw I L Jauja Wanca Quechua +qya I C Quenya +qyp I E Quiripi +raa I L Dungmali +rab I L Camling +rac I L Rasawa +rad I L Rade +raf I L Western Meohang +rag I L Logooli +rah I L Rabha +rai I L Ramoaaina +raj raj raj M L Rajasthani +rak I L Tulu-Bohuai +ral I L Ralte +ram I L Canela +ran I L Riantana +rao I L Rao +rap rap rap I L Rapanui +raq I L Saam +rar rar rar I L Rarotongan +ras I L Tegali +rat I L Razajerdi +rau I L Raute +rav I L Sampang +raw I L Rawang +rax I L Rang +ray I L Rapa +raz I L Rahambuu +rbb I L Rumai Palaung +rbk I L Northern Bontok +rbl I L Miraya Bikol +rcf I L Réunion Creole French +rdb I L Rudbari +rea I L Rerau +reb I L Rembong +ree I L Rejang Kayan +reg I L Kara (Tanzania) +rei I L Reli +rej I L Rejang +rel I L Rendille +rem I E Remo +ren I L Rengao +rer I E Rer Bare +res I L Reshe +ret I L Retta +rey I L Reyesano +rga I L Roria +rge I L Romano-Greek +rgk I E Rangkas +rgn I L Romagnol +rgr I L Resígaro +rgs I L Southern Roglai +rgu I L Ringgou +rhg I L Rohingya +rhp I L Yahang +ria I L Riang (India) +rie I L Rien +rif I L Tarifit +ril I L Riang (Myanmar) +rim I L Nyaturu +rin I L Nungu +rir I L Ribun +rit I L Ritarungo +riu I L Riung +rjg I L Rajong +rji I L Raji +rjs I L Rajbanshi +rka I L Kraol +rkb I L Rikbaktsa +rkh I L Rakahanga-Manihiki +rki I L Rakhine +rkm I L Marka +rkt I L Rangpuri +rma I L Rama +rmb I L Rembarunga +rmc I L Carpathian Romani +rmd I E Traveller Danish +rme I L Angloromani +rmf I L Kalo Finnish Romani +rmg I L Traveller Norwegian +rmh I L Murkim +rmi I L Lomavren +rmk I L Romkun +rml I L Baltic Romani +rmm I L Roma +rmn I L Balkan Romani +rmo I L Sinte Romani +rmp I L Rempi +rmq I L Caló +rms I L Romanian Sign Language +rmt I L Domari +rmu I L Tavringer Romani +rmv I C Romanova +rmw I L Welsh Romani +rmx I L Romam +rmy I L Vlax Romani +rmz I L Marma +rna I E Runa +rnd I L Ruund +rng I L Ronga +rnl I L Ranglong +rnn I L Roon +rnp I L Rongpo +rnw I L Rungwa +rob I L Tae' +roc I L Cacgia Roglai +rod I L Rogo +roe I L Ronji +rof I L Rombo +rog I L Northern Roglai +roh roh roh rm I L Romansh +rol I L Romblomanon +rom rom rom M L Romany +ron rum ron ro I L Romanian +roo I L Rotokas +rop I L Kriol +ror I L Rongga +rou I L Runga +row I L Dela-Oenale +rpn I L Repanbitip +rpt I L Rapting +rri I L Ririo +rro I L Waima +rsb I L Romano-Serbian +rsi I L Rennellese Sign Language +rsl I L Russian Sign Language +rth I L Ratahan +rtm I L Rotuman +rtw I L Rathawi +rub I L Gungu +ruc I L Ruuli +rue I L Rusyn +ruf I L Luguru +rug I L Roviana +ruh I L Ruga +rui I L Rufiji +ruk I L Che +run run run rn I L Rundi +ruo I L Istro Romanian +rup rup rup I L Macedo-Romanian +ruq I L Megleno Romanian +rus rus rus ru I L Russian +rut I L Rutul +ruu I L Lanas Lobu +ruy I L Mala (Nigeria) +ruz I L Ruma +rwa I L Rawo +rwk I L Rwa +rwm I L Amba (Uganda) +rwo I L Rawa +rwr I L Marwari (India) +ryn I L Northern Amami-Oshima +rys I L Yaeyama +ryu I L Central Okinawan +saa I L Saba +sab I L Buglere +sac I L Meskwaki +sad sad sad I L Sandawe +sae I L Sabanê +saf I L Safaliba +sag sag sag sg I L Sango +sah sah sah I L Yakut +saj I L Sahu +sak I L Sake +sam sam sam I E Samaritan Aramaic +san san san sa I A Sanskrit +sao I L Sause +sap I L Sanapaná +saq I L Samburu +sar I E Saraveca +sas sas sas I L Sasak +sat sat sat I L Santali +sau I L Saleman +sav I L Saafi-Saafi +saw I L Sawi +sax I L Sa +say I L Saya +saz I L Saurashtra +sba I L Ngambay +sbb I L Simbo +sbc I L Kele (Papua New Guinea) +sbd I L Southern Samo +sbe I L Saliba +sbf I L Shabo +sbg I L Seget +sbh I L Sori-Harengan +sbi I L Seti +sbj I L Surbakhal +sbk I L Safwa +sbl I L Botolan Sambal +sbm I L Sagala +sbn I L Sindhi Bhil +sbo I L Sabüm +sbp I L Sangu (Tanzania) +sbq I L Sileibi +sbr I L Sembakung Murut +sbs I L Subiya +sbt I L Kimki +sbu I L Stod Bhoti +sbv I A Sabine +sbw I L Simba +sbx I L Seberuang +sby I L Soli +sbz I L Sara Kaba +sca I L Sansu +scb I L Chut +sce I L Dongxiang +scf I L San Miguel Creole French +scg I L Sanggau +sch I L Sakachep +sci I L Sri Lankan Creole Malay +sck I L Sadri +scl I L Shina +scn scn scn I L Sicilian +sco sco sco I L Scots +scp I L Helambu Sherpa +scq I L Sa'och +scs I L North Slavey +scu I L Shumcho +scv I L Sheni +scw I L Sha +scx I A Sicel +sda I L Toraja-Sa'dan +sdb I L Shabak +sdc I L Sassarese Sardinian +sde I L Surubu +sdf I L Sarli +sdg I L Savi +sdh I L Southern Kurdish +sdj I L Suundi +sdk I L Sos Kundi +sdl I L Saudi Arabian Sign Language +sdm I L Semandang +sdn I L Gallurese Sardinian +sdo I L Bukar-Sadung Bidayuh +sdp I L Sherdukpen +sdr I L Oraon Sadri +sds I E Sened +sdt I E Shuadit +sdu I L Sarudu +sdx I L Sibu Melanau +sdz I L Sallands +sea I L Semai +seb I L Shempire Senoufo +sec I L Sechelt +sed I L Sedang +see I L Seneca +sef I L Cebaara Senoufo +seg I L Segeju +seh I L Sena +sei I L Seri +sej I L Sene +sek I L Sekani +sel sel sel I L Selkup +sen I L Nanerigé Sénoufo +seo I L Suarmin +sep I L Sìcìté Sénoufo +seq I L Senara Sénoufo +ser I L Serrano +ses I L Koyraboro Senni Songhai +set I L Sentani +seu I L Serui-Laut +sev I L Nyarafolo Senoufo +sew I L Sewa Bay +sey I L Secoya +sez I L Senthang Chin +sfb I L Langue des signes de Belgique Francophone +sfm I L Small Flowery Miao +sfs I L South African Sign Language +sfw I L Sehwi +sga sga sga I H Old Irish (to 900) +sgb I L Mag-antsi Ayta +sgc I L Kipsigis +sgd I L Surigaonon +sge I L Segai +sgg I L Swiss-German Sign Language +sgh I L Shughni +sgi I L Suga +sgk I L Sangkong +sgm I E Singa +sgo I L Songa +sgp I L Singpho +sgr I L Sangisari +sgs I L Samogitian +sgt I L Brokpake +sgu I L Salas +sgw I L Sebat Bet Gurage +sgx I L Sierra Leone Sign Language +sgy I L Sanglechi +sgz I L Sursurunga +sha I L Shall-Zwall +shb I L Ninam +shc I L Sonde +shd I L Kundal Shahi +she I L Sheko +shg I L Shua +shh I L Shoshoni +shi I L Tachelhit +shj I L Shatt +shk I L Shilluk +shl I L Shendu +shm I L Shahrudi +shn shn shn I L Shan +sho I L Shanga +shp I L Shipibo-Conibo +shq I L Sala +shr I L Shi +shs I L Shuswap +sht I E Shasta +shu I L Chadian Arabic +shv I L Shehri +shw I L Shwai +shx I L She +shy I L Tachawit +shz I L Syenara Senoufo +sia I E Akkala Sami +sib I L Sebop +sid sid sid I L Sidamo +sie I L Simaa +sif I L Siamou +sig I L Paasaal +sih I L Zire +sii I L Shom Peng +sij I L Numbami +sik I L Sikiana +sil I L Tumulung Sisaala +sim I L Mende (Papua New Guinea) +sin sin sin si I L Sinhala +sip I L Sikkimese +siq I L Sonia +sir I L Siri +sis I E Siuslaw +siu I L Sinagen +siv I L Sumariup +siw I L Siwai +six I L Sumau +siy I L Sivandi +siz I L Siwi +sja I L Epena +sjb I L Sajau Basap +sjd I L Kildin Sami +sje I L Pite Sami +sjg I L Assangori +sjk I E Kemi Sami +sjl I L Sajalong +sjm I L Mapun +sjn I C Sindarin +sjo I L Xibe +sjp I L Surjapuri +sjr I L Siar-Lak +sjs I E Senhaja De Srair +sjt I L Ter Sami +sju I L Ume Sami +sjw I L Shawnee +ska I L Skagit +skb I L Saek +skc I L Sauk +skd I L Southern Sierra Miwok +ske I L Seke (Vanuatu) +skf I L Sakirabiá +skg I L Sakalava Malagasy +skh I L Sikule +ski I L Sika +skj I L Seke (Nepal) +skk I L Sok +skm I L Sakam +skn I L Kolibugan Subanon +sko I L Seko Tengah +skp I L Sekapan +skq I L Sininkere +skr I L Seraiki +sks I L Maia +skt I L Sakata +sku I L Sakao +skv I L Skou +skw I E Skepi Creole Dutch +skx I L Seko Padang +sky I L Sikaiana +skz I L Sekar +slc I L Sáliba +sld I L Sissala +sle I L Sholaga +slf I L Swiss-Italian Sign Language +slg I L Selungai Murut +slh I L Southern Puget Sound Salish +sli I L Lower Silesian +slj I L Salumá +slk slo slk sk I L Slovak +sll I L Salt-Yui +slm I L Pangutaran Sama +sln I E Salinan +slp I L Lamaholot +slq I L Salchuq +slr I L Salar +sls I L Singapore Sign Language +slt I L Sila +slu I L Selaru +slv slv slv sl I L Slovenian +slw I L Sialum +slx I L Salampasu +sly I L Selayar +slz I L Ma'ya +sma sma sma I L Southern Sami +smb I L Simbari +smc I L Som +smd I L Sama +sme sme sme se I L Northern Sami +smf I L Auwe +smg I L Simbali +smh I L Samei +smj smj smj I L Lule Sami +smk I L Bolinao +sml I L Central Sama +smm I L Musasa +smn smn smn I L Inari Sami +smo smo smo sm I L Samoan +smp I E Samaritan +smq I L Samo +smr I L Simeulue +sms sms sms I L Skolt Sami +smt I L Simte +smu I E Somray +smv I L Samvedi +smw I L Sumbawa +smx I L Samba +smy I L Semnani +smz I L Simeku +sna sna sna sn I L Shona +snb I L Sebuyau +snc I L Sinaugoro +snd snd snd sd I L Sindhi +sne I L Bau Bidayuh +snf I L Noon +sng I L Sanga (Democratic Republic of Congo) +snh I E Shinabo +sni I E Sensi +snj I L Riverain Sango +snk snk snk I L Soninke +snl I L Sangil +snm I L Southern Ma'di +snn I L Siona +sno I L Snohomish +snp I L Siane +snq I L Sangu (Gabon) +snr I L Sihan +sns I L South West Bay +snu I L Senggi +snv I L Sa'ban +snw I L Selee +snx I L Sam +sny I L Saniyo-Hiyewe +snz I L Sinsauru +soa I L Thai Song +sob I L Sobei +soc I L So (Democratic Republic of Congo) +sod I L Songoora +soe I L Songomeno +sog sog sog I A Sogdian +soh I L Aka +soi I L Sonha +soj I L Soi +sok I L Sokoro +sol I L Solos +som som som so I L Somali +soo I L Songo +sop I L Songe +soq I L Kanasi +sor I L Somrai +sos I L Seeku +sot sot sot st I L Southern Sotho +sou I L Southern Thai +sov I L Sonsorol +sow I L Sowanda +sox I L So (Cameroon) +soy I L Miyobe +soz I L Temi +spa spa spa es I L Spanish +spb I L Sepa (Indonesia) +spc I L Sapé +spd I L Saep +spe I L Sepa (Papua New Guinea) +spg I L Sian +spi I L Saponi +spk I L Sengo +spl I L Selepet +spm I L Sepen +spo I L Spokane +spp I L Supyire Senoufo +spq I L Loreto-Ucayali Spanish +spr I L Saparua +sps I L Saposa +spt I L Spiti Bhoti +spu I L Sapuan +spx I A South Picene +spy I L Sabaot +sqa I L Shama-Sambuga +sqh I L Shau +sqi alb sqi sq M L Albanian +sqm I L Suma +sqn I E Susquehannock +sqo I L Sorkhei +sqq I L Sou +sqr I H Siculo Arabic +sqs I L Sri Lankan Sign Language +sqt I L Soqotri +squ I L Squamish +sra I L Saruga +srb I L Sora +src I L Logudorese Sardinian +srd srd srd sc M L Sardinian +sre I L Sara +srf I L Nafi +srg I L Sulod +srh I L Sarikoli +sri I L Siriano +srk I L Serudung Murut +srl I L Isirawa +srm I L Saramaccan +srn srn srn I L Sranan Tongo +sro I L Campidanese Sardinian +srp srp srp sr I L Serbian +srq I L Sirionó +srr srr srr I L Serer +srs I L Sarsi +srt I L Sauri +sru I L Suruí +srv I L Southern Sorsoganon +srw I L Serua +srx I L Sirmauri +sry I L Sera +srz I L Shahmirzadi +ssb I L Southern Sama +ssc I L Suba-Simbiti +ssd I L Siroi +sse I L Balangingi +ssf I L Thao +ssg I L Seimat +ssh I L Shihhi Arabic +ssi I L Sansi +ssj I L Sausi +ssk I L Sunam +ssl I L Western Sisaala +ssm I L Semnam +ssn I L Waata +sso I L Sissano +ssp I L Spanish Sign Language +ssq I L So'a +ssr I L Swiss-French Sign Language +sss I L Sô +sst I L Sinasina +ssu I L Susuami +ssv I L Shark Bay +ssw ssw ssw ss I L Swati +ssx I L Samberigi +ssy I L Saho +ssz I L Sengseng +sta I L Settla +stb I L Northern Subanen +std I L Sentinel +ste I L Liana-Seti +stf I L Seta +stg I L Trieng +sth I L Shelta +sti I L Bulo Stieng +stj I L Matya Samo +stk I L Arammba +stl I L Stellingwerfs +stm I L Setaman +stn I L Owa +sto I L Stoney +stp I L Southeastern Tepehuan +stq I L Saterfriesisch +str I L Straits Salish +sts I L Shumashti +stt I L Budeh Stieng +stu I L Samtao +stv I L Silt'e +stw I L Satawalese +sua I L Sulka +sub I L Suku +suc I L Western Subanon +sue I L Suena +sug I L Suganga +sui I L Suki +suj I L Shubi +suk suk suk I L Sukuma +sun sun sun su I L Sundanese +suq I L Suri +sur I L Mwaghavul +sus sus sus I L Susu +sut I E Subtiaba +suv I L Sulung +suw I L Sumbwa +sux sux sux I A Sumerian +suy I L Suyá +suz I L Sunwar +sva I L Svan +svb I L Ulau-Suain +svc I L Vincentian Creole English +sve I L Serili +svk I L Slovakian Sign Language +svr I L Savara +svs I L Savosavo +svx I E Skalvian +swa swa swa sw M L Swahili (macrolanguage) +swb I L Maore Comorian +swc I L Congo Swahili +swe swe swe sv I L Swedish +swf I L Sere +swg I L Swabian +swh I L Swahili (individual language) +swi I L Sui +swj I L Sira +swk I L Malawi Sena +swl I L Swedish Sign Language +swm I L Samosa +swn I L Sawknah +swo I L Shanenawa +swp I L Suau +swq I L Sharwa +swr I L Saweru +sws I L Seluwasan +swt I L Sawila +swu I L Suwawa +swv I L Shekhawati +sww I E Sowa +swx I L Suruahá +swy I L Sarua +sxb I L Suba +sxc I A Sicanian +sxe I L Sighu +sxg I L Shixing +sxk I E Southern Kalapuya +sxl I E Selian +sxm I L Samre +sxn I L Sangir +sxo I A Sorothaptic +sxr I L Saaroa +sxs I L Sasaru +sxu I L Upper Saxon +sxw I L Saxwe Gbe +sya I L Siang +syb I L Central Subanen +syc syc syc I H Classical Syriac +syi I L Seki +syk I L Sukur +syl I L Sylheti +sym I L Maya Samo +syn I L Senaya +syo I L Suoy +syr syr syr M L Syriac +sys I L Sinyar +syw I L Kagate +syy I L Al-Sayyid Bedouin Sign Language +sza I L Semelai +szb I L Ngalum +szc I L Semaq Beri +szd I E Seru +sze I L Seze +szg I L Sengele +szl I L Silesian +szn I L Sula +szp I L Suabo +szv I L Isu (Fako Division) +szw I L Sawai +taa I L Lower Tanana +tab I L Tabassaran +tac I L Lowland Tarahumara +tad I L Tause +tae I L Tariana +taf I L Tapirapé +tag I L Tagoi +tah tah tah ty I L Tahitian +taj I L Eastern Tamang +tak I L Tala +tal I L Tal +tam tam tam ta I L Tamil +tan I L Tangale +tao I L Yami +tap I L Taabwa +taq I L Tamasheq +tar I L Central Tarahumara +tas I E Tay Boi +tat tat tat tt I L Tatar +tau I L Upper Tanana +tav I L Tatuyo +taw I L Tai +tax I L Tamki +tay I L Atayal +taz I L Tocho +tba I L Aikanã +tbb I E Tapeba +tbc I L Takia +tbd I L Kaki Ae +tbe I L Tanimbili +tbf I L Mandara +tbg I L North Tairora +tbh I E Thurawal +tbi I L Gaam +tbj I L Tiang +tbk I L Calamian Tagbanwa +tbl I L Tboli +tbm I L Tagbu +tbn I L Barro Negro Tunebo +tbo I L Tawala +tbp I L Taworta +tbr I L Tumtum +tbs I L Tanguat +tbt I L Tembo (Kitembo) +tbu I E Tubar +tbv I L Tobo +tbw I L Tagbanwa +tbx I L Kapin +tby I L Tabaru +tbz I L Ditammari +tca I L Ticuna +tcb I L Tanacross +tcc I L Datooga +tcd I L Tafi +tce I L Southern Tutchone +tcf I L Malinaltepec Me'phaa +tcg I L Tamagario +tch I L Turks And Caicos Creole English +tci I L Wára +tck I L Tchitchege +tcl I E Taman (Myanmar) +tcm I L Tanahmerah +tcn I L Tichurong +tco I L Taungyo +tcp I L Tawr Chin +tcq I L Kaiy +tcs I L Torres Strait Creole +tct I L T'en +tcu I L Southeastern Tarahumara +tcw I L Tecpatlán Totonac +tcx I L Toda +tcy I L Tulu +tcz I L Thado Chin +tda I L Tagdal +tdb I L Panchpargania +tdc I L Emberá-Tadó +tdd I L Tai Nüa +tde I L Tiranige Diga Dogon +tdf I L Talieng +tdg I L Western Tamang +tdh I L Thulung +tdi I L Tomadino +tdj I L Tajio +tdk I L Tambas +tdl I L Sur +tdn I L Tondano +tdo I L Teme +tdq I L Tita +tdr I L Todrah +tds I L Doutai +tdt I L Tetun Dili +tdu I L Tempasuk Dusun +tdv I L Toro +tdx I L Tandroy-Mahafaly Malagasy +tdy I L Tadyawan +tea I L Temiar +teb I E Tetete +tec I L Terik +ted I L Tepo Krumen +tee I L Huehuetla Tepehua +tef I L Teressa +teg I L Teke-Tege +teh I L Tehuelche +tei I L Torricelli +tek I L Ibali Teke +tel tel tel te I L Telugu +tem tem tem I L Timne +ten I E Tama (Colombia) +teo I L Teso +tep I E Tepecano +teq I L Temein +ter ter ter I L Tereno +tes I L Tengger +tet tet tet I L Tetum +teu I L Soo +tev I L Teor +tew I L Tewa (USA) +tex I L Tennet +tey I L Tulishi +tfi I L Tofin Gbe +tfn I L Tanaina +tfo I L Tefaro +tfr I L Teribe +tft I L Ternate +tga I L Sagalla +tgb I L Tobilung +tgc I L Tigak +tgd I L Ciwogai +tge I L Eastern Gorkha Tamang +tgf I L Chalikha +tgg I L Tangga +tgh I L Tobagonian Creole English +tgi I L Lawunuia +tgk tgk tgk tg I L Tajik +tgl tgl tgl tl I L Tagalog +tgn I L Tandaganon +tgo I L Sudest +tgp I L Tangoa +tgq I L Tring +tgr I L Tareng +tgs I L Nume +tgt I L Central Tagbanwa +tgu I L Tanggu +tgv I E Tingui-Boto +tgw I L Tagwana Senoufo +tgx I L Tagish +tgy I E Togoyo +tha tha tha th I L Thai +thc I L Tai Hang Tong +thd I L Thayore +the I L Chitwania Tharu +thf I L Thangmi +thh I L Northern Tarahumara +thi I L Tai Long +thk I L Tharaka +thl I L Dangaura Tharu +thm I L Aheu +thn I L Thachanadan +thp I L Thompson +thq I L Kochila Tharu +thr I L Rana Tharu +ths I L Thakali +tht I L Tahltan +thu I L Thuri +thv I L Tahaggart Tamahaq +thw I L Thudam +thx I L The +thy I L Tha +thz I L Tayart Tamajeq +tia I L Tidikelt Tamazight +tic I L Tira +tid I L Tidong +tie I L Tingal +tif I L Tifal +tig tig tig I L Tigre +tih I L Timugon Murut +tii I L Tiene +tij I L Tilung +tik I L Tikar +til I E Tillamook +tim I L Timbe +tin I L Tindi +tio I L Teop +tip I L Trimuris +tiq I L Tiéfo +tir tir tir ti I L Tigrinya +tis I L Masadiit Itneg +tit I L Tinigua +tiu I L Adasen +tiv tiv tiv I L Tiv +tiw I L Tiwi +tix I L Southern Tiwa +tiy I L Tiruray +tiz I L Tai Hongjin +tja I L Tajuasohn +tjg I L Tunjung +tji I L Northern Tujia +tjm I E Timucua +tjn I E Tonjon +tjo I L Temacine Tamazight +tjs I L Southern Tujia +tju I E Tjurruru +tka I E Truká +tkb I L Buksa +tkd I L Tukudede +tke I L Takwane +tkf I E Tukumanféd +tkk I L Takpa +tkl tkl tkl I L Tokelau +tkm I E Takelma +tkn I L Toku-No-Shima +tkp I L Tikopia +tkq I L Tee +tkr I L Tsakhur +tks I L Takestani +tkt I L Kathoriya Tharu +tku I L Upper Necaxa Totonac +tkw I L Teanu +tkx I L Tangko +tkz I L Takua +tla I L Southwestern Tepehuan +tlb I L Tobelo +tlc I L Yecuatla Totonac +tld I L Talaud +tlf I L Telefol +tlg I L Tofanma +tlh tlh tlh I C Klingon +tli tli tli I L Tlingit +tlj I L Talinga-Bwisi +tlk I L Taloki +tll I L Tetela +tlm I L Tolomako +tln I L Talondo' +tlo I L Talodi +tlp I L Filomena Mata-Coahuitlán Totonac +tlq I L Tai Loi +tlr I L Talise +tls I L Tambotalo +tlt I L Teluti +tlu I L Tulehu +tlv I L Taliabu +tlw I L South Wemale +tlx I L Khehek +tly I L Talysh +tma I L Tama (Chad) +tmb I L Katbol +tmc I L Tumak +tmd I L Haruai +tme I E Tremembé +tmf I L Toba-Maskoy +tmg I E Ternateño +tmh tmh tmh M L Tamashek +tmi I L Tutuba +tmj I L Samarokena +tmk I L Northwestern Tamang +tml I L Tamnim Citak +tmm I L Tai Thanh +tmn I L Taman (Indonesia) +tmo I L Temoq +tmp I L Tai Mène +tmq I L Tumleo +tmr I E Jewish Babylonian Aramaic (ca. 200-1200 CE) +tms I L Tima +tmt I L Tasmate +tmu I L Iau +tmv I L Tembo (Motembo) +tmw I L Temuan +tmy I L Tami +tmz I E Tamanaku +tna I L Tacana +tnb I L Western Tunebo +tnc I L Tanimuca-Retuarã +tnd I L Angosturas Tunebo +tne I L Tinoc Kallahan +tng I L Tobanga +tnh I L Maiani +tni I L Tandia +tnk I L Kwamera +tnl I L Lenakel +tnm I L Tabla +tnn I L North Tanna +tno I L Toromono +tnp I L Whitesands +tnq I E Taino +tnr I L Bedik +tns I L Tenis +tnt I L Tontemboan +tnu I L Tay Khang +tnv I L Tangchangya +tnw I L Tonsawang +tnx I L Tanema +tny I L Tongwe +tnz I L Tonga (Thailand) +tob I L Toba +toc I L Coyutla Totonac +tod I L Toma +toe I E Tomedes +tof I L Gizrra +tog tog tog I L Tonga (Nyasa) +toh I L Gitonga +toi I L Tonga (Zambia) +toj I L Tojolabal +tol I L Tolowa +tom I L Tombulu +ton ton ton to I L Tonga (Tonga Islands) +too I L Xicotepec De Juárez Totonac +top I L Papantla Totonac +toq I L Toposa +tor I L Togbo-Vara Banda +tos I L Highland Totonac +tou I L Tho +tov I L Upper Taromi +tow I L Jemez +tox I L Tobian +toy I L Topoiyo +toz I L To +tpa I L Taupota +tpc I L Azoyú Me'phaa +tpe I L Tippera +tpf I L Tarpia +tpg I L Kula +tpi tpi tpi I L Tok Pisin +tpj I L Tapieté +tpk I E Tupinikin +tpl I L Tlacoapa Me'phaa +tpm I L Tampulma +tpn I E Tupinambá +tpo I L Tai Pao +tpp I L Pisaflores Tepehua +tpq I L Tukpa +tpr I L Tuparí +tpt I L Tlachichilco Tepehua +tpu I L Tampuan +tpv I L Tanapag +tpw I E Tupí +tpx I L Acatepec Me'phaa +tpy I L Trumai +tpz I L Tinputz +tqb I L Tembé +tql I L Lehali +tqm I L Turumsa +tqn I L Tenino +tqo I L Toaripi +tqp I L Tomoip +tqq I L Tunni +tqr I E Torona +tqt I L Western Totonac +tqu I L Touo +tqw I E Tonkawa +tra I L Tirahi +trb I L Terebu +trc I L Copala Triqui +trd I L Turi +tre I L East Tarangan +trf I L Trinidadian Creole English +trg I L Lishán Didán +trh I L Turaka +tri I L Trió +trj I L Toram +trl I L Traveller Scottish +trm I L Tregami +trn I L Trinitario +tro I L Tarao Naga +trp I L Kok Borok +trq I L San Martín Itunyoso Triqui +trr I L Taushiro +trs I L Chicahuaxtla Triqui +trt I L Tunggare +tru I L Turoyo +trv I L Taroko +trw I L Torwali +trx I L Tringgus-Sembaan Bidayuh +try I E Turung +trz I E Torá +tsa I L Tsaangi +tsb I L Tsamai +tsc I L Tswa +tsd I L Tsakonian +tse I L Tunisian Sign Language +tsf I L Southwestern Tamang +tsg I L Tausug +tsh I L Tsuvan +tsi tsi tsi I L Tsimshian +tsj I L Tshangla +tsk I L Tseku +tsl I L Ts'ün-Lao +tsm I L Turkish Sign Language +tsn tsn tsn tn I L Tswana +tso tso tso ts I L Tsonga +tsp I L Northern Toussian +tsq I L Thai Sign Language +tsr I L Akei +tss I L Taiwan Sign Language +tsu I L Tsou +tsv I L Tsogo +tsw I L Tsishingini +tsx I L Mubami +tsy I L Tebul Sign Language +tsz I L Purepecha +tta I E Tutelo +ttb I L Gaa +ttc I L Tektiteko +ttd I L Tauade +tte I L Bwanabwana +ttf I L Tuotomb +ttg I L Tutong +tth I L Upper Ta'oih +tti I L Tobati +ttj I L Tooro +ttk I L Totoro +ttl I L Totela +ttm I L Northern Tutchone +ttn I L Towei +tto I L Lower Ta'oih +ttp I L Tombelala +ttq I L Tawallammat Tamajaq +ttr I L Tera +tts I L Northeastern Thai +ttt I L Muslim Tat +ttu I L Torau +ttv I L Titan +ttw I L Long Wat +tty I L Sikaritai +ttz I L Tsum +tua I L Wiarumus +tub I L Tübatulabal +tuc I L Mutu +tud I E Tuxá +tue I L Tuyuca +tuf I L Central Tunebo +tug I L Tunia +tuh I L Taulil +tui I L Tupuri +tuj I L Tugutil +tuk tuk tuk tk I L Turkmen +tul I L Tula +tum tum tum I L Tumbuka +tun I E Tunica +tuo I L Tucano +tuq I L Tedaga +tur tur tur tr I L Turkish +tus I L Tuscarora +tuu I L Tututni +tuv I L Turkana +tux I E Tuxináwa +tuy I L Tugen +tuz I L Turka +tva I L Vaghua +tvd I L Tsuvadi +tve I L Te'un +tvk I L Southeast Ambrym +tvl tvl tvl I L Tuvalu +tvm I L Tela-Masbuar +tvn I L Tavoyan +tvo I L Tidore +tvs I L Taveta +tvt I L Tutsa Naga +tvw I L Sedoa +tvy I E Timor Pidgin +twa I E Twana +twb I L Western Tawbuid +twc I E Teshenawa +twd I L Twents +twe I L Tewa (Indonesia) +twf I L Northern Tiwa +twg I L Tereweng +twh I L Tai Dón +twi twi twi tw I L Twi +twl I L Tawara +twm I L Tawang Monpa +twn I L Twendi +two I L Tswapong +twp I L Ere +twq I L Tasawaq +twr I L Southwestern Tarahumara +twt I E Turiwára +twu I L Termanu +tww I L Tuwari +twx I L Tewe +twy I L Tawoyan +txa I L Tombonuo +txb I A Tokharian B +txc I E Tsetsaut +txe I L Totoli +txg I A Tangut +txh I A Thracian +txi I L Ikpeng +txm I L Tomini +txn I L West Tarangan +txo I L Toto +txq I L Tii +txr I A Tartessian +txs I L Tonsea +txt I L Citak +txu I L Kayapó +txx I L Tatana +txy I L Tanosy Malagasy +tya I L Tauya +tye I L Kyenga +tyh I L O'du +tyi I L Teke-Tsaayi +tyj I L Tai Do +tyl I L Thu Lao +tyn I L Kombai +typ I E Thaypan +tyr I L Tai Daeng +tys I L Tày Sa Pa +tyt I L Tày Tac +tyu I L Kua +tyv tyv tyv I L Tuvinian +tyx I L Teke-Tyee +tyz I L Tày +tza I L Tanzanian Sign Language +tzh I L Tzeltal +tzj I L Tz'utujil +tzm I L Central Atlas Tamazight +tzn I L Tugun +tzo I L Tzotzil +tzx I L Tabriak +uam I E Uamué +uan I L Kuan +uar I L Tairuma +uba I L Ubang +ubi I L Ubi +ubl I L Buhi'non Bikol +ubr I L Ubir +ubu I L Umbu-Ungu +uby I E Ubykh +uda I L Uda +ude I L Udihe +udg I L Muduga +udi I L Udi +udj I L Ujir +udl I L Wuzlam +udm udm udm I L Udmurt +udu I L Uduk +ues I L Kioko +ufi I L Ufim +uga uga uga I A Ugaritic +ugb I E Kuku-Ugbanh +uge I L Ughele +ugn I L Ugandan Sign Language +ugo I L Ugong +ugy I L Uruguayan Sign Language +uha I L Uhami +uhn I L Damal +uig uig uig ug I L Uighur +uis I L Uisai +uiv I L Iyive +uji I L Tanjijili +uka I L Kaburi +ukg I L Ukuriguma +ukh I L Ukhwejo +ukl I L Ukrainian Sign Language +ukp I L Ukpe-Bayobiri +ukq I L Ukwa +ukr ukr ukr uk I L Ukrainian +uks I L Urubú-Kaapor Sign Language +uku I L Ukue +ukw I L Ukwuani-Aboh-Ndoni +ula I L Fungwa +ulb I L Ulukwumi +ulc I L Ulch +ulf I L Usku +uli I L Ulithian +ulk I L Meriam +ull I L Ullatan +ulm I L Ulumanda' +uln I L Unserdeutsch +ulu I L Uma' Lung +ulw I L Ulwa +uma I L Umatilla +umb umb umb I L Umbundu +umc I A Marrucinian +umd I E Umbindhamu +umg I E Umbuygamu +umi I L Ukit +umm I L Umon +umn I L Makyan Naga +umo I E Umotína +ump I L Umpila +umr I E Umbugarla +ums I L Pendau +umu I L Munsee +una I L North Watut +und und und S S Undetermined +une I L Uneme +ung I L Ngarinyin +unk I L Enawené-Nawé +unm I E Unami +unp I L Worora +unr I L Mundari +unx I L Munda +unz I L Unde Kaili +uok I L Uokha +upi I L Umeda +upv I L Uripiv-Wala-Rano-Atchin +ura I L Urarina +urb I L Urubú-Kaapor +urc I E Urningangg +urd urd urd ur I L Urdu +ure I L Uru +urf I E Uradhi +urg I L Urigina +urh I L Urhobo +uri I L Urim +urk I L Urak Lawoi' +url I L Urali +urm I L Urapmin +urn I L Uruangnirin +uro I L Ura (Papua New Guinea) +urp I L Uru-Pa-In +urr I L Lehalurup +urt I L Urat +uru I E Urumi +urv I E Uruava +urw I L Sop +urx I L Urimo +ury I L Orya +urz I L Uru-Eu-Wau-Wau +usa I L Usarufa +ush I L Ushojo +usi I L Usui +usk I L Usaghade +usp I L Uspanteco +usu I L Uya +uta I L Otank +ute I L Ute-Southern Paiute +utp I L Amba (Solomon Islands) +utr I L Etulo +utu I L Utu +uum I L Urum +uun I L Kulon-Pazeh +uur I L Ura (Vanuatu) +uuu I L U +uve I L West Uvean +uvh I L Uri +uvl I L Lote +uwa I L Kuku-Uwanh +uya I L Doko-Uyanga +uzb uzb uzb uz M L Uzbek +uzn I L Northern Uzbek +uzs I L Southern Uzbek +vaa I L Vaagri Booli +vae I L Vale +vaf I L Vafsi +vag I L Vagla +vah I L Varhadi-Nagpuri +vai vai vai I L Vai +vaj I L Vasekela Bushman +val I L Vehes +vam I L Vanimo +van I L Valman +vao I L Vao +vap I L Vaiphei +var I L Huarijio +vas I L Vasavi +vau I L Vanuma +vav I L Varli +vay I L Wayu +vbb I L Southeast Babar +vbk I L Southwestern Bontok +vec I L Venetian +ved I L Veddah +vel I L Veluws +vem I L Vemgo-Mabas +ven ven ven ve I L Venda +veo I E Ventureño +vep I L Veps +ver I L Mom Jango +vgr I L Vaghri +vgt I L Vlaamse Gebarentaal +vic I L Virgin Islands Creole English +vid I L Vidunda +vie vie vie vi I L Vietnamese +vif I L Vili +vig I L Viemo +vil I L Vilela +vin I L Vinza +vis I L Vishavan +vit I L Viti +viv I L Iduna +vka I E Kariyarra +vki I L Ija-Zuba +vkj I L Kujarge +vkk I L Kaur +vkl I L Kulisusu +vkm I E Kamakan +vko I L Kodeoha +vkp I L Korlai Creole Portuguese +vkt I L Tenggarong Kutai Malay +vku I L Kurrama +vlp I L Valpei +vls I L Vlaams +vma I L Martuyhunira +vmb I E Mbabaram +vmc I L Juxtlahuaca Mixtec +vmd I L Mudu Koraga +vme I L East Masela +vmf I L Mainfränkisch +vmg I L Minigir +vmh I L Maraghei +vmi I E Miwa +vmj I L Ixtayutla Mixtec +vmk I L Makhuwa-Shirima +vml I E Malgana +vmm I L Mitlatongo Mixtec +vmp I L Soyaltepec Mazatec +vmq I L Soyaltepec Mixtec +vmr I L Marenje +vms I E Moksela +vmu I E Muluridyi +vmv I E Valley Maidu +vmw I L Makhuwa +vmx I L Tamazola Mixtec +vmy I L Ayautla Mazatec +vmz I L Mazatlán Mazatec +vnk I L Vano +vnm I L Vinmavis +vnp I L Vunapu +vol vol vol vo I C Volapük +vor I L Voro +vot vot vot I L Votic +vra I L Vera'a +vro I L Võro +vrs I L Varisi +vrt I L Burmbar +vsi I L Moldova Sign Language +vsl I L Venezuelan Sign Language +vsv I L Valencian Sign Language +vto I L Vitou +vum I L Vumbu +vun I L Vunjo +vut I L Vute +vwa I L Awa (China) +waa I L Walla Walla +wab I L Wab +wac I L Wasco-Wishram +wad I L Wandamen +wae I L Walser +waf I E Wakoná +wag I L Wa'ema +wah I L Watubela +wai I L Wares +waj I L Waffa +wal wal wal I L Wolaytta +wam I E Wampanoag +wan I L Wan +wao I E Wappo +wap I L Wapishana +waq I L Wageman +war war war I L Waray (Philippines) +was was was I L Washo +wat I L Kaninuwa +wau I L Waurá +wav I L Waka +waw I L Waiwai +wax I L Watam +way I L Wayana +waz I L Wampur +wba I L Warao +wbb I L Wabo +wbe I L Waritai +wbf I L Wara +wbh I L Wanda +wbi I L Vwanji +wbj I L Alagwa +wbk I L Waigali +wbl I L Wakhi +wbm I L Wa +wbp I L Warlpiri +wbq I L Waddar +wbr I L Wagdi +wbt I L Wanman +wbv I L Wajarri +wbw I L Woi +wca I L Yanomámi +wci I L Waci Gbe +wdd I L Wandji +wdg I L Wadaginam +wdj I L Wadjiginy +wdu I E Wadjigu +wea I L Wewaw +wec I L Wè Western +wed I L Wedau +weh I L Weh +wei I L Were +wem I L Weme Gbe +weo I L North Wemale +wep I L Westphalien +wer I L Weri +wes I L Cameroon Pidgin +wet I L Perai +weu I L Welaung +wew I L Wejewa +wfg I L Yafi +wga I E Wagaya +wgb I L Wagawaga +wgg I E Wangganguru +wgi I L Wahgi +wgo I L Waigeo +wgy I L Warrgamay +wha I L Manusela +whg I L North Wahgi +whk I L Wahau Kenyah +whu I L Wahau Kayan +wib I L Southern Toussian +wic I L Wichita +wie I E Wik-Epa +wif I E Wik-Keyangan +wig I L Wik-Ngathana +wih I L Wik-Me'anha +wii I L Minidien +wij I L Wik-Iiyanh +wik I L Wikalkan +wil I E Wilawila +wim I L Wik-Mungkan +win I L Ho-Chunk +wir I E Wiraféd +wit I L Wintu +wiu I L Wiru +wiv I L Muduapa +wiw I L Wirangu +wiy I E Wiyot +wja I L Waja +wji I L Warji +wka I E Kw'adza +wkb I L Kumbaran +wkd I L Wakde +wkl I L Kalanadi +wku I L Kunduvadi +wkw I E Wakawaka +wla I L Walio +wlc I L Mwali Comorian +wle I L Wolane +wlg I L Kunbarlang +wli I L Waioli +wlk I E Wailaki +wll I L Wali (Sudan) +wlm I H Middle Welsh +wln wln wln wa I L Walloon +wlo I L Wolio +wlr I L Wailapa +wls I L Wallisian +wlu I E Wuliwuli +wlv I L Wichí Lhamtés Vejoz +wlw I L Walak +wlx I L Wali (Ghana) +wly I E Waling +wma I E Mawa (Nigeria) +wmb I L Wambaya +wmc I L Wamas +wmd I L Mamaindé +wme I L Wambule +wmh I L Waima'a +wmi I E Wamin +wmm I L Maiwa (Indonesia) +wmn I E Waamwang +wmo I L Wom (Papua New Guinea) +wms I L Wambon +wmt I L Walmajarri +wmw I L Mwani +wmx I L Womo +wnb I L Wanambre +wnc I L Wantoat +wnd I E Wandarang +wne I L Waneci +wng I L Wanggom +wni I L Ndzwani Comorian +wnk I L Wanukaka +wnm I E Wanggamala +wno I L Wano +wnp I L Wanap +wnu I L Usan +woa I L Tyaraity +wob I L Wè Northern +woc I L Wogeo +wod I L Wolani +woe I L Woleaian +wof I L Gambian Wolof +wog I L Wogamusin +woi I L Kamang +wok I L Longto +wol wol wol wo I L Wolof +wom I L Wom (Nigeria) +won I L Wongo +woo I L Manombai +wor I L Woria +wos I L Hanga Hundi +wow I L Wawonii +woy I E Weyto +wpc I L Maco +wra I L Warapu +wrb I E Warluwara +wrd I L Warduji +wrg I E Warungu +wrh I E Wiradhuri +wri I E Wariyangga +wrl I L Warlmanpa +wrm I L Warumungu +wrn I L Warnang +wrp I L Waropen +wrr I L Wardaman +wrs I L Waris +wru I L Waru +wrv I L Waruna +wrw I E Gugu Warra +wrx I L Wae Rana +wry I L Merwari +wrz I E Waray (Australia) +wsa I L Warembori +wsi I L Wusi +wsk I L Waskia +wsr I L Owenia +wss I L Wasa +wsu I E Wasu +wsv I E Wotapuri-Katarqalai +wtf I L Dumpu +wti I L Berta +wtk I L Watakataui +wtm I L Mewati +wtw I L Wotu +wua I L Wikngenchera +wub I L Wunambal +wud I L Wudu +wuh I L Wutunhua +wul I L Silimo +wum I L Wumbvu +wun I L Bungu +wur I E Wurrugu +wut I L Wutung +wuu I L Wu Chinese +wuv I L Wuvulu-Aua +wux I L Wulna +wuy I L Wauyai +wwa I L Waama +wwo I L Wetamut +wwr I E Warrwa +www I L Wawa +wxa I L Waxianghua +wya I L Wyandot +wyb I L Wangaaybuwan-Ngiyambaa +wym I L Wymysorys +wyr I L Wayoró +wyy I L Western Fijian +xaa I H Andalusian Arabic +xab I L Sambe +xac I L Kachari +xad I E Adai +xae I A Aequian +xag I E Aghwan +xai I E Kaimbé +xal xal xal I L Kalmyk +xam I E /Xam +xan I L Xamtanga +xao I L Khao +xap I E Apalachee +xaq I A Aquitanian +xar I E Karami +xas I E Kamas +xat I L Katawixi +xau I L Kauwera +xav I L Xavánte +xaw I L Kawaiisu +xay I L Kayan Mahakam +xba I E Kamba (Brazil) +xbb I E Lower Burdekin +xbc I A Bactrian +xbi I L Kombio +xbm I H Middle Breton +xbn I E Kenaboi +xbo I E Bolgarian +xbr I L Kambera +xbw I E Kambiwá +xbx I E Kabixí +xcb I E Cumbric +xcc I A Camunic +xce I A Celtiberian +xcg I A Cisalpine Gaulish +xch I E Chemakum +xcl I H Classical Armenian +xcm I E Comecrudo +xcn I E Cotoname +xco I A Chorasmian +xcr I A Carian +xct I H Classical Tibetan +xcu I E Curonian +xcv I E Chuvantsy +xcw I E Coahuilteco +xcy I E Cayuse +xdc I A Dacian +xdm I A Edomite +xdy I L Malayic Dayak +xeb I A Eblan +xed I L Hdi +xeg I E //Xegwi +xel I L Kelo +xem I L Kembayan +xep I A Epi-Olmec +xer I L Xerénte +xes I L Kesawai +xet I L Xetá +xeu I L Keoru-Ahia +xfa I A Faliscan +xga I A Galatian +xgf I E Gabrielino-Fernandeño +xgl I E Galindan +xgr I E Garza +xha I A Harami +xhc I E Hunnic +xhd I A Hadrami +xhe I L Khetrani +xho xho xho xh I L Xhosa +xhr I A Hernican +xht I A Hattic +xhu I A Hurrian +xhv I L Khua +xia I L Xiandao +xib I A Iberian +xii I L Xiri +xil I A Illyrian +xin I E Xinca +xip I E Xipináwa +xir I E Xiriâna +xiv I A Indus Valley Language +xiy I L Xipaya +xka I L Kalkoti +xkb I L Northern Nago +xkc I L Kho'ini +xkd I L Mendalam Kayan +xke I L Kereho +xkf I L Khengkha +xkg I L Kagoro +xkh I L Karahawyana +xki I L Kenyan Sign Language +xkj I L Kajali +xkk I L Kaco' +xkl I L Mainstream Kenyah +xkn I L Kayan River Kayan +xko I L Kiorr +xkp I L Kabatei +xkq I L Koroni +xkr I E Xakriabá +xks I L Kumbewaha +xkt I L Kantosi +xku I L Kaamba +xkv I L Kgalagadi +xkw I L Kembra +xkx I L Karore +xky I L Uma' Lasan +xkz I L Kurtokha +xla I L Kamula +xlb I E Loup B +xlc I A Lycian +xld I A Lydian +xle I A Lemnian +xlg I A Ligurian (Ancient) +xli I A Liburnian +xln I A Alanic +xlo I E Loup A +xlp I A Lepontic +xls I A Lusitanian +xlu I A Cuneiform Luwian +xly I A Elymian +xma I L Mushungulu +xmb I L Mbonga +xmc I L Makhuwa-Marrevone +xmd I L Mbedam +xme I A Median +xmf I L Mingrelian +xmg I L Mengaka +xmh I L Kuku-Muminh +xmj I L Majera +xmk I A Ancient Macedonian +xml I L Malaysian Sign Language +xmm I L Manado Malay +xmn I H Manichaean Middle Persian +xmo I L Morerebi +xmp I E Kuku-Mu'inh +xmq I E Kuku-Mangk +xmr I A Meroitic +xms I L Moroccan Sign Language +xmt I L Matbat +xmu I E Kamu +xmv I L Antankarana Malagasy +xmw I L Tsimihety Malagasy +xmx I L Maden +xmy I L Mayaguduna +xmz I L Mori Bawah +xna I A Ancient North Arabian +xnb I L Kanakanabu +xng I H Middle Mongolian +xnh I L Kuanhua +xnn I L Northern Kankanay +xno I H Anglo-Norman +xnr I L Kangri +xns I L Kanashi +xnt I E Narragansett +xoc I E O'chi'chi' +xod I L Kokoda +xog I L Soga +xoi I L Kominimung +xok I L Xokleng +xom I L Komo (Sudan) +xon I L Konkomba +xoo I E Xukurú +xop I L Kopar +xor I L Korubo +xow I L Kowaki +xpc I E Pecheneg +xpe I L Liberia Kpelle +xpg I A Phrygian +xpi I E Pictish +xpk I L Kulina Pano +xpm I E Pumpokol +xpn I E Kapinawá +xpo I E Pochutec +xpp I E Puyo-Paekche +xpq I E Mohegan-Pequot +xpr I A Parthian +xps I E Pisidian +xpu I A Punic +xpy I E Puyo +xqa I H Karakhanid +xqt I A Qatabanian +xra I L Krahô +xrb I L Eastern Karaboro +xre I L Kreye +xri I L Krikati-Timbira +xrm I E Armazic +xrn I E Arin +xrr I A Raetic +xrt I E Aranama-Tamique +xru I L Marriammu +xrw I L Karawa +xsa I A Sabaean +xsb I L Tinà Sambal +xsc I A Scythian +xsd I A Sidetic +xse I L Sempan +xsh I L Shamang +xsi I L Sio +xsj I L Subi +xsl I L South Slavey +xsm I L Kasem +xsn I L Sanga (Nigeria) +xso I E Solano +xsp I L Silopi +xsq I L Makhuwa-Saka +xsr I L Sherpa +xss I E Assan +xsu I L Sanumá +xsv I E Sudovian +xsy I L Saisiyat +xta I L Alcozauca Mixtec +xtb I L Chazumba Mixtec +xtc I L Katcha-Kadugli-Miri +xtd I L Diuxi-Tilantongo Mixtec +xte I L Ketengban +xtg I A Transalpine Gaulish +xti I L Sinicahua Mixtec +xtj I L San Juan Teita Mixtec +xtl I L Tijaltepec Mixtec +xtm I L Magdalena Peñasco Mixtec +xtn I L Northern Tlaxiaco Mixtec +xto I A Tokharian A +xtp I L San Miguel Piedras Mixtec +xtq I H Tumshuqese +xtr I A Early Tripuri +xts I L Sindihui Mixtec +xtt I L Tacahua Mixtec +xtu I L Cuyamecalco Mixtec +xtw I L Tawandê +xty I L Yoloxochitl Mixtec +xtz I E Tasmanian +xua I L Alu Kurumba +xub I L Betta Kurumba +xug I L Kunigami +xuj I L Jennu Kurumba +xum I A Umbrian +xuo I L Kuo +xup I E Upper Umpqua +xur I A Urartian +xut I E Kuthant +xuu I L Kxoe +xve I A Venetic +xvi I L Kamviri +xvn I A Vandalic +xvo I A Volscian +xvs I A Vestinian +xwa I L Kwaza +xwc I E Woccon +xwe I L Xwela Gbe +xwg I L Kwegu +xwl I L Western Xwla Gbe +xwo I E Written Oirat +xwr I L Kwerba Mamberamo +xxb I E Boro (Ghana) +xxk I L Ke'o +xxr I E Koropó +xxt I E Tambora +xyl I E Yalakalore +xzh I A Zhang-Zhung +xzm I E Zemgalian +xzp I H Ancient Zapotec +yaa I L Yaminahua +yab I L Yuhup +yac I L Pass Valley Yali +yad I L Yagua +yae I L Pumé +yaf I L Yaka (Democratic Republic of Congo) +yag I L Yámana +yah I L Yazgulyam +yai I L Yagnobi +yaj I L Banda-Yangere +yak I L Yakama +yal I L Yalunka +yam I L Yamba +yan I L Mayangna +yao yao yao I L Yao +yap yap yap I L Yapese +yaq I L Yaqui +yar I L Yabarana +yas I L Nugunu (Cameroon) +yat I L Yambeta +yau I L Yuwana +yav I L Yangben +yaw I L Yawalapití +yax I L Yauma +yay I L Agwagwune +yaz I L Lokaa +yba I L Yala +ybb I L Yemba +ybd I L Yangbye +ybe I L West Yugur +ybh I L Yakha +ybi I L Yamphu +ybj I L Hasha +ybk I L Bokha +ybl I L Yukuben +ybm I L Yaben +ybn I E Yabaâna +ybo I L Yabong +ybx I L Yawiyo +yby I L Yaweyuha +ych I L Chesu +ycl I L Lolopo +ycn I L Yucuna +ycp I L Chepya +ydd I L Eastern Yiddish +yde I L Yangum Dey +ydg I L Yidgha +ydk I L Yoidik +yds I L Yiddish Sign Language +yea I L Ravula +yec I L Yeniche +yee I L Yimas +yei I E Yeni +yej I L Yevanic +yel I L Yela +yen I L Yendang +yer I L Tarok +yes I L Yeskwa +yet I L Yetfa +yeu I L Yerukula +yev I L Yapunda +yey I L Yeyi +ygl I L Yangum Gel +ygm I L Yagomi +ygp I L Gepo +ygr I L Yagaria +ygw I L Yagwoia +yha I L Baha Buyang +yhd I L Judeo-Iraqi Arabic +yhl I L Hlepho Phowa +yia I L Yinggarda +yid yid yid yi M L Yiddish +yif I L Ache +yig I L Wusa Nasu +yih I L Western Yiddish +yii I L Yidiny +yij I L Yindjibarndi +yik I L Dongshanba Lalo +yil I E Yindjilandji +yim I L Yimchungru Naga +yin I L Yinchia +yip I L Pholo +yiq I L Miqie +yir I L North Awyu +yis I L Yis +yit I L Eastern Lalu +yiu I L Awu +yiv I L Northern Nisu +yix I L Axi Yi +yiy I L Yir Yoront +yiz I L Azhe +yka I L Yakan +ykg I L Northern Yukaghir +yki I L Yoke +ykk I L Yakaikeke +ykl I L Khlula +ykm I L Kap +yko I L Yasa +ykr I L Yekora +ykt I L Kathu +yky I L Yakoma +yla I L Yaul +ylb I L Yaleba +yle I L Yele +ylg I L Yelogu +yli I L Angguruk Yali +yll I L Yil +ylm I L Limi +yln I L Langnian Buyang +ylo I L Naluo Yi +ylr I E Yalarnnga +ylu I L Aribwaung +yly I L Nyâlayu +yma I L Yamphe +ymb I L Yambes +ymc I L Southern Muji +ymd I L Muda +yme I E Yameo +ymg I L Yamongeri +ymh I L Mili +ymi I L Moji +ymk I L Makwe +yml I L Iamalele +ymm I L Maay +ymn I L Yamna +ymo I L Yangum Mon +ymp I L Yamap +ymq I L Qila Muji +ymr I L Malasar +yms I A Mysian +ymt I E Mator-Taygi-Karagas +ymx I L Northern Muji +ymz I L Muzi +yna I L Aluo +ynd I E Yandruwandha +yne I L Lang'e +yng I L Yango +ynh I L Yangho +ynk I L Naukan Yupik +ynl I L Yangulam +ynn I E Yana +yno I L Yong +yns I L Yansi +ynu I E Yahuna +yob I E Yoba +yog I L Yogad +yoi I L Yonaguni +yok I L Yokuts +yol I E Yola +yom I L Yombe +yon I L Yonggom +yor yor yor yo I L Yoruba +yos I L Yos +yox I L Yoron +yoy I L Yoy +ypa I L Phala +ypb I L Labo Phowa +ypg I L Phola +yph I L Phupha +ypm I L Phuma +ypn I L Ani Phowa +ypo I L Alo Phola +ypp I L Phupa +ypz I L Phuza +yra I L Yerakai +yrb I L Yareba +yre I L Yaouré +yri I L Yarí +yrk I L Nenets +yrl I L Nhengatu +yrn I L Yerong +yrs I L Yarsun +yrw I L Yarawata +ysc I E Yassic +ysd I L Samatao +ysl I L Yugoslavian Sign Language +ysn I L Sani +yso I L Nisi (China) +ysp I L Southern Lolopo +ysr I E Sirenik Yupik +yss I L Yessan-Mayo +ysy I L Sanie +yta I L Talu +ytl I L Tanglang +ytp I L Thopho +ytw I L Yout Wam +yua I L Yucateco +yub I E Yugambal +yuc I L Yuchi +yud I L Judeo-Tripolitanian Arabic +yue I L Yue Chinese +yuf I L Havasupai-Walapai-Yavapai +yug I E Yug +yui I L Yurutí +yuj I L Karkar-Yuri +yuk I E Yuki +yul I L Yulu +yum I L Quechan +yun I L Bena (Nigeria) +yup I L Yukpa +yuq I L Yuqui +yur I L Yurok +yut I L Yopno +yuu I L Yugh +yuw I L Yau (Morobe Province) +yux I L Southern Yukaghir +yuy I L East Yugur +yuz I L Yuracare +yva I L Yawa +yvt I E Yavitero +ywa I L Kalou +ywl I L Western Lalu +ywn I L Yawanawa +ywq I L Wuding-Luquan Yi +ywr I L Yawuru +ywt I L Xishanba Lalo +ywu I L Wumeng Nasu +yww I E Yawarawarga +yyu I L Yau (Sandaun Province) +yyz I L Ayizi +yzg I L E'ma Buyang +yzk I L Zokhuo +zaa I L Sierra de Juárez Zapotec +zab I L San Juan Guelavía Zapotec +zac I L Ocotlán Zapotec +zad I L Cajonos Zapotec +zae I L Yareni Zapotec +zaf I L Ayoquesco Zapotec +zag I L Zaghawa +zah I L Zangwal +zai I L Isthmus Zapotec +zaj I L Zaramo +zak I L Zanaki +zal I L Zauzou +zam I L Miahuatlán Zapotec +zao I L Ozolotepec Zapotec +zap zap zap M L Zapotec +zaq I L Aloápam Zapotec +zar I L Rincón Zapotec +zas I L Santo Domingo Albarradas Zapotec +zat I L Tabaa Zapotec +zau I L Zangskari +zav I L Yatzachi Zapotec +zaw I L Mitla Zapotec +zax I L Xadani Zapotec +zay I L Zayse-Zergulla +zaz I L Zari +zbc I L Central Berawan +zbe I L East Berawan +zbl zbl zbl I C Blissymbols +zbt I L Batui +zbw I L West Berawan +zca I L Coatecas Altas Zapotec +zch I L Central Hongshuihe Zhuang +zdj I L Ngazidja Comorian +zea I L Zeeuws +zeg I L Zenag +zeh I L Eastern Hongshuihe Zhuang +zen zen zen I L Zenaga +zga I L Kinga +zgb I L Guibei Zhuang +zgm I L Minz Zhuang +zgn I L Guibian Zhuang +zgr I L Magori +zha zha zha za M L Zhuang +zhb I L Zhaba +zhd I L Dai Zhuang +zhi I L Zhire +zhn I L Nong Zhuang +zho chi zho zh M L Chinese +zhw I L Zhoa +zia I L Zia +zib I L Zimbabwe Sign Language +zik I L Zimakani +zim I L Mesme +zin I L Zinza +zir I E Ziriya +ziw I L Zigula +ziz I L Zizilivakan +zka I L Kaimbulawa +zkb I E Koibal +zkg I E Koguryo +zkh I E Khorezmian +zkk I E Karankawa +zko I E Kott +zkp I E São Paulo Kaingáng +zkr I L Zakhring +zkt I E Kitan +zku I E Kaurna +zkv I E Krevinian +zkz I E Khazar +zlj I L Liujiang Zhuang +zlm I L Malay (individual language) +zln I L Lianshan Zhuang +zlq I L Liuqian Zhuang +zma I L Manda (Australia) +zmb I L Zimba +zmc I E Margany +zmd I L Maridan +zme I E Mangerr +zmf I L Mfinu +zmg I L Marti Ke +zmh I E Makolkol +zmi I L Negeri Sembilan Malay +zmj I L Maridjabin +zmk I E Mandandanyi +zml I L Madngele +zmm I L Marimanindji +zmn I L Mbangwe +zmo I L Molo +zmp I L Mpuono +zmq I L Mituku +zmr I L Maranunggu +zms I L Mbesa +zmt I L Maringarr +zmu I E Muruwari +zmv I E Mbariman-Gudhinma +zmw I L Mbo (Democratic Republic of Congo) +zmx I L Bomitaba +zmy I L Mariyedi +zmz I L Mbandja +zna I L Zan Gula +zne I L Zande (individual language) +zng I L Mang +znk I E Manangkari +zns I L Mangas +zoc I L Copainalá Zoque +zoh I L Chimalapa Zoque +zom I L Zou +zoo I L Asunción Mixtepec Zapotec +zoq I L Tabasco Zoque +zor I L Rayón Zoque +zos I L Francisco León Zoque +zpa I L Lachiguiri Zapotec +zpb I L Yautepec Zapotec +zpc I L Choapan Zapotec +zpd I L Southeastern Ixtlán Zapotec +zpe I L Petapa Zapotec +zpf I L San Pedro Quiatoni Zapotec +zpg I L Guevea De Humboldt Zapotec +zph I L Totomachapan Zapotec +zpi I L Santa María Quiegolani Zapotec +zpj I L Quiavicuzas Zapotec +zpk I L Tlacolulita Zapotec +zpl I L Lachixío Zapotec +zpm I L Mixtepec Zapotec +zpn I L Santa Inés Yatzechi Zapotec +zpo I L Amatlán Zapotec +zpp I L El Alto Zapotec +zpq I L Zoogocho Zapotec +zpr I L Santiago Xanica Zapotec +zps I L Coatlán Zapotec +zpt I L San Vicente Coatlán Zapotec +zpu I L Yalálag Zapotec +zpv I L Chichicapan Zapotec +zpw I L Zaniza Zapotec +zpx I L San Baltazar Loxicha Zapotec +zpy I L Mazaltepec Zapotec +zpz I L Texmelucan Zapotec +zqe I L Qiubei Zhuang +zra I E Kara (Korea) +zrg I L Mirgan +zrn I L Zerenkel +zro I L Záparo +zrp I E Zarphatic +zrs I L Mairasi +zsa I L Sarasira +zsk I A Kaskean +zsl I L Zambian Sign Language +zsm I L Standard Malay +zsr I L Southern Rincon Zapotec +zsu I L Sukurum +zte I L Elotepec Zapotec +ztg I L Xanaguía Zapotec +ztl I L Lapaguía-Guivini Zapotec +ztm I L San Agustín Mixtepec Zapotec +ztn I L Santa Catarina Albarradas Zapotec +ztp I L Loxicha Zapotec +ztq I L Quioquitani-Quierí Zapotec +zts I L Tilquiapan Zapotec +ztt I L Tejalapan Zapotec +ztu I L Güilá Zapotec +ztx I L Zaachila Zapotec +zty I L Yatee Zapotec +zua I L Zeem +zuh I L Tokano +zul zul zul zu I L Zulu +zum I L Kumzari +zun zun zun I L Zuni +zuy I L Zumaya +zwa I L Zay +zxx zxx zxx S S No linguistic content +zyb I L Yongbei Zhuang +zyg I L Yang Zhuang +zyj I L Youjiang Zhuang +zyn I L Yongnan Zhuang +zyp I L Zyphe +zza zza zza M L Zaza +zzj I L Zuojiang Zhuang \ No newline at end of file diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/harvester.py b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/harvester.py new file mode 100644 index 000000000000..ebcbdd416e4e --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/harvester.py @@ -0,0 +1,336 @@ +# -*- coding: utf-8 -*- +""" + harvester.py + ~~~~~~~~~~~~ + + Basic OAI-PMH harvesting utilities. + + + :copyright: Copyright 2011 Mathias Loesch. +""" + +import time +from time import sleep +import hashlib +import pickle +import re + +from urllib.request import Request, urlopen +from urllib.error import URLError +from urllib.parse import urlencode + +from functools import wraps + +# from collections import OrderedDict +from oval import __version__ as ovalversion +from lxml import etree + +OAI = '{http://www.openarchives.org/OAI/%s/}' + +DC_NAMESPACE = "http://purl.org/dc/elements/1.1/" +DC = '{%s}' % DC_NAMESPACE + +CACHE = {} # OrderedDict() + +# Caching + + +def is_obsolete(entry, duration): + return time.time() - entry['time'] > duration + + +def compute_key(function, args, kw): + key = pickle.dumps((function.func_name, args, kw)) + return hashlib.sha1(key).hexdigest() + + +def memoize(duration=30, max_length=10): + """Donald Michie's memo function for caching.""" + def _memoize(function): + @wraps(function) + def __memoize(*args, **kw): + key = compute_key(function, args, kw) + if len(CACHE) > max_length: + # Pop the oldest item from the cache + CACHE.popitem(last=False) + # do we have a response for the request? + if (key in CACHE and not is_obsolete(CACHE[key], duration)): + return CACHE[key]['value'] + # new request + result = function(*args, **kw) + CACHE[key] = { + 'value': result, + 'time': time.time() + } + return result + return __memoize + return _memoize + + +def normalize_params(params): + """Clean parameters in accordance with OAI-PMH. + + Explanation: OAI-PMH requires that the resumptionToken parameter be the + exclusive argument. + + :param params: The HTTP parameters for a request. + """ + if params.get('resumptionToken') is not None: + # metadataPrefix/from/until not allowed if resumptionToken -> remove + try: + del params['metadataPrefix'] + except KeyError: + pass + try: + del params['_from'] + except KeyError: + pass + try: + del params['until'] + except KeyError: + pass + # from is a reserved word in Python; use _from instead + if params.get("_from") is not None: + params['from'] = params['_from'] + del params['_from'] + nparams = {} + for param in params: + if params[param] is not None: + nparams[param] = params[param] + return nparams + + +# @memoize() +def fetch_data(base_url, method, params, retries=5, timeout=None): + """Perform actual request to the OAI interface and return the data + as XML string. + + :param base_url: The endpoint of the OAI-PMH interface. + :param method: The HTTP method to be used for the requests. + :param params: The GET/POST variables. + :param retries: How many retries should be performed on responses + with status code 503. + :param timeout: The timeout in seconds for the requests. + """ + data = urlencode(params) + if method == 'POST': + request = Request(base_url) + request.add_data(data) + elif method == 'GET': + request = Request(base_url + data) + request.add_header('User-Agent', 'oval/%s' % ovalversion) + for _ in range(retries): + try: + response = urlopen(request, None, timeout=timeout) + return response.read() + except URLError as e: + if hasattr(e, 'reason'): + raise + elif hasattr(e, 'code'): + if e.code == 503: + try: + wait_time = int(e.hdrs.get('Retry-After')) + except TypeError: + wait_time = None + if wait_time is None: + sleep(100) + else: + sleep(wait_time) + else: + raise + except Exception: + raise + + +def configure_request(base_url, method='POST', timeout=None): + """Closure to preconfigure the static request params. Return + custom request_oai function. + + :param base_url: The endpoint of the OAI-PMH interface. + :param method: The HTTP method to be used for the requests. + :param timeout: The timeout in seconds for the requests. + """ + def request_oai(**kw): + """Perform OAI request to base_url. Return parsed response.""" + params = kw + params = normalize_params(params) + response = fetch_data(base_url, method, params, timeout=timeout) + return etree.XML(response) + return request_oai + + +def get_protocol_version(base_url, method): + """Determine the version of the OAI-PMH spoken by the server. + + :param base_url: The URL of the OAI-PMH endpoint. + :param method: The HTTP method for requests to the endpoint. + """ + pversion_re = re.compile(r'(.*?)') + try: + response = fetch_data(base_url, method, {'verb': 'Identify'}) + except Exception: + return None + m = pversion_re.search(response) + if m is not None: + version = m.group(1) + return version + + +def get_granularity(base_url, method): + granularity_re = re.compile(r'(.*?)') + try: + response = fetch_data(base_url, method, {'verb': 'Identify'}) + except Exception: + return None + m = granularity_re.search(response) + if m is not None: + granularity = m.group(1) + if granularity == 'YYYY-MM-DDThh:mm:ssZ': + return 'full' + elif granularity == 'YYYY-MM-DD': + return 'day' + + +def check_HTTP_methods(base_url): + """Determine the HTTP methods supported by the server. Return supported + methods in list or []. + + :param base_url: The endpoint of the OAI-PMH interface. + """ + methods = [] + for method in ['GET', 'POST']: + response = None + try: + response = fetch_data(base_url, method, {'verb': 'Identify'}) + except Exception: + pass + if response and "badVerb" not in response: + methods.append(method) + return methods + + +def get_repository_information(base_url, method): + name_re = re.compile(r'(.*?)') + email_re = re.compile(r'(.*?)') + try: + response = fetch_data(base_url, method, {'verb': 'Identify'}) + except Exception: + return ('[ERROR: Could not fetch Identify response]', + '[ERROR: Could not fetch Identify response]') + name_match = name_re.search(response) + if name_match is None: + name = '[Could not find name in Identify.]' + else: + name = name_match.group(1).decode('utf8') + email_match = email_re.search(response) + if email_match is None: + email = '[Could not find email in Identify.]' + else: + email = email_match.group(1).decode('utf8') + return name, email + + +def configure_record_iterator( + base_url, protocol_version, HTTPmethod, timeout=None +): + """Class factory for record iterators. + + :param base_url: The endpoint of the OAI-PMH interface. + :param protocol_version: The version of the OAI-PMH interface. + :param HTTPmethod: The HTTP method supported by the server. + :param timeout: Optional timeout for the HTTP requests + sent to the server. + """ + class RecordIterator(object): + """Iterator over OAI records/identifiers transparently aggregated via + OAI-PMH. + + :param verb: The OAI-PMH verb for the items to iterate over. + :param metadataPrefix: The OAI-PMH metadataPrefix attribute. + :param _from: Optional date offset. + :param until: Optional date limit. + :param deleted: Flag specifiying whether deleted records should be + included + """ + def __init__( + self, verb, metadataPrefix, _from=None, until=None, deleted=False + ): + self.base_url = base_url + self.verb = verb + self.metadataPrefix = metadataPrefix + self._from = _from + self.until = until + self.deleted = deleted # include deleted records? + self.protocol_version = protocol_version + self.HTTPmethod = HTTPmethod + self.timeout = timeout + + # OAI namespace + self.oai_namespace = OAI % self.protocol_version + # record list + self.record_list = [] + # resumptionToken + self.token = None + if self.verb == 'ListRecords': + self.element = 'record' + elif self.verb == 'ListIdentifiers': + self.element = 'header' + # Configure request method + self.request_oai = configure_request( + self.base_url, self.HTTPmethod, self.timeout) + # Fetch the initial portion + response = self.request_oai(verb=self.verb, + metadataPrefix=self.metadataPrefix, + _from=self._from, until=self.until, + resumptionToken=self.token) + self.record_list = self._get_records(response) + self.token = self._get_resumption_token(response) + + def __iter__(self): + return self + + def _is_not_deleted(self, record): + if self.element == 'record': + header = record.find('.//' + self.oai_namespace + 'header') + elif self.element == 'header': + # work on header element directly in case of ListId + header = record + if header.attrib.get('status') == 'deleted': + return False + else: + return True + + def _get_resumption_token(self, xml_tree): + token = xml_tree.find( + './/' + self.oai_namespace + 'resumptionToken') + if token is None: + return None + else: + return token.text + + def _get_records(self, xml_tree): + records = xml_tree.findall( + './/' + self.oai_namespace + self.element) + if self.deleted is False: + records = filter(self._is_not_deleted, records) + return records + + def _next_batch(self): + while self.record_list == []: + response = self.request_oai(verb=self.verb, + metadataPrefix=self.metadataPrefix, + _from=self._from, until=self.until, + resumptionToken=self.token) + self.record_list = self._get_records(response) + self.token = self._get_resumption_token(response) + if self.record_list == [] and self.token is None: + raise StopIteration + + def next(self): + if (len(self.record_list) == 0 and self.token is None): + raise StopIteration + elif len(self.record_list) == 0: + self._next_batch() + current_record = self.record_list.pop() + return current_record + return RecordIterator diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/validator.py b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/validator.py new file mode 100644 index 000000000000..dfbbe2f1eda5 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/validator.py @@ -0,0 +1,789 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python + +""" + The contents of this file are subject to the license and copyright + detailed in the LICENSE and NOTICE files at the root of the source + tree and available online at + + http://www.dspace.org/license/ +""" + +import random +import urllib.request +import urllib.error +from urllib.parse import urlencode, urlparse +from urllib.request import urlopen +import re +from datetime import datetime +from dateutil import parser as dateparser + +from lxml import etree +from lxml.etree import XMLSyntaxError +from lxml.etree import DocumentInvalid, XMLSchemaParseError + +from functools import reduce + +from oval.harvester import configure_record_iterator, configure_request, \ + get_protocol_version, check_HTTP_methods, \ + get_repository_information, get_granularity # , fetch_data + +from oval import ISO_639_3_CODES, ISO_639_2B_CODES +from oval import ISO_639_2T_CODES, ISO_639_1_CODES + +OAI_NAMESPACE = "http://www.openarchives.org/OAI/%s/" + +DC_NAMESPACE = "http://purl.org/dc/elements/1.1/" +DC = '{%s}' % DC_NAMESPACE + +XS = '{http://www.w3.org/2001/XMLSchema}' + +LOOKUP_URL = "http://129.70.12.31/lookup?" + +# Minimal Dublin Core elements according to DRIVER and DINI +MINIMAL_DC_SET = set([ + 'identifier', + 'title', + 'date', + 'type', + 'creator']) + +# Protocol Version Scheme +VERSION_PATTERN = re.compile(r'(.*?)') + +# Date schemes according to ISO 8601 (increasing granularity) +DC_DATE_YEAR = re.compile(r'^\d{4}$') +DC_DATE_MONTH = re.compile(r'^\d{4}-\d{2}$') +DC_DATE_DAY = re.compile(r'^\d{4}-\d{2}-\d{2}$') +DC_DATE_FULL = re.compile( + r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}([+-]\d{2}:\d{2}|Z)$') + + +SCHEMA_TEMPLATE = """ + +""" + + +def is_double_encoded(string): + """Check if a unicode string is doubly encoded in UTF8. Warning: this + is a hacky heuristic. + + :param string: The string whose encoding is to be verified. + """ + try: + cleaned = string.encode('raw_unicode_escape').decode('utf8') + except UnicodeDecodeError: + return False + if '\\u' in cleaned: + return False + return cleaned != string + + +def normalize_base_url(url): + """Ensure a clean OAI-PMH endpoint without parameters ending with '?'. + + :param url: The URL to the OAI-PMH endpoint. + """ + url = url.strip() + if '?verb=' in url: + url = url[:url.index('verb=')] + elif url.endswith('?'): + pass + else: + url = url + '?' + return url + + +def draw_sample(iterator, size): + """Get a sample of iterable items from a RecordIterator instance. + + :param iterator: Instance of RecordIterator. + :size: Desired sample size. + """ + items = [] + for item in iterator: + items.append(item) + if len(items) == size: + break + return items + + +class Validator(object): + """OAI-PMH Validator + + This object is the core of OVAL and serves as its central + interface. It is instantiated per repository with the URL to + the OAI-PMH endpoint:: + + validator = Validator('http://eprints.rclis.org/dspace-oai/request') + + Note that the validation methods do not return anything but store + their results in the :attr:`results` attribute:: + + elis_validator.validate_XML('ListRecords') + elis_validator.results + {'HTTPMethod': ('ok', 'Server supports both GET and POST requests.'), + 'ListRecordsXML': + ('ok', 'ListRecords response well-formed and valid.'), + 'ProtocolVersion': ('ok', 'OAI-PMH version is 2.0')} + + + :param base_url: The OAI-PMH endpoint of the validated repository. + :param timeout: + Optional timeout in seconds for all requests to the server. + """ + + def __init__(self, base_url, timeout=10): + super(Validator, self).__init__() + + self.base_url = normalize_base_url(base_url) + self.timeout = timeout + self.results = {} + + # HTTP-Method + supported_methods = check_HTTP_methods(self.base_url) + if len(supported_methods) == 2: + message = 'Server supports both GET and POST requests.' + self.results['HTTPMethod'] = ('ok', message) + self.method = 'POST' + elif len(supported_methods) == 1: + supported_method = supported_methods[0] + message = 'Server accepts only %s requests.' % supported_method + self.results['HTTPMethod'] = ('error', message) + self.method = supported_method + else: + message = ('Could not determine supported HTTP methods. ' + 'Falling back to GET.') + self.results['HTTPMethod'] = ('warning', message) + self.method = 'GET' + + self.protocol_version = get_protocol_version( + self.base_url, self.method) + if self.protocol_version is None: + message = 'Could not determine OAI-PMH protocol version; assuming 2.0' + self.results['ProtocolVersion'] = ('warning', message) + self.protocol_version = '2.0' + elif self.protocol_version == '1.0' or self.protocol_version == '1.1': + message = 'OAI-PMH version %s is deprecated. Consider updating to 2.0.' % self.protocol_version + self.results['ProtocolVersion'] = ('recommendation', message) + elif self.protocol_version == '2.0': + message = 'OAI-PMH version is 2.0' + self.results['ProtocolVersion'] = ('ok', message) + else: + message = 'Undefined OAI-PMH protocol version: %s Assuming 2.0' % self.protocol_version + self.results['ProtocolVersion'] = ('error', message) + self.protocol_version = '2.0' + + # Preconfigure RecordIterator class for this repo + self.RecordIterator = configure_record_iterator(self.base_url, + self.protocol_version, self.method, self.timeout) + self.oai_namespace = OAI_NAMESPACE % self.protocol_version + self.oai = "{%s}" % self.oai_namespace + + # General Repository Information + self.repository_name, self.admin_email = get_repository_information( + self.base_url, + self.method) + self.granularity = get_granularity(self.base_url, self.method) + if self.granularity is None: + # Fall back to day granularity in case it could not be determined + self.granularity = 'day' + self.request_oai = configure_request( + self.base_url, self.method, timeout=self.timeout) + + def indexed_in_BASE(self): + """Check if the repository is indexed in BASE. This method calls an external + web service at http://129.70.12.31/lookup that provides this information. + """ + # Remove '?' from end of base_url + params = {'basic_url': self.base_url[:-1]} + data = urlencode(params) + result = urllib.request.urlopen(LOOKUP_URL + data) + result_tree = etree.parse(result) + indexed = result_tree.getroot() + timestamp = indexed.attrib['timestamp'] + if indexed.text == 'True': + message = "Repository content is indexed by BASE (information as of: %s)" % timestamp + collection = indexed.attrib.get('collection') + if collection: + message += """
See all documents of this repository in BASE""" % collection + else: + message = "Repository content is currently not indexed by BASE (information as of: %s)" % timestamp + self.results['BASEIndex'] = ('info', message) + + def check_identify_base_url(self): + """Compare the field baseURL in Identify response with self.base_url. + Some servers redirect requests to new endpoints. + """ + try: + response = urlopen(self.base_url) + except Exception as exc: + message = "Could not compare basic URLs: %s" % str(exc) + self.results['BaseURLMatch'] = ('unverified', message) + return + if urlparse(response.url).netloc != urlparse(self.base_url).netloc: + message = "Requests seem to be redirected to: %s" % response.url + self.results["BaseURLMatch"] = ("warning", message) + + def validate_XML(self, verb, metadataPrefix='oai_dc', identifier=None): + """Check if XML returned for OAI-PMH verb is well-formed and valid. + + + :param verb: Any valid OAI-PMH verb. + :param metadataPrefix: Any metadataPrefix supported by the repository. + """ + try: + if verb in ('Identify', 'ListSets', 'ListMetadataFormats'): + tree = self.request_oai(verb=verb) + + elif verb in ('ListRecords', 'ListIdentifiers', 'GetRecord'): + tree = self.request_oai( + verb=verb, metadataPrefix=metadataPrefix, + identifier=identifier) + except XMLSyntaxError as exc: + message = '%s response is not well-formed: %s' % ( + verb, str(exc)) + self.results['%sXML' % verb] = ('error', message) + return + except Exception as exc: + message = 'XML response of %s could not be validated: %s' % (verb, + str(exc)) + self.results['%sXML' % verb] = ('unverified', message) + return + try: + xml_string = etree.tounicode(tree) + schema_locs = set(re.findall( + r'schemaLocation="(.*?)"', xml_string, re.DOTALL)) + schema_tree = etree.XML(SCHEMA_TEMPLATE) + for s in set(schema_locs): + ns_locs_raw = s.split() + try: + ns_locs = [(ns_locs_raw[i], ns_locs_raw[i + 1]) for i in range(0, len(ns_locs_raw), 2)] + except IndexError: + ns_locs = [] + for (ns, loc) in ns_locs: + xs_import = etree.Element(XS + "import") + xs_import.attrib['namespace'] = ns.strip() + xs_import.attrib['schemaLocation'] = loc.strip() + schema_tree.append(xs_import) + schema = etree.XMLSchema(schema_tree) + schema.assertValid(tree) + self.results['%sXML' % verb] = ( + 'ok', '%s response well-formed and valid.' % verb) + except (DocumentInvalid, XMLSchemaParseError) as exc: + message = "%s response well-formed but invalid: %s" % ( + verb, str(exc)) + self.results['%sXML' % verb] = ('error', message) + + def reasonable_batch_size(self, verb, metadataPrefix='oai_dc', + min_batch_size=100, max_batch_size=500): + """Check if a reasonable number of data records is returned for a + ListRecords/ListIdentifiers request. Default values are set according + to the DRIVER guidelines. + + :param verb: The OAI-PMH verb. + :param metadataPrefix: Optional OAI-PMH metadataPrefix. + :param min_batch_size: The minimal batch size of items to be returned. + :param max_batch_size: The maximal batch size of items to be returned. + """ + try: + riter = self.RecordIterator(verb, metadataPrefix, deleted=True) + except Exception as exc: + message = "%s batch size could not be checked: %s" % ( + verb, str(exc)) + self.results['%sBatch' % verb] = ('unverified', message) + return + # resumptionToken found? (= are there multiple batches?) + if riter.token is None: + message = ('%s batch size could not be checked: Only one batch.' % + verb) + self.results['%sBatch' % verb] = ('unverified', message) + return + batch_size = len(riter.record_list) + + if batch_size == 0: + message = ('%s batch size could not be checked: No records.' % + verb) + self.results['%sBatch' % verb] = ('unverified', message) + return + if batch_size < min_batch_size: + message = ('%s batch size too small (%d), should be at least %d.' % + (verb, batch_size, min_batch_size)) + self.results['%sBatch' % verb] = ('recommendation', message) + elif batch_size > max_batch_size: + message = ('%s batch size is too large (%d), should be at most %d.' % + (verb, batch_size, max_batch_size)) + self.results['%sBatch' % verb] = ('recommendation', message) + else: + message = '%s batch size is %d.' % (verb, batch_size) + self.results['%sBatch' % verb] = ('ok', message) + + def incremental_harvesting(self, verb, granularity, metadataPrefix='oai_dc', sample_size=50): + """Check if server supports incremental harvesting using time granularity. + + :param verb: The OAI-PMH verb. + :param granularity: The time granularity. Can be 'full' or 'day'. + :param metadataPrefix: The OAI-PMH metadataPrefix. + :param sample_size: How many records should be inspected? + """ + try: + riter = self.RecordIterator(verb, metadataPrefix) + records = draw_sample(riter, sample_size) + except Exception as exc: + message = "Incremental harvesting (%s granularity) of %s could not be checked: %s" % (granularity, verb, str(exc)) + self.results['Incremental%s%s' % (verb, + granularity)] = ('unverified', message) + return + if len(records) == 0: + message = "Incremental harvesting (%s granularity) of %s could not be checked: No records." % (granularity, verb) + self.results['Incremental%s%s' % (verb, + granularity)] = ('unverified', message) + return + reference_record = random.sample(records, 1)[0] + reference_datestamp_elem = reference_record.find( + './/' + self.oai + 'datestamp') + if reference_datestamp_elem is None: + message = "Incremental harvesting (%s granularity) of %s could not be checked: No datestamp." % (granularity, verb) + self.results['Incremental%s%s' % (verb, + granularity)] = ('unverified', message) + return + reference_datestamp = reference_datestamp_elem.text + if not (DC_DATE_DAY.match(reference_datestamp) or DC_DATE_FULL.match(reference_datestamp)): + message = ("Incremental harvesting (%s granularity) of %s could not be checked: " + "Incorrect format for datestamp: %s." % (granularity, verb, reference_datestamp)) + self.results['Incremental%s%s' % (verb, + granularity)] = ('unverified', message) + return + if granularity == 'day': + reference_datestamp = reference_datestamp[:10] + reference_date = dateparser.parse(reference_datestamp) + try: + riter = self.RecordIterator(verb, metadataPrefix=metadataPrefix, + _from=reference_datestamp, + until=reference_datestamp) + test_records = draw_sample(riter, sample_size) + except Exception as exc: + message = "Incremental harvesting (%s granularity) of %s could not be checked: %s" % (granularity, verb, str(exc)) + self.results['Incremental%s%s' % (verb, + granularity)] = ('unverified', message) + return + if len(riter.record_list) == 0: + self.results['Incremental%s%s' % (verb, granularity)] = ('error', + 'No incremental harvesting (%s granularity) of %s: ' + 'Harvest for reference date %s returned no records.' % (granularity, verb, reference_datestamp)) + return + try: + for record in test_records: + test_datestamp = record.find( + './/' + self.oai + 'datestamp').text + if not (DC_DATE_DAY.match(test_datestamp) or DC_DATE_FULL.match(test_datestamp)): + message = ("Incremental harvesting (%s granularity) of %s could not be checked: " + "Incorrect format for datestamp: %s." % (granularity, verb, test_datestamp)) + self.results['Incremental%s%s' % (verb, granularity) + ] = ('unverified', message) + return + if granularity == 'day': + test_datestamp = test_datestamp[:10] + test_date = dateparser.parse(test_datestamp) + if test_date != reference_date: + self.results['Incremental%s%s' % (verb, granularity)] = ('error', + 'No incremental (%s granularity) harvesting of %s. ' + 'Harvest for reference date %s returned record with date %s.' % (granularity, verb, + reference_datestamp, test_datestamp)) + return + except Exception as exc: + message = "Incremental harvesting (%s granularity) of %s could not be checked: %s" % (granularity, verb, str(exc)) + self.results['Incremental%s%s' % (verb, + granularity)] = ('unverified', message) + return + self.results['Incremental%s%s' % (verb, granularity)] = ('ok', + 'Incremental harvesting (%s granularity) of %s works.' % (granularity, verb)) + + def minimal_dc_elements(self, minimal_set=MINIMAL_DC_SET, sample_size=50): + """Check for the minimal set of Dublin Core elements. + + :param minimal_set: The set of minimal DC elements that should be present. + :param sample_size: How many records should be inspected? + """ + try: + riter = self.RecordIterator(verb='ListRecords', + metadataPrefix='oai_dc', deleted=False) + records = draw_sample(riter, sample_size) + except Exception as exc: + message = 'Minimal DC elements could not be checked: %s' % str( + exc) + self.results['MinimalDC'] = ('unverified', message) + return + if len(records) == 0: + message = "Minimal DC elements could not be checked: No records." + self.results['MinimalDC'] = ('unverified', message) + return + for record in records: + oai_id = record.find('.//' + self.oai + 'identifier').text + dc_elements = record.findall('.//' + DC + '*') + # Remove the namespace from dc:tags + dc_tags = set([dc.tag.replace(DC, '') for dc in dc_elements]) + intersect = minimal_set - dc_tags + if intersect != set(): + message = ("Records should at least contain the DC " + "elements: %s. Found a record (%s) missing the " + "following DC element(s): %s.") + self.results['MinimalDC'] = ('warning', message % ( + ", ".join(minimal_set), + oai_id, + ", ".join(intersect))) + return + self.results['MinimalDC'] = ('ok', 'Minimal DC elements (%s) are ' + 'present.' % ', '.join(minimal_set)) + + def dc_date_ISO(self, sample_size=50): + """Check if dc:date conforms to ISO 8601 (matches YYYY-MM-DD). + + :param sample_size: How many records should be inspected? + """ + try: + riter = self.RecordIterator(verb='ListRecords', + metadataPrefix='oai_dc', deleted=False) + records = draw_sample(riter, sample_size) + except Exception as exc: + message = 'dc:date ISO 8601 conformance could not be checked: %s' % str(exc) + self.results['ISO8601'] = ('unverified', message) + return + if len(records) == 0: + message = "dc:date ISO 8601 conformance could not be checked: No records." + self.results['ISO8601'] = ('unverified', + message) + return + no_date = [] + wrong_date = [] + + for record in records: + dc_dates = record.findall('.//' + DC + 'date') + dc_dates = filter(lambda d: d.text is not None, dc_dates) + if dc_dates == []: + no_date.append(record) + continue + for dc_date in dc_dates: + date = dc_date.text + if not (DC_DATE_YEAR.match(date) or + DC_DATE_MONTH.match(date) or + DC_DATE_DAY.match(date) or + DC_DATE_FULL.match(date)): + wrong_date.append(record) + self.results['ISO8601'] = ('ok', 'dc:dates conform to ISO 8601.') + + def dc_language_ISO(self, sample_size=50): + """Check if dc:language conforms to ISO 639-3/-2B/-2T/-1. + + :param sample_size: How many records should be inspected? + """ + try: + riter = self.RecordIterator( + verb='ListRecords', metadataPrefix='oai_dc') + records = draw_sample(riter, sample_size) + except Exception as exc: + message = 'dc:language conformance to ISO 639 could not be checked: %s' % str(exc) + self.results['ISO639'] = ('unverified', message) + return + if len(records) == 0: + message = 'dc:language conformance to ISO 639 could not be checked: no records.' + self.results['ISO639'] = ('unverified', message) + return + language_elements = reduce(lambda x, y: x + y, [r.findall('.//' + DC + 'language') + for r in records]) + languages = [e.text for e in language_elements if e.text is not None] + if languages == []: + message = ('dc:language conformance to ISO 639 could not be checked: ' + 'no dc:language element found') + self.results['ISO639'] = ('unverified', message) + return + supported_isos = set() + for language in languages: + if language in ISO_639_3_CODES: + supported_isos.add('639-3') + elif language in ISO_639_2B_CODES: + supported_isos.add('639-2B') + elif language in ISO_639_2T_CODES: + supported_isos.add('639-2T') + elif language in ISO_639_1_CODES: + supported_isos.add('639-1') + else: + message = ('dc:language should conform to ISO 639, ' + 'found "%s"' % language) + self.results['ISO639'] = ('recommendation', message) + return + message = 'dc:language elements conform to ISO %s.' % ", ".join( + supported_isos) + self.results['ISO639'] = ('ok', message) + + def check_resumption_token(self, verb, metadataPrefix='oai_dc'): + """Check resumption requests. + - Make sure resumption requests return records. + - Make sure that the resumption token is good for at least 23h. + + :param verb: The OAI-PMH verb. + :param metadataPrefix: The OAI-PMH metadataPrefix. + """ + try: + tree = self.request_oai(verb=verb, metadataPrefix=metadataPrefix) + except Exception as exc: + message = 'Resumption requests could not be checked: %s' % str(exc) + self.results['ResumptionToken'] = ('unverified', message) + return + resumption_token = tree.find('.//' + self.oai + 'resumptionToken') + if resumption_token is None: + message = 'Resumption requests could not be checked: No resumptionToken found' + self.results['ResumptionToken'] = ('unverified', message) + return + # Check resumptionRequests + token_text = resumption_token.text + if token_text is None: + message = 'Element resumptionToken has no value.' + self.results['ResumptionToken'] = ('error', message) + return + try: + tree = self.request_oai(verb=verb, resumptionToken=token_text) + records = tree.findall('.//' + self.oai + 'record') + if not records: + message = 'Request for resumptionToken "%s" returned no records!' % token_text + self.results['ResumptionToken'] = ('error', message) + else: + message = 'Resumption requests work' + self.results['ResumptionToken'] = ('ok', message) + except Exception as exc: + message = 'Error during resumption request: %s' % str(exc) + self.results['ResumptionToken'] = ('error', message) + # Check expirationDate + attribs = resumption_token.attrib + expiration_date = attribs.get('expirationDate') + if expiration_date is None: + message = 'resumptionToken should contain expirationDate information.' + self.results['ResumptionTokenExp'] = ('recommendation', message) + else: + try: + parsed_expiration_date = dateparser.parse(expiration_date) + tz = parsed_expiration_date.tzinfo + now = datetime.now(tz) + delta = parsed_expiration_date - now + delta_hours = delta.days * 24 + if delta_hours < 23: + message = ('Resumption token should last at least 23 hours. ' + 'This one lasts: %d hour(s).' % delta_hours) + self.results['ResumptionTokenExp'] = ('recommendation', message) + else: + message = 'Resumption token lasts %d hours.' % delta_hours + self.results['ResumptionTokenExp'] = ('ok', message) + except ValueError: + message = ('Expiration date of resumption token could not be checked: ' + 'invalid date format: %s' % expiration_date) + self.results['ResumptionTokenExp'] = ('error', message) + + # Check completeListSize + riter = self.RecordIterator(verb=verb, metadataPrefix=metadataPrefix) + number_of_records = len(riter.record_list) + attribs = resumption_token.attrib + list_size = attribs.get('completeListSize') + if list_size is None: + message = 'resumptionToken should contain completeListSize information.' + self.results['ResumptionTokenList'] = ('recommendation', message) + return + try: + list_size = int(list_size) + except ValueError as exc: + message = 'Invalid format of completeListSize: %s' % exc + self.results['ResumptionTokenList'] = ('error', message) + return + if list_size <= number_of_records: + message = 'Value of completeListSize (%d) makes no sense. Records in first batch: %d' % (list_size, number_of_records) + self.results['ResumptionTokenList'] = ('error', message) + return + message = 'completeListSize: %d records.' % list_size + self.results['ResumptionTokenList'] = ('ok', message) + return + + def check_deleting_strategy(self): + """Report the deleting strategy; recommend persistent or transient""" + try: + tree = self.request_oai(verb='Identify') + deleting_strategy = tree.find( + './/' + self.oai + 'deletedRecord').text + except AttributeError: + message = "Deleting strategy could not be checked: deletedRecord element not found." + self.results['DeletingStrategy'] = ('unverified', message) + return + except Exception as exc: + message = "Deleting strategy could not be checked: %s" % str( + exc) + self.results['DeletingStrategy'] = ('unverified', message) + return + if deleting_strategy == 'no': + message = (u'Deleting strategy is "no" – ' + + 'recommended is persistent or ' + 'transient.') + report = 'recommendation' + elif deleting_strategy in ('transient', 'persistent'): + message = 'Deleting strategy is "%s"' % deleting_strategy + report = 'ok' + else: + message = 'Undefined deleting strategy: "%s"' % deleting_strategy + report = 'error' + self.results['DeletingStrategy'] = (report, message) + + def dc_identifier_abs(self, sample_size=50): + """Check if dc:identifier contains an absolute URL. + + :param sample_size: How many records should be inspected? + """ + try: + riter = self.RecordIterator( + verb='ListRecords', metadataPrefix='oai_dc') + records = draw_sample(riter, sample_size) + except Exception as exc: + message = "Could not check URL in dc:identifier: %s" % str(exc) + self.results['DCIdentifierURL'] = ('unverified', message) + return + if len(records) == 0: + message = "Could not check URL in dc:identifier: No records." + self.results['DCIdentifierURL'] = ('unverified', message) + return + # message = ("Could not check for absolute URLs in dc:identifiers: " + # "No dc:identifiers found.") + # self.results.append(('DCIdentifierURL', 'unverified', message)) + found_abs_urls = set() + for record in records: + abs_url = False + oai_id = record.find('.//' + self.oai + 'identifier').text + identifiers = record.findall('.//' + DC + 'identifier') + if identifiers == []: + message = ("Found at least one record missing dc:identifier: %s" + % oai_id) + self.results['DCIdentifierURL'] = ('warning', message) + return + for identifier_element in identifiers: + identifier = identifier_element.text + if identifier is None: + continue + if urlparse(identifier).scheme == 'http': + abs_url = True + found_abs_urls.add(identifier) + if abs_url is False: + message = ("Found at least one record missing an absolute URL " + "in dc:identifier: %s" % oai_id) + self.results['DCIdentifierURL'] = ('warning', message) + return + if len(records) > 1 and len(found_abs_urls) == 1: + message = ("All records have the same URL in dc:identifier: %s" + % list(found_abs_urls)[0]) + self.results['DCIdentifierURL'] = ('warning', message) + return + message = "Tested records contain absolute URLs in dc:identifier." + self.results['DCIdentifierURL'] = ('ok', message) + + def check_double_utf8(self): + """Check if content has been encoded doubly.""" + try: + tree = self.request_oai( + verb='ListRecords', metadataPrefix='oai_dc') + except Exception: + return + descriptions = tree.findall('.//' + DC + 'description') + description_texts = [ + d.text for d in descriptions if d.text is not None] + + for text in description_texts: + if is_double_encoded(text): + message = "Possibly detected double-encoded UTF-8 characters." + self.results['DoubleUTF8'] = ('warning', message) + return + + def check_handle(self): + """DSpace-specific. Check if the default handle was changed.""" + try: + tree = self.request_oai( + verb='ListRecords', metadataPrefix='oai_dc') + except Exception: + return + text_iterator = tree.itertext() + handles = [t for t in text_iterator if "http://hdl.handle.net/" in t] + if handles == []: + return + sample_handle = random.sample(handles, 1)[0] + if "123456789" in sample_handle: + message = "Found an invalid handle using the placeholder prefix: %s" % sample_handle + self.results['Handle'] = ('warning', message) + return + try: + resp = urllib.request.urlopen(sample_handle).read() + if "

-- cannot be found.

" in resp: + message = "Found an invalid handle: %s" % sample_handle + self.results['Handle'] = ('warning', message) + except: + return + return + + +def main(args=None): + """Prototypical command line interface.""" + from pprint import pformat + if args is None: + import argparse + parser = argparse.ArgumentParser(description='OVAL -- OAI-PHM Validator') + parser.add_argument('base_url', type=str, + help='the basic URL of the OAI-PMH interface') + args = parser.parse_args() + base_url = args.base_url + else: + base_url = args["base_url"] + + val = Validator(base_url) + try: + import unicodedata + val.repository_name = unicodedata.normalize( + 'NFKD', val.repository_name).encode('ascii', 'ignore') + except: + pass + print("Repository: %s" % val.repository_name) + + # Run checks + val.check_identify_base_url() + val.validate_XML('Identify') + val.validate_XML('ListRecords') + val.check_resumption_token('ListRecords') + val.reasonable_batch_size('ListRecords') + val.reasonable_batch_size('ListIdentifiers') + val.dc_language_ISO() + val.dc_date_ISO() + val.minimal_dc_elements() + + if val.granularity == 'day': + val.incremental_harvesting('ListRecords', 'day') + elif val.granularity == 'full': + val.incremental_harvesting('ListRecords', 'day') + val.incremental_harvesting('ListRecords', 'full') + val.dc_identifier_abs() + val.check_deleting_strategy() + val.check_double_utf8() + val.check_handle() + # val.indexed_in_BASE() + + # pprint(val.results, indent=4) + ret = u"" + for k, v in val.results.items(): + ret += u"%s\n" % k + if len(v) == 2: + ret += u"\t%s : %s\n" % (v[0], v[1]) + else: + ret += u"\t%s\n" % pformat(v, indent=2) + print(ret) + return val.results + +if __name__ == '__main__': + + main() diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/validate.py b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/validate.py new file mode 100644 index 000000000000..e35336413a33 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/validate.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python + +import sys +from oval import validator + +if len(sys.argv) < 2: + print("Please, input oai request url!") + sys.exit(1) +if not sys.argv[1].startswith("http"): + print("Invalid url supplied (not starting with http)") + sys.exit(1) + +print("\nFirst argument is " + sys.argv[0]) +print("\nSecond argument is " + sys.argv[1]) + +validator.main() diff --git a/dspace/config/modules/healthcheck.cfg b/dspace/config/modules/healthcheck.cfg index 4835574c519b..6b24c941727b 100644 --- a/dspace/config/modules/healthcheck.cfg +++ b/dspace/config/modules/healthcheck.cfg @@ -11,7 +11,7 @@ healthcheck.checks = General Information,\ Log Analyser Check,\ Additional Information,\ OAI-PMH validation,\ - PID check,\ + PID Check,\ Shibboleth Check plugin.named.org.dspace.health.Check = \ From a62746f36a5309ed4908280787a75322ab4d2984 Mon Sep 17 00:00:00 2001 From: Matus Kasak Date: Fri, 20 Dec 2024 13:25:04 +0100 Subject: [PATCH 3/5] Deleted unnecessary files, modified python scripts (still http error 400) --- .../main/java/org/dspace/health/PIDCheck.java | 130 -------------- .../org/dspace/health/ShibbolethCheck.java | 20 +-- .../additionalUtilities/PIDLogMiner.java | 155 ----------------- .../additionalUtilities/PIDLogStatistics.java | 79 --------- .../PIDLogStatisticsEntry.java | 83 --------- .../health/additionalUtilities/Record.java | 19 -- .../RecordFileLineIterator.java | 123 ------------- .../additionalUtilities/RecordParser.java | 14 -- .../additionalUtilities/SimpleLogEntry.java | 164 ------------------ .../SimpleLogEntryParser.java | 57 ------ .../additionalUtilities/SimpleLogFile.java | 66 ------- .../__pycache__/validator.cpython-311.pyc | Bin 40555 -> 40648 bytes .../additionalUtilities/oval/validator.py | 2 + .../health/additionalUtilities/validate.py | 2 +- dspace/config/clarin-dspace.cfg | 2 - dspace/config/modules/healthcheck.cfg | 2 - 16 files changed, 13 insertions(+), 905 deletions(-) delete mode 100644 dspace-api/src/main/java/org/dspace/health/PIDCheck.java delete mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogMiner.java delete mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatistics.java delete mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatisticsEntry.java delete mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/Record.java delete mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordFileLineIterator.java delete mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordParser.java delete mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntry.java delete mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntryParser.java delete mode 100644 dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogFile.java diff --git a/dspace-api/src/main/java/org/dspace/health/PIDCheck.java b/dspace-api/src/main/java/org/dspace/health/PIDCheck.java deleted file mode 100644 index 07fd3b4533bd..000000000000 --- a/dspace-api/src/main/java/org/dspace/health/PIDCheck.java +++ /dev/null @@ -1,130 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.health; - -import org.apache.commons.lang.NotImplementedException; -import org.dspace.handle.PIDService; -import org.dspace.health.additionalUtilities.PIDLogMiner; -import org.dspace.health.additionalUtilities.PIDLogStatistics; -import org.dspace.health.additionalUtilities.PIDLogStatisticsEntry; -import org.dspace.services.ConfigurationService; -import org.dspace.services.factory.DSpaceServicesFactory; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.Map; - -public class PIDCheck extends Check { - protected static final ConfigurationService configurationService - = DSpaceServicesFactory.getInstance().getConfigurationService(); - - @Override - protected String run(ReportInfo ri) { - String output = ""; - output += "This is space for PID Check output"; - try { - String whoami = PIDService.who_am_i("encoding=xml"); - output += String.format("Who am I\n\t%s\n", - whoami.replaceAll("\n", "\n\t")); - String test_pid = configurationService.getProperty("lr.pid.service.testPid"); - output += "Testing PID server\n\t"; - if (test_pid != null) { - output += PIDService.test_pid(test_pid); - } else { - output += "Testing PID server not done! Test pid not in dspace.cfg!"; - } - } catch (IllegalArgumentException e) { - error(e, "Warning: PID service type is not defined or wrong"); - } catch (NotImplementedException e) { - error(e, "Testing PID server - method who_am_i not implemented"); - } catch (Exception e) { - error(e, "Testing PID server failed - exception occurred: %s"); - } - -// try { -// long total_count = Core.getHandlesTotalCount(); -// output += "\n"; -// output += String.format("Total count: %d\n", total_count); -// List invalid_handles = Core.getHandlesInvalidRows(); -// output += String.format("Invalid handles count: %d\n", -// invalid_handles.size()); -// if (invalid_handles.size() > 0) { -// output += "\n"; -// output += "Invalid handles:\n"; -// output += "----------------\n"; -// output += String.format("%-6s\t%-32s\t%-10s\t%-10s\t%s\n", -// "Handle ID", "Handle", "Res. type ID", "Resource ID", -// "URL"); -// for (TableRow row : invalid_handles) { -// int handle_id = row.getIntColumn("handle_id"); -// String handle = row.getStringColumn("handle"); -// -// Integer resource_type_id = row.getIntColumn("resource_type_id"); -// if (resource_type_id < 0) -// resource_type_id = null; -// -// Integer resource_id = row.getIntColumn("resource_id"); -// if (resource_id < 0) -// resource_id = null; -// -// String url = row.getStringColumn("url"); -// output += String.format("%-10d\t%-32s\t%-10d\t%-10d\t%s\n", -// handle_id, handle, resource_type_id, resource_id, -// url); -// } -// } -// } catch (SQLException e) { -// error(e); -// } - - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - Calendar realEndDate = Calendar.getInstance(); - realEndDate.setTime(ri.till()); - realEndDate.add(Calendar.DATE, -1); - - final int topN = 10; - StringBuffer buf = new StringBuffer(); - buf.append("============================================================\n"); - buf.append(String.format("PID resolution statistics\n")); - buf.append("============================================================\n"); - buf.append("\n\n"); - PIDLogMiner logMiner = new PIDLogMiner(); - PIDLogStatistics statistics = logMiner.computeStatistics( - ri.from(), realEndDate.getTime()); - Map> topNEntries = statistics - .getTopN(topN); - String eventsToDisplay[] = { PIDLogMiner.FAILURE_EVENT, - PIDLogMiner.REQUEST_EVENT, PIDLogMiner.SUCCESS_EVENT, - PIDLogMiner.UNKNOWN_EVENT }; - SimpleDateFormat dateTimeFormat = new SimpleDateFormat( - "yyyy-MM-dd HH:mm:ss.SSS"); - for (String event : eventsToDisplay) { - if (topNEntries.containsKey(event)) { - buf.append(String.format( - "Top %d events of type %s between %s and %s\n", topN, - event, dateFormat.format(ri.from()), - dateFormat.format(realEndDate.getTime()))); - buf.append(String - .format("---------------------------------------------------------------\n")); - buf.append(String.format("%-10s%-40s%-25s%-25s\n", "Count", - "PID", "First occurence", "Last occurence")); - buf.append(String - .format("--------------------------------------------------------------------------------------------------\n")); - for (PIDLogStatisticsEntry entry : topNEntries.get(event)) { - buf.append(String.format("%-10d%-40s%-25s%-25s\n", - entry.getCount(), entry.getPID(), - dateTimeFormat.format(entry.getFirstOccurence()), - dateTimeFormat.format(entry.getLastOccurence()))); - } - buf.append("\n"); - } - } - return output + buf.toString(); - } -} diff --git a/dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java b/dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java index a20e278c3290..d4f2010af8df 100644 --- a/dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/ShibbolethCheck.java @@ -9,16 +9,16 @@ import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; -//import java.io.BufferedReader; -//import java.io.File; -//import java.io.InputStreamReader; -//import java.io.StringWriter; -//import java.net.URL; -//import java.text.SimpleDateFormat; -//import java.util.Date; -//import java.util.HashSet; -//import java.util.Iterator; -//import java.util.Set; +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.io.StringWriter; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; public class ShibbolethCheck extends Check { diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogMiner.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogMiner.java deleted file mode 100644 index 44753239da0a..000000000000 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogMiner.java +++ /dev/null @@ -1,155 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.health.additionalUtilities; - -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.dspace.services.ConfigurationService; -import org.dspace.services.factory.DSpaceServicesFactory; - -public class PIDLogMiner { - protected static final ConfigurationService configurationService - = DSpaceServicesFactory.getInstance().getConfigurationService(); - - private static org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(PIDLogMiner.class); - - private static final Pattern REQUEST_PATTERN = Pattern - .compile("Resolving \\[(.*)\\]"); - - private static final Pattern FAILURE_PATTERN = Pattern - .compile("Unable to resolve \\[(.*)\\]"); - - private static final Pattern SUCCESS_PATTERN = Pattern - .compile("Handle \\[(.*)\\] resolved to \\[(.*)\\]"); - - public static final String REQUEST_EVENT = "REQUEST"; - public static final String SUCCESS_EVENT = "SUCCESS"; - public static final String FAILURE_EVENT = "FAILURE"; - public static final String UNKNOWN_EVENT = "UNKNOWN"; - - private String logDir; - - public PIDLogMiner() - { - this.logDir = getConfigLogDir(); - } - - public PIDLogMiner(String logDir) - { - this.logDir = logDir; - } - - private List getDatesInInterval(Date startDate, Date endDate) - { - List dates = new ArrayList(); - Calendar calendar = new GregorianCalendar(); - calendar.setTime(startDate); - - while (calendar.getTime().before(endDate) || calendar.getTime().equals(endDate)) - { - dates.add(calendar.getTime()); - calendar.add(Calendar.DATE, 1); - } - return dates; - } - - /** - * Function for computing log statistics - * - * Note: The current log is not processed, only from yesterday backwards. - * - * @param startDate the first day of the statistics - * @param endDate the last day of the statistics - * @return - */ - - public PIDLogStatistics computeStatistics(Date startDate, Date endDate) - { - PIDLogStatistics statistics = new PIDLogStatistics(); - List dates = getDatesInInterval(startDate, endDate); - - for (Date date : dates) - { - String formattedDate = new SimpleDateFormat("yyyy-MM-dd") - .format(date); - String logFilename = String.format("handle-plugin.log.%s", - formattedDate); - log.info(String.format("Logfile [%s] processing started", - logFilename)); - - SimpleLogFile logFile = new SimpleLogFile(logDir, logFilename); - - for (SimpleLogEntry logEntry : logFile) - { - updateStatistics(statistics, logEntry); - } - - log.info(String.format("Logfile [%s] processing finished", - logFilename)); - - } - return statistics; - - } - - private void updateStatistics(PIDLogStatistics statistics, - SimpleLogEntry logEntry) - { - String message = logEntry.getMessage(); - Date eventDate = logEntry.getDate(); - Matcher matcher; - String pid; - String event; - - matcher = REQUEST_PATTERN.matcher(message); - if (matcher.find()) - { - event = REQUEST_EVENT; - pid = matcher.group(1); - statistics.updateStatistics(event, pid, eventDate); - return; - } - - matcher = SUCCESS_PATTERN.matcher(message); - if (matcher.find()) - { - event = SUCCESS_EVENT; - pid = matcher.group(1); - statistics.updateStatistics(event, pid, eventDate); - return; - } - - matcher = FAILURE_PATTERN.matcher(message); - if (matcher.find()) - { - event = FAILURE_EVENT; - pid = matcher.group(1); - statistics.updateStatistics(event, pid, eventDate); - return; - } - - event = UNKNOWN_EVENT; - pid = ""; - statistics.updateStatistics(event, pid, eventDate); - return; - - } - - private String getConfigLogDir() - { - return configurationService.getProperty("log.dir"); - } - -} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatistics.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatistics.java deleted file mode 100644 index d0de591346b5..000000000000 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatistics.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.health.additionalUtilities; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class PIDLogStatistics { - private HashMap> entries = null; - - PIDLogStatistics() - { - entries = new HashMap>(); - } - - public void updateStatistics(String event, String pid, Date eventDate) - { - if (!entries.containsKey(event)) - { - entries.put(event, new HashMap()); - } - HashMap subentries = entries.get(event); - - if (!subentries.containsKey(pid)) - { - subentries.put(pid, new PIDLogStatisticsEntry(event, pid, 0, - eventDate, eventDate)); - } - PIDLogStatisticsEntry entry = subentries.get(pid); - entry.update(eventDate); - } - - public List getEntriesList() - { - List entriesList = new ArrayList(); - for (Map subentries : entries - .values()) - { - for (PIDLogStatisticsEntry entry : subentries.values()) - { - entriesList.add(entry); - } - } - return entriesList; - } - - public Map> getTopN(int topN) - { - Map> topEntriesMap = new HashMap>(); - for (String event: entries.keySet()) - { - List subentries = new ArrayList(entries.get(event).values()); - Collections.sort( subentries, new Comparator(){ - public int compare( PIDLogStatisticsEntry a, PIDLogStatisticsEntry b ){ - if(a.getCount() != b.getCount()) { - return b.getCount() - a.getCount(); - } - else { - return a.getPID().compareTo(b.getPID()); - } - } - }); - topEntriesMap.put(event, subentries.subList(0, topN > subentries.size() ? subentries.size() : topN)); - - } - return topEntriesMap; - } -} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatisticsEntry.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatisticsEntry.java deleted file mode 100644 index 13ee9e726aaa..000000000000 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/PIDLogStatisticsEntry.java +++ /dev/null @@ -1,83 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.health.additionalUtilities; - -import java.util.Date; - -public class PIDLogStatisticsEntry { - private String event; - - private String pid; - - private int count; - - private Date firstOccurence; - - private Date lastOccurence; - - PIDLogStatisticsEntry(String event, String pid, int count, - Date firstOccurence, Date lastOccurence) - { - this.event = event; - this.pid = pid; - this.count = count; - this.firstOccurence = firstOccurence; - this.lastOccurence = lastOccurence; - } - - public void update(Date eventDate) - { - this.count++; - - if (eventDate.before(firstOccurence)) - { - firstOccurence = eventDate; - } - - if (eventDate.after(lastOccurence)) - { - lastOccurence = eventDate; - } - } - - public String getEvent() - { - return event; - } - - public String getPID() - { - return pid; - } - - public int getCount() - { - return count; - } - - public Date getFirstOccurence() - { - return firstOccurence; - } - - public Date getLastOccurence() - { - return lastOccurence; - } - - public String toString() { - return String.format("" - + "Event: %s\n" - + "PID: %s\n" - + "Count: %d\n" - + "First occurence: %s\n" - + "Last occurence: %s\n", - event, pid, count, firstOccurence.toString(), lastOccurence.toString() - ); - } -} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/Record.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/Record.java deleted file mode 100644 index efc07e096307..000000000000 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/Record.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.health.additionalUtilities; - -public interface Record { - public void setLineNumber(int lineNumber); - - public int getLineNumber(); - - public void setValid(boolean valid); - - public boolean isValid(); - -} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordFileLineIterator.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordFileLineIterator.java deleted file mode 100644 index 1a2ce0ab8ebf..000000000000 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordFileLineIterator.java +++ /dev/null @@ -1,123 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.health.additionalUtilities; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.Charset; -import java.util.Iterator; -import java.util.NoSuchElementException; - -public class RecordFileLineIterator implements Iterator { - private BufferedReader reader; - - private RecordParser recordParser; - - private int cachedLineNumber; - - private String cachedLine; - - private boolean finished; - - public RecordFileLineIterator(InputStreamReader inputReader, RecordParser recordParser) - { - this.recordParser = recordParser; - this.reader = inputReader == null ? null : new BufferedReader(inputReader); - this.cachedLine = null; - this.cachedLineNumber = 0; - this.finished = false; - nextRecord(); - } - - private String nextRecord() - { - if (reader == null || finished) - { - finished = true; - return null; - } - StringBuffer buf = new StringBuffer(); - buf.append(cachedLine); - try - { - while (true) - { - cachedLine = reader.readLine(); - cachedLineNumber++; - if (cachedLine == null) - { - close(); - break; - } - if (recordParser.matches(cachedLine)) - { - break; - } - buf.append("\n"); - buf.append(cachedLine); - } - } - catch (IOException ioe) - { - close(); - throw new IllegalStateException(ioe.toString()); - } - return buf.toString(); - } - - @Override - public boolean hasNext() - { - return !finished; - } - - @Override - public T next() - { - T res = null; - String s; - - int lineNumber = cachedLineNumber; - s = nextRecord(); - if (!s.isEmpty()) - { - res = recordParser.parse(s); - res.setLineNumber(lineNumber); - } - - if (res == null) - { - throw new NoSuchElementException(); - } - return res; - } - - @Override - public void remove() - { - throw new UnsupportedOperationException( - "Remove unsupported on RecordFileLineIterator"); - } - - public void close() - { - finished = true; - try - { - reader.close(); - } - catch (IOException ioe) - { - throw new IllegalStateException(ioe.toString()); - } - } -} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordParser.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordParser.java deleted file mode 100644 index 43e29a7e6168..000000000000 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/RecordParser.java +++ /dev/null @@ -1,14 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.health.additionalUtilities; - -public interface RecordParser { - public T parse(String s); - - public boolean matches(String s); -} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntry.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntry.java deleted file mode 100644 index 15e012b664b7..000000000000 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntry.java +++ /dev/null @@ -1,164 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.health.additionalUtilities; - -import java.util.Date; - -public class SimpleLogEntry implements Record { - private String filename; - - private int lineNumber; - - private Date date; - - private String level; - - private String loggingClass; - - private String message; - - private boolean valid; - - public static final String ERROR_LEVEL = "ERROR"; - - public static final String WARNING_LEVEL = "WARN"; - - public static final String INFO_LEVEL = "INFO"; - - public static final String DEBUG_LEVEL = "DEBUG"; - - public static final String FATAL_LEVEL = "FATAL"; - - public static final String CRITICAL_LEVEL = "CRIT"; - - public SimpleLogEntry() - { - this.lineNumber = 0; - this.date = null; - this.level = null; - this.loggingClass = null; - this.message = null; - } - - public SimpleLogEntry(Date date, String level, String loggingClass, - String message) - { - this.lineNumber = 0; - this.date = date; - this.level = level; - this.loggingClass = loggingClass; - this.message = message; - } - - public String getFilename() - { - return filename; - } - - public int getLineNumber() - { - return lineNumber; - } - - public Date getDate() - { - return date; - } - - public void setDate(Date date) - { - this.date = date; - } - - public void setLevel(String level) - { - this.level = level; - } - - public void setLoggingClass(String loggingClass) - { - this.loggingClass = loggingClass; - } - - public void setMessage(String message) - { - this.message = message; - } - - public String getLevel() - { - return level; - } - - public String getLoggingClass() - { - return loggingClass; - } - - public String getMessage() - { - return message; - } - - public void setLineNumber(int lineNumber) - { - this.lineNumber = lineNumber; - } - - public void setFilename(String filename) - { - this.filename = filename; - } - - public boolean isValid() - { - return valid; - } - - public void setValid(boolean valid) - { - this.valid = valid; - } - - public boolean isError() - { - return ERROR_LEVEL.equals(level); - } - - public boolean isWarning() - { - return WARNING_LEVEL.equals(level); - } - - public boolean isInfo() - { - return INFO_LEVEL.equals(level); - } - - public boolean isDebug() - { - return DEBUG_LEVEL.equals(level); - } - - public boolean isFatal() - { - return FATAL_LEVEL.equals(level); - } - - public boolean isCritical() - { - return CRITICAL_LEVEL.equals(level); - } - - public String toString() - { - return String.format("" + "Date: %s\n" + "Level: %s\n" - + "Logging class: %s\n" + "Message: %s\n", date.toString(), - level, loggingClass, message); - } -} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntryParser.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntryParser.java deleted file mode 100644 index f9ec7ed51fbb..000000000000 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogEntryParser.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.health.additionalUtilities; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class SimpleLogEntryParser implements RecordParser { - private final static String LOG_ENTRY_PATTERN = "^(\\d{4}-\\d{2}-\\d{2} +\\d{2}:\\d{2}:\\d{2},\\d{3}) +([^ ]+) +([^ ]+) +@ +(.*)$"; - - private final static Pattern pattern = Pattern.compile(LOG_ENTRY_PATTERN, Pattern.DOTALL); - - public SimpleLogEntry parse(String s) - { - - SimpleLogEntry entry = new SimpleLogEntry(); - Matcher matcher = pattern.matcher(s); - if (matcher.find()) - { - String dateString = matcher.group(1); - entry.setValid(true); - entry.setLevel(matcher.group(2)); - entry.setLoggingClass(matcher.group(3)); - entry.setMessage(matcher.group(4)); - - try - { - Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS") - .parse(dateString); - entry.setDate(date); - } - catch (ParseException e) - { - entry.setValid(false); - } - } - else - { - entry.setValid(false); - } - return entry; - } - - public boolean matches(String s) - { - - return pattern.matcher(s).matches(); - } -} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogFile.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogFile.java deleted file mode 100644 index c4565b4fae95..000000000000 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/SimpleLogFile.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.health.additionalUtilities; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStreamReader; -import java.nio.charset.Charset; - -public class SimpleLogFile implements Iterable { - private static org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(SimpleLogFile.class); - - private InputStreamReader inputReader; - - public SimpleLogFile(String dirname, String filename) - { - this(new File(dirname, filename)); - } - - public SimpleLogFile(String filePath) - { - this(new File(filePath)); - } - - public SimpleLogFile(File file) - { - if (file == null) { - throw new IllegalArgumentException("File cannot be null"); - } - else if (!file.exists()) - { - log.warn(String.format("Logfile [%s] not found at [%s]", - file.getName(), file.getPath())); - } - else if (file.exists() && file.length() == 0) - { - log.warn(String.format("Logfile [%s] at [%s] is empty", - file.getName(), file.getPath())); - } - else - { - try - { - this.inputReader = new InputStreamReader(new FileInputStream( - file), Charset.forName("UTF8")); - } - catch (FileNotFoundException e) - { - log.error(e.toString()); - } - } - - } - - public RecordFileLineIterator iterator() - { - return new RecordFileLineIterator(inputReader, - new SimpleLogEntryParser()); - } -} diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/validator.cpython-311.pyc b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/validator.cpython-311.pyc index 7cf141f65c82d465e70dec5135a5693766b42c03..eb8fe54fbd1006067212a0ca90e6dbfe7bbeb9fd 100644 GIT binary patch delta 2075 zcmZ`)drXs86#s5ZKOUv1Gy*~`R6ti*t6^ZbB|dmLFjB>0kZD$GzmJEj2)C_30~SY!hbOvgw>#jDE5|6b2gqU~yX{F`6|#H}{SKGuhy$$aHX7}YEtY{2rAo{R7dK# zdSxkBM?9MGNRDeH+d?5LItKJ>BNQGDSPdyC>R(r)4~-Le^ceT|@f_Er6hfhFL2S6p zY~ze!(7fPsv~RXebd{U8I^3e&OI=B(B*;!SlW?d_P7DpGYG_rp2aY7y8SXGL_ty-X zxzR8_TzflK|F);6X*kw&J=U~8e}6vQFPaO>QxaotN6xtxopRjsLDO(_#&Bfj^~lU? zk(rRRVLmjZY>qT2-^DKF_%SqAA|N*GU?rJon)5E3Pso_CX&X0`|2ix9^k5aOYt zNbBJj)h%vR)s52}MkS zUPh=#C_xy4MMXPFw{)ziRuws!2>l8YN;=r)r%U#bo3Lb)gAY<8(?6J3?9bxEn#Gno(w@$=|(ar38hyFxg#yzd|nwnvFjD~pez;swe#c&@MXKxdzms2=5kb5cpVj@Q88IFljZXwblP!U zC`)I-56e0YGWmCy?YOTvgYO^G4F`L8H{jM*GwA@ebH45-#zZ`$!d$0?@i#hi$OCE6 zc|MGcfY(*PPI17sPu4QJ(Ge{4Z8g#6|*EEz6QF_0jKs9^fUg!vO_dN$${)J%h+thgS@}u#+0E7Mo5bci! z$^VPL1NAdiB{yOSvj%v#vr^nH(!X#K;;M3cjGCDb6S=TM15xEWyw!r;vDJ-(!%c@! z89KJ4-{4AJC5UW%=vvB2i?pXDTS1<}K*Buf?jAFl^Zzoev={WP8aFszIs<6OXP?)vW&K|5SubAFO%R_{J5Mo)|Py<35LOQ|Lt~RQSMo= zlW0}TM!5-CtWm8ZqudnKOa8;Rcw&Mroz4Wg?OJfZ-3WOM0wLvImx~TVpz}qt8nj)N zIn;~B$s*+3mnlHf0qq*@%kc0hgu~8y8JfhcA<)Wde8-#a{cFvVM_Z?gd2y%z#z$@MQxj*9i uCxm_koP6|6@O7v1E0MiT`mno1kzO87W{q+);}QOmYZH`ghB3h&yELxDlDs!>awgRr)-WCgZp;0_<=yy8A!bRS%H(=*(nQ}@Bmu&K#nbldx!b^{&u!>{jo-v4uZ z&vVW>cT%`@LeL%7>0%W8XG?R{wI0U`3WbX~OV^ zlD1fqOSOsA)BQ8CfA+L!IgV9fh{U1UXK_b%er6O?k+6(IiZ-`9-7UU`<|aw$^)dDe zH{#`Nf9w^$@P5V-P>e^ZaE(40=WdI`9(@KDy_SZT^sBWo%JeuWr`7(o^Go2C_-X!NlscqChcOrYxW{OR zH1Rj%ff(2>?kKi_@ni06n9iyxkSw**isDKducNWWd`IB5H=}MN_OH5T}`-*Z)RVh0`zNa`0+R$N~A;YAUXsJnu zQEaTKhEw7fH5UM`hb2o=Ukf2?Hjz@aG&Nn)9G2M}a zYiiYS2i>*X77TNv6yAYLV}F*M@0y%1tablS zYZMo)1>gtrqB9?YxZatT`W<=1JfYAep9WNS;l4 z!$@kcv)D@W}7TnnFfwN*|-*U*KNEU-K6!9Yx9p>QUEvGn2YhdBO4!p2uacMh=J|qkg z&T~kyE6OZoD@@Dn{28{ItJoOr{7QI0NTg}ZB+Mf`OIVB*LCeyGs-khlli-5{RpGee zKg`prmcqDV5>v$=gJWu#kH_~rXUP*6pnO{iW)3N0U7N?lF5;pC3&D)+K)qQ~wJ<*C zY@!XhI=L6QSh;Mu0r|~K{e{Yw8wl5));}x7Ol_1C=qnZaz$iC3Jj{xf{dq7Z2KwWa zx~qK8U}PrJ9m7KhOJFZvJ(vWi@&3X6rSjOmP3|s&Jl@4zDn&Y*8(SJYZYl0nbEUPc z++wdVRaKcQE$k) Date: Thu, 2 Jan 2025 14:33:28 +0100 Subject: [PATCH 4/5] WIP OAIPMH check, corrected HTTP Error 400 --- .../__pycache__/harvester.cpython-311.pyc | Bin 15493 -> 16183 bytes .../__pycache__/validator.cpython-311.pyc | Bin 40648 -> 41204 bytes .../additionalUtilities/oval/harvester.py | 11 ++++++- .../additionalUtilities/oval/validator.py | 30 +++++++++++++++--- .../health/additionalUtilities/validate.py | 4 ++- 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/harvester.cpython-311.pyc b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/harvester.cpython-311.pyc index 0fb48deaae801ccf6a74509fef41f9191a25e65b..88724b56008fc2c0706c3fa2c647235c7600f49f 100644 GIT binary patch delta 2034 zcmbtUUu;uV7(b`?PjB0`b*x=k>7?z(TxYkAZHx_JTH-)3A~;ASg4*@oZH29E&b|A? z(lJdWOr8Au6eff?jiN%LkP9ufWB0DSuiG^bK6xG5>4c^->=_2 z=lj?Do!@ul(8q@z@7nEFMAw%v)O#Ru#qsD$ybpHy>*4sS+6K+cj`AzRY0{F8&;=7h zm#E|yac8(`0kG(XI;(Tv7?-T8LR!hvF+$adRF3hQ^Pe4A$nfXTdD8_<15wE@jP@c~ z9ODo3ve;G7hVd{O;r60ooH0#HG>Hp-TUlxmGQ#toj4*96(moh)mW+uR!>J2}Bv@B* zbNrStsP)vhjk-GtNfCdKqQ(0X$zH!4(_$O^J8rPFA**g8if)dl2GWUsg*-|3bZbIQ zBvmbzj4Qg(eMnPOU6hr0N><1Yb}pnzBB|-3s>DdVPZxSgYA_u#lgH^H*~u(y=^+Jr zy^eBD8Hww7KsOI5L`|fUDto1VIN}XjQ&fA4iuxT~@m7qBf@`6ya;on=@pAbm-r2^7 z=gKESs~WZn~*cw}*L!RE>#lW-d> zNcLIB{nK#@^gAbo=cVwh6u#~(o6wd%i*)4#>bAHjF6KmJae;MJW3%d^Wu4v>b)gxT zHTnQIbMK01D>u_BP(5DkI<*n0a8zz?zsox#(K}Ph?hIU86~N{~m)*je3~%(@4c>~f zT3I}3WG5!s+=ViNEES%4*+Q=i%1g)!`+ZF&(hZZo#&F0&;CxA4es$K=VS=YthT*V(XWcRa^8ZFaz!f2m*X*YP-a3qocj=%J3yboP&vUB_ z-NB|~fl^M;>~PZVb7X|)IN3ZVCTok-x)E@~0#{xxTb6T`(v2(d@mRoPv5ra9$z0%L z!O3@rlavuNQjdvp)CPR8%S2+ZJJ^IXa5PwpyWw&$(ro>YhV{`ub$i$7BZyU_wil@K zBNa7*;pM8DZDyh4e-nz5XQJ;#=cIFje&GA6O^yZLGEq0jyXSfLEbj(O^@w`~O?EL_ z5?zmG)>}6V+*dr_EM%ejX|wwnJtBJ;oM2!KhT|ZH<0c7b4~BPPJO$V4cjG!((eUf` zm#EDxt|1a3lT@Q~MT=>JDq%sk><$U!HMYz5B$6^YWf;UXjU>8BD}4xYWQzU}7K2Q} zmWYh&;Zo#A=XtiVHgE9;(+yW%Q%1Cck1mZ2^gp8!MIoo zZibSzF5CuzwZHFSF}H+7-OOr<_4gYwjq;3Qb+ISWuPKDQN$r*jdzhNW4L_8<(DVV8USZBw08GQbKW%+4rCw|8l&^fsCzrqN*+9e7)mrkV(yB}Kj<0qhT{riotv%_-?Se-`Td;B<*$t23jiuO=Lq(`{;EEh7 VLePoJa;ON^<;=JUEwFcE_-|mt0CoTX delta 1408 zcmah}Z%kWN6o0qxUss@Il&xZEN1+9}K-)o-u|W-q%*;P?3oO}8P)pxquoWJ=eQdCl z>2xYnr??}_VvIq*j4ir={V)<1jK(j1Flt=<@De}h7lR)R2BT&%>N&4nlbJ2vHb%!sGCDtmKE4mZQnGrAr-v>12sb9iF(~K{RI*V^J)!gLh%uI>Qs98U-gOj> z4{&B*hG~C|UzDrA_XaKvFDQ#!m+${N@$fg^-kaXu8Rv`>yxYRe3;xujf(cA(?-pxh$Pjo;ile^!-mOQz}1(+%$twMRk68 z+s8~kf$Pt}2<6!|I9=Nc`|J1LTQ~VGx~(^CuD~vy7d2&C8EekTws`Y39>=_b!ft^` z*n>Mcv8eNUgHPQw?L?+}7bZLvE@Lhj3irWkIL;>FmvA#nfiDtoQh6F{M0jLEn_|9 z`QE0d)h(}~pC2SRPw*tc>#!V4JN^;!f%pN&=DS!w@P|_leh&WJp|LOww5|2NLyjE< z#=B(Op^~Xjn#CB)IXRkn#^k!r-$Fu`u3}wX9j_$z+X$x~fgfV+u-abD;_z+zuLmjT zo~UA}R7)z8v2)tx*~MDQ&`8GAIe!m%w+nk8ZA<0&KXWa6=NUj}B#UP#ip}WAA9~;# zbG}L$TznSX9f1&4$BArLWmWW<#`s=5CuQObjXL-oJl^pvOXff7SYfrZ#IqwVleK_g ziQ~q&%{$vU!1ltAomUbUY4Z{R6>BFh96?9c4_Qm_#qO9)FKrF}+C9q_;e6K&djqz1cec~#gdZoM*Tm`aabofq zK@|b%aLd^>YG@M~J;`t6U+8{sVwy}RPvyXY|@ z5)KC2*aUh)NXKr*={U4*+?aHkCTZHG$vP9wRhac+x~wBvRfH)F-ICmzpu+V4B7 zT}gz*|MW`w>74U@=kYzx_kH)?e%0{N4TJkHGBO+jJlD^i9JzSmk~^OiU-DPY7-VzM zEE3Tun-xpYLIh}=WUFEe+7x@x&iiKBpg4jK-Zse2pc8m3vP*FVU3| z6ATyxY5j;G=KeXkN(ABC@RxjoH9&EW&eWy`#JqbL>NvwP-Fpwc{vNvT9(uz)^!$71 zjYyvvUEZMJ9)<_R!eEnFbVdj^i^YHI5$4Z_2MSaL=XOQn{pMvw{qmSox_R)}S1 zNN}_Cpjdv~fTPp}+iboHt#2op06|}d0sa>tm8{Wl*Fkh^zjPulsTy+`&k`$R#wT35 zV_4FLj)laq7Ea`w+-CDSn7k)ZWB-hl_@SwLqA{w3<;av28VsvaC{AVC0EA#-r}HN9 zaUQ2g!{Z?}tc=ML-3-JCE6W%ljR`HI(nPMZuV;VDFlu9`r@icfoGRAs$tFG)JyOI@ zde&#SfS*6nZY?=_+p~?hm_4V)nWkw)Y->&djLseLW=#trcWTnKFzRMAIW^Vkk*J7c zDY}@I)RF4soIlO+5jXpLDUodV!kmO5!B}c$$z?zq0g|;`<)*6=OTn~i&6aiLCw`Z-QZzWA@ zUYc|_&rb>yX74fDO zQJg~EY6Ngk$qfI@e%xAVIz z(bec~fGN)-;E>?5Fxc%gfwgOnz};1>prF`%POO z`$D;s9X*q4m?o@z#LIrpvMka5NPG>z-cqXvK$)^QAvzYX-HF9OXZfLqVy6Nhj5-WF(i%QBJ9hR>u0vZ z!2&MbJVql?E$KV^V2DNm^eh^VKmZ$#(U7WzwYW<6^5LbZ*p*sIH>w(?XnJZ!s7EeK zRMOyh0TT^k7cPZ57K^HqZiEwXuTV__*aIB`ouO*$(O&|i3fWbd6&8z~_ME$}>^aYt z*G#Wx%zO6EyLuN~y>qVKMT?MM{MG3@KL1-j|6iJ3&Uj6mL+|Zb@bx^o>m66_9ar^R zuIhQ0f5GLSL^;a#xXZILXdVFfX$PDj|o|1lF(*Sst5tD$4>H zFIUWCYQSIJw7i+NVYxkQfO}Mb$~;Y;Bchju*Osz(1MS3@ShIdT@ty-l-3?(ZjLEQ% zO2d%}TFAawQ$;%2<24VGarO^2Mb;^ETpO<2%Yex`PVvk?}d zc(>^m_GYc0w6ovV?yV@Ihj9q64V^|n=hE$IkArA)q^>=WR^YH%9g`!PZietUBGG2{ zS9NO!YH*T_fTHR4LwkD$hK@-}Sa*h1RiYXXh!n3cbpZsjxtmgyiJnI&1kg!hvIv#UxK8gA7PY}dNF+RV2$8?fC&Gm00Ks?Dcu|z zrZGh~$D>+Ark(6c=gr-C&M9lzc#Ixb>p{8vz*y+qbLypB2&NNZ2}`mf(oMsWs7MbY zyTV@F-qbOQ&FcWG>~si6(O9}OIg!gjzlS4`s89oH%6PsV&x6^n@7O{fOMJLv-k$#? zPCgB=^Cja7v;PhI*WM%^ixA^8RhaN2EC8vP0KptST2gtS%Z9L}>qRS=4Zx>Fotm-jb-^tbkJBCjMq+ke9BT9%&v z3!8eh4J7{CM+cG;7qiSmo3a&H1F{McRd90wL-eDETFCqC!Xd8>FKxg;+u6&9sy|1z zv@p75I3jCMO5ug1xVrAzu|2e-<3LyFa92k^{Sgjjq=xqH>pifG-a_6V11!mZACcE2 zOAOr_jbTwP>5g$4i;nO%ony*jpRX7eQ1O;Ss!2Z}&~u0VWFc|$@SBAEXW}bgxNh{M z)$)=dbzcsKIzTyBLSL%-6&~hUJd8mn6FQk(?uiMD)*n-@Y zKMrhqWV1(qKiIy!S(r5+zxK?8EY0srQc&mPqf0leD1^+QkD4G39rTZWnAGb!mI4l@h^hs z9h$fVhWpjTW{|9M((mJ9+miWlMc`oJ$=seEoR}6jU`d`2Po-zW#*!9+ivhJ7T$7Q> zWMz)0)h$#Si&0I5;#5dl1gvpmax0lkkg0BSR{C1d-vP(eI`+cMT2r-3$Jv>gea>W< zL_#wwovrwjSr6IHa%M5xkIatE@RXJHIj+XNY=t9 zc<$j?yeKM$!h-?m+Zvp>U>P}D!O`7@+AZXeCKpCxt#d-)13x`g(TLV z*-5fjD*`?7)Ds6Q@4brje{jjwnd0LoHjtmP^=CK0T@0Pw{2*ou-LWGUAC#qo2X<}- zV=X&tIwH_@z{ZQ8v@zM-*=nzX!$)wJRVH(uYbHNVY(4jp!MWn3to`YM;%9+59VxVX z4)@njH;`YjyHD3zcsbU=GSByd4IexI@V4}!bXx?Xw zj=5z~NW=OP^ER?5tiWxg5f@1O#|0}%YQHtH_?0)zmW_C}J?yp1^<)kE;BrF~4-MR` zPvP0H41+=`F3a?1(3~<>s}8yaTAvd8l(DR}jCQcTua%QtM!!}&GmYGiu`q@AxiB43 zldpOxpYDuDBSSG!!XjR`r$1iNM}SBx5GE035xBOw61mE`PPuluo_RfnW=Lw6>p7`n z)L+tBS~wXX;LuI{B)v#GgkVG39su2VGAz?0Fs2)+r0L|iPEP(_zCcEk5{^VEF8^U- z_DZI42Jd2^mF~v%&`))D^2ca(ktL|DFgmNTC`CBbDt{mrzq9zzhzR{v%)2|~~ zk1c3+E zJ*Y|RP)r$%$daD zzN8>?mjApX6wj^xWrv@C>5+#P1q1niheYq6IZ4xmon$Tw_s5Ht-*C!DE9ocM`ENYP HtFZqA)28sy delta 5736 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 diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/harvester.py b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/harvester.py index ebcbdd416e4e..d451e77f9d0c 100644 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/harvester.py +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/harvester.py @@ -168,7 +168,10 @@ def get_protocol_version(base_url, method): pversion_re = re.compile(r'(.*?)') try: response = fetch_data(base_url, method, {'verb': 'Identify'}) - except Exception: + if isinstance(response, bytes): + response = response.decode('utf-8') + except Exception as exc: + print(f"Error fetching data: {exc}") return None m = pversion_re.search(response) if m is not None: @@ -180,6 +183,8 @@ def get_granularity(base_url, method): granularity_re = re.compile(r'(.*?)') try: response = fetch_data(base_url, method, {'verb': 'Identify'}) + if isinstance(response, bytes): + response = response.decode('utf-8') except Exception: return None m = granularity_re.search(response) @@ -214,10 +219,14 @@ def get_repository_information(base_url, method): email_re = re.compile(r'(.*?)') try: response = fetch_data(base_url, method, {'verb': 'Identify'}) + if isinstance(response, bytes): + response = response.decode('utf-8') + print(response) except Exception: return ('[ERROR: Could not fetch Identify response]', '[ERROR: Could not fetch Identify response]') name_match = name_re.search(response) + print(name_match) if name_match is None: name = '[Could not find name in Identify.]' else: diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/validator.py b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/validator.py index 7a823287e284..2ce426ffff4e 100644 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/validator.py +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/validator.py @@ -12,6 +12,8 @@ import random import urllib.request import urllib.error +import requests +from requests import Request from urllib.parse import urlencode, urlparse from urllib.request import urlopen import re @@ -26,7 +28,7 @@ from oval.harvester import configure_record_iterator, configure_request, \ get_protocol_version, check_HTTP_methods, \ - get_repository_information, get_granularity # , fetch_data + get_repository_information, get_granularity, fetch_data from oval import ISO_639_3_CODES, ISO_639_2B_CODES from oval import ISO_639_2T_CODES, ISO_639_1_CODES @@ -145,6 +147,7 @@ def __init__(self, base_url, timeout=10): self.base_url = normalize_base_url(base_url) self.timeout = timeout self.results = {} + self.session = requests.Session() # HTTP-Method supported_methods = check_HTTP_methods(self.base_url) @@ -223,13 +226,30 @@ def check_identify_base_url(self): """Compare the field baseURL in Identify response with self.base_url. Some servers redirect requests to new endpoints. """ +# try: +# response = urlopen(self.base_url) +# except Exception as exc: +# message = "Could not compare basic URLs: %s" % str(exc) +# self.results['BaseURLMatch'] = ('unverified', message) +# print('Self.base_url - ' + self.base_url) +# return +# if urlparse(response.url).netloc != urlparse(self.base_url).netloc: +# message = "Requests seem to be redirected to: %s" % response.url +# self.results["BaseURLMatch"] = ("warning", message) try: - response = urlopen(self.base_url) - except Exception as exc: + print("Self.baseurl in function in try block is " + self.base_url) + + # Make an HTTP request using requests + response = self.session.get(self.base_url, allow_redirects=True) + response.raise_for_status() # Raise an HTTPError for bad responses (4xx and 5xx) + + except requests.RequestException as exc: # Catch any requests exceptions message = "Could not compare basic URLs: %s" % str(exc) self.results['BaseURLMatch'] = ('unverified', message) - print('Self.base_url - ' + self.base_url) + print('Self.base_url in exception ' + self.base_url) return + + # Check if the URL was redirected if urlparse(response.url).netloc != urlparse(self.base_url).netloc: message = "Requests seem to be redirected to: %s" % response.url self.results["BaseURLMatch"] = ("warning", message) @@ -263,7 +283,7 @@ def validate_XML(self, verb, metadataPrefix='oai_dc', identifier=None): xml_string = etree.tounicode(tree) schema_locs = set(re.findall( r'schemaLocation="(.*?)"', xml_string, re.DOTALL)) - schema_tree = etree.XML(SCHEMA_TEMPLATE) + schema_tree = etree.XML(SCHEMA_TEMPLATE.encode('utf-8')) for s in set(schema_locs): ns_locs_raw = s.split() try: diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/validate.py b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/validate.py index 9c4cb2ef1599..cf30f53c485b 100644 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/validate.py +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/validate.py @@ -14,4 +14,6 @@ print("\nFirst argument is " + sys.argv[0]) print("\nSecond argument is " + sys.argv[1]) -validator.main({"base_url":"http://localhost:8080/server/oai/"}) +# validator.main({"base_url":"http://www.example.com"}) +# validator.main({"base_url":"http://localhost:8080/server/oai/"}) +validator.main({"base_url":sys.argv[1]}) From 58275cd6ce064e565ebcc4157f0e8c3f8f48227b Mon Sep 17 00:00:00 2001 From: Matus Kasak Date: Thu, 9 Jan 2025 14:23:28 +0100 Subject: [PATCH 5/5] Updating elements in OAIMPH check --- .../health/additionalUtilities/IOUtils.java | 41 ++++++++++ .../__pycache__/harvester.cpython-311.pyc | Bin 16183 -> 16110 bytes .../__pycache__/validator.cpython-311.pyc | Bin 41204 -> 41552 bytes .../additionalUtilities/oval/harvester.py | 26 +++--- .../additionalUtilities/oval/validator.py | 75 ++++++++---------- .../health/additionalUtilities/validate.py | 2 - dspace/config/modules/oai.cfg | 2 +- 7 files changed, 92 insertions(+), 54 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/IOUtils.java b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/IOUtils.java index cdc87fdc4283..e77e927e8ec5 100644 --- a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/IOUtils.java +++ b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/IOUtils.java @@ -10,8 +10,14 @@ import org.apache.logging.log4j.Logger; import java.io.BufferedReader; +import java.io.EOFException; import java.io.File; import java.io.InputStreamReader; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Date; public class IOUtils { private static Logger log = org.apache.logging.log4j.LogManager.getLogger(IOUtils.class); @@ -45,4 +51,39 @@ public static String runScript(File where, String[] cmd) { } return message; } + + /** + * + * @param input_file + * @return + * @throws InstantiationException + */ + static public BufferedReader safe_reader( String input_file ) + throws EOFException, InstantiationException + { + + File file = new File(input_file); + String file_id = file.getPath(); + + if( !file.exists() ) { + throw new InstantiationException( file_id + " does not exist!" ); + } + if( file.exists() && 0 == file.length() ) { + throw new EOFException( file_id + " is empty!" ); + } + + BufferedReader reader = null; + try { + reader = new BufferedReader( + new InputStreamReader(new FileInputStream(file), Charset.forName("UTF8")) ); + } catch( IOException e ) { + throw new InstantiationException( file_id + " exception while reading: " + e.toString() ); + } + + return reader; + } + + static public String today_string() { + return new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + } } diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/harvester.cpython-311.pyc b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/harvester.cpython-311.pyc index 88724b56008fc2c0706c3fa2c647235c7600f49f..70a1483a4d4cb42d5d13435cfa1b6fdacb2e342c 100644 GIT binary patch delta 2779 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 diff --git a/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/validator.cpython-311.pyc b/dspace-api/src/main/java/org/dspace/health/additionalUtilities/oval/__pycache__/validator.cpython-311.pyc index 0d1bf8b5f535889acecf91e675deced32bceafed..7327e47c431f49a37ecbb334cf92f482a7d2b7a2 100644 GIT binary patch delta 6328 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 delta 5869 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