From 82241e82b130fdde814b44e457a43691a24021f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Dec 2021 10:28:53 +0000 Subject: [PATCH 001/172] build(deps): Bump pytest-django from 4.4.0 to 4.5.2 Bumps [pytest-django](https://github.com/pytest-dev/pytest-django) from 4.4.0 to 4.5.2. - [Release notes](https://github.com/pytest-dev/pytest-django/releases) - [Changelog](https://github.com/pytest-dev/pytest-django/blob/master/docs/changelog.rst) - [Commits](https://github.com/pytest-dev/pytest-django/compare/v4.4.0...v4.5.2) --- updated-dependencies: - dependency-name: pytest-django dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 0c2323855..dd7d08b65 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -17,7 +17,7 @@ iiif-prezi==0.3.0 # https://github.com/iiif-prezi/iiif-prezi httpretty==1.1.4 # https://pypi.org/project/httpretty/ #mock==4.0.2 cssutils==2.3.0 # https://pypi.org/project/cssutils/ -pytest-django==4.4.0 # https://github.com/pytest-dev/pytest-django +pytest-django==4.5.2 # https://github.com/pytest-dev/pytest-django moto==2.2.15 # https://github.com/spulec/moto # Code quality From a6b58a5da08afc9e512f35ecb4c99046a9c8ce7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Dec 2021 10:24:56 +0000 Subject: [PATCH 002/172] build(deps): Bump argon2-cffi from 21.1.0 to 21.3.0 Bumps [argon2-cffi](https://github.com/hynek/argon2-cffi) from 21.1.0 to 21.3.0. - [Release notes](https://github.com/hynek/argon2-cffi/releases) - [Changelog](https://github.com/hynek/argon2-cffi/blob/main/CHANGELOG.md) - [Commits](https://github.com/hynek/argon2-cffi/compare/21.1.0...21.3.0) --- updated-dependencies: - dependency-name: argon2-cffi dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 4976bc701..adb6e4139 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,7 +1,7 @@ pytz==2021.3 # https://github.com/stub42/pytz python-slugify==5.0.2 # https://github.com/un33k/python-slugify Pillow -argon2-cffi==21.1.0 # https://github.com/hynek/argon2_cffi +argon2-cffi==21.3.0 # https://github.com/hynek/argon2_cffi redis==4.0.0 # https://github.com/antirez/redis bs4 pyyaml From 5719bed2ba4dbbf2622a97287bf62777cc511681 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Feb 2022 10:23:14 +0000 Subject: [PATCH 003/172] build(deps): Bump coverage from 6.1.2 to 6.3.2 Bumps [coverage](https://github.com/nedbat/coveragepy) from 6.1.2 to 6.3.2. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/6.1.2...6.3.2) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 0c2323855..69f495d59 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -23,7 +23,7 @@ moto==2.2.15 # https://github.com/spulec/moto # Code quality # ------------------------------------------------------------------------------ flake8==4.0.1 # https://github.com/PyCQA/flake8 -coverage==6.1.2 # https://github.com/nedbat/coveragepy +coverage==6.3.2 # https://github.com/nedbat/coveragepy coveralls # Django From c2a49ab06fc0ca6ad2e83dcb807fa1f2de0d97ab Mon Sep 17 00:00:00 2001 From: jcmundy Date: Wed, 16 Mar 2022 11:11:05 -0400 Subject: [PATCH 004/172] make manifest fields optional --- .../migrations/0020_auto_20220316_1510.py | 18 +++++++ .../migrations/0016_auto_20220316_1510.py | 18 +++++++ .../migrations/0037_auto_20220316_1510.py | 48 +++++++++++++++++++ apps/iiif/manifests/models.py | 12 ++--- 4 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 apps/iiif/canvases/migrations/0020_auto_20220316_1510.py create mode 100644 apps/iiif/kollections/migrations/0016_auto_20220316_1510.py create mode 100644 apps/iiif/manifests/migrations/0037_auto_20220316_1510.py diff --git a/apps/iiif/canvases/migrations/0020_auto_20220316_1510.py b/apps/iiif/canvases/migrations/0020_auto_20220316_1510.py new file mode 100644 index 000000000..ba28d8979 --- /dev/null +++ b/apps/iiif/canvases/migrations/0020_auto_20220316_1510.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('canvases', '0019_auto_20220203_1900'), + ] + + operations = [ + migrations.AlterField( + model_name='canvas', + name='pid', + field=models.CharField(default='2r83gk66', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/kollections/migrations/0016_auto_20220316_1510.py b/apps/iiif/kollections/migrations/0016_auto_20220316_1510.py new file mode 100644 index 000000000..1484d3eb9 --- /dev/null +++ b/apps/iiif/kollections/migrations/0016_auto_20220316_1510.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('kollections', '0015_auto_20220203_1900'), + ] + + operations = [ + migrations.AlterField( + model_name='collection', + name='pid', + field=models.CharField(default='2r83gk66', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/manifests/migrations/0037_auto_20220316_1510.py b/apps/iiif/manifests/migrations/0037_auto_20220316_1510.py new file mode 100644 index 000000000..5053dc624 --- /dev/null +++ b/apps/iiif/manifests/migrations/0037_auto_20220316_1510.py @@ -0,0 +1,48 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('manifests', '0036_auto_20220203_1900'), + ] + + operations = [ + migrations.AlterField( + model_name='manifest', + name='author', + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name='manifest', + name='pdf', + field=models.URLField(blank=True, null=True), + ), + migrations.AlterField( + model_name='manifest', + name='pid', + field=models.CharField(default='2r83gk66', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + migrations.AlterField( + model_name='manifest', + name='published_city', + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name='manifest', + name='published_date', + field=models.CharField(blank=True, max_length=25, null=True), + ), + migrations.AlterField( + model_name='manifest', + name='publisher', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AlterField( + model_name='manifest', + name='summary', + field=models.TextField(blank=True, null=True), + ), + ] diff --git a/apps/iiif/manifests/models.py b/apps/iiif/manifests/models.py index 98f6bd2ed..c70ac4960 100644 --- a/apps/iiif/manifests/models.py +++ b/apps/iiif/manifests/models.py @@ -81,11 +81,11 @@ class Manifest(IiifBase): ('left-to-right', 'Left to Right'), ('right-to-left', 'Right to Left') ) - summary = models.TextField() - author = models.TextField(null=True) - published_city = models.TextField(null=True) - published_date = models.CharField(max_length=25) - publisher = models.CharField(max_length=255) + summary = models.TextField(null=True, blank=True) + author = models.TextField(null=True, blank=True) + published_city = models.TextField(null=True, blank=True) + published_date = models.CharField(max_length=25, null=True, blank=True) + publisher = models.CharField(max_length=255, null=True, blank=True) attribution = models.CharField( max_length=255, null=True, @@ -107,7 +107,7 @@ class Manifest(IiifBase): help_text="Only enter a URI to a license statement." ) collections = models.ManyToManyField(Collection, blank=True, related_name='manifests') - pdf = models.URLField() + pdf = models.URLField(null=True, blank=True) metadata = JSONField(default=dict, blank=True) viewingdirection = models.CharField(max_length=13, choices=DIRECTIONS, default="left-to-right") created_at = models.DateTimeField(auto_now_add=True) From 7359d1c6e239d197e1102619883ca3f5979ee8e1 Mon Sep 17 00:00:00 2001 From: jcmundy Date: Wed, 16 Mar 2022 11:20:32 -0400 Subject: [PATCH 005/172] help text and publisher to textfield --- .../migrations/0021_auto_20220316_1519.py | 18 ++++++++++ .../migrations/0017_auto_20220316_1519.py | 18 ++++++++++ .../migrations/0038_auto_20220316_1519.py | 33 +++++++++++++++++++ apps/iiif/manifests/models.py | 6 ++-- 4 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 apps/iiif/canvases/migrations/0021_auto_20220316_1519.py create mode 100644 apps/iiif/kollections/migrations/0017_auto_20220316_1519.py create mode 100644 apps/iiif/manifests/migrations/0038_auto_20220316_1519.py diff --git a/apps/iiif/canvases/migrations/0021_auto_20220316_1519.py b/apps/iiif/canvases/migrations/0021_auto_20220316_1519.py new file mode 100644 index 000000000..d9eb2edcd --- /dev/null +++ b/apps/iiif/canvases/migrations/0021_auto_20220316_1519.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('canvases', '0020_auto_20220316_1510'), + ] + + operations = [ + migrations.AlterField( + model_name='canvas', + name='pid', + field=models.CharField(default='2r97h737', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/kollections/migrations/0017_auto_20220316_1519.py b/apps/iiif/kollections/migrations/0017_auto_20220316_1519.py new file mode 100644 index 000000000..53f2ccc84 --- /dev/null +++ b/apps/iiif/kollections/migrations/0017_auto_20220316_1519.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('kollections', '0016_auto_20220316_1510'), + ] + + operations = [ + migrations.AlterField( + model_name='collection', + name='pid', + field=models.CharField(default='2r97h737', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/manifests/migrations/0038_auto_20220316_1519.py b/apps/iiif/manifests/migrations/0038_auto_20220316_1519.py new file mode 100644 index 000000000..bf14b92b5 --- /dev/null +++ b/apps/iiif/manifests/migrations/0038_auto_20220316_1519.py @@ -0,0 +1,33 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('manifests', '0037_auto_20220316_1510'), + ] + + operations = [ + migrations.AlterField( + model_name='manifest', + name='author', + field=models.TextField(blank=True, help_text='Enter multiple entities separated by a semicolon (;).', null=True), + ), + migrations.AlterField( + model_name='manifest', + name='pid', + field=models.CharField(default='2r97h737', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + migrations.AlterField( + model_name='manifest', + name='published_city', + field=models.TextField(blank=True, help_text='Enter multiple entities separated by a semicolon (;).', null=True), + ), + migrations.AlterField( + model_name='manifest', + name='publisher', + field=models.TextField(blank=True, help_text='Enter multiple entities separated by a semicolon (;).', null=True), + ), + ] diff --git a/apps/iiif/manifests/models.py b/apps/iiif/manifests/models.py index c70ac4960..c368364d4 100644 --- a/apps/iiif/manifests/models.py +++ b/apps/iiif/manifests/models.py @@ -82,10 +82,10 @@ class Manifest(IiifBase): ('right-to-left', 'Right to Left') ) summary = models.TextField(null=True, blank=True) - author = models.TextField(null=True, blank=True) - published_city = models.TextField(null=True, blank=True) + author = models.TextField(null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") + published_city = models.TextField(null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") published_date = models.CharField(max_length=25, null=True, blank=True) - publisher = models.CharField(max_length=255, null=True, blank=True) + publisher = models.TextField(null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") attribution = models.CharField( max_length=255, null=True, From 62c2c51fa12678549124e15732ce679d5cf44470 Mon Sep 17 00:00:00 2001 From: jcmundy Date: Wed, 16 Mar 2022 11:37:17 -0400 Subject: [PATCH 006/172] new fields to admin --- .../migrations/0022_auto_20220316_1530.py | 18 +++++++++ .../migrations/0018_auto_20220316_1530.py | 18 +++++++++ apps/iiif/manifests/forms.py | 4 +- .../migrations/0039_auto_20220316_1530.py | 38 +++++++++++++++++++ apps/iiif/manifests/models.py | 6 ++- 5 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 apps/iiif/canvases/migrations/0022_auto_20220316_1530.py create mode 100644 apps/iiif/kollections/migrations/0018_auto_20220316_1530.py create mode 100644 apps/iiif/manifests/migrations/0039_auto_20220316_1530.py diff --git a/apps/iiif/canvases/migrations/0022_auto_20220316_1530.py b/apps/iiif/canvases/migrations/0022_auto_20220316_1530.py new file mode 100644 index 000000000..1d5a78aa2 --- /dev/null +++ b/apps/iiif/canvases/migrations/0022_auto_20220316_1530.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('canvases', '0021_auto_20220316_1519'), + ] + + operations = [ + migrations.AlterField( + model_name='canvas', + name='pid', + field=models.CharField(default='2r7vqn48', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/kollections/migrations/0018_auto_20220316_1530.py b/apps/iiif/kollections/migrations/0018_auto_20220316_1530.py new file mode 100644 index 000000000..626a2b63b --- /dev/null +++ b/apps/iiif/kollections/migrations/0018_auto_20220316_1530.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('kollections', '0017_auto_20220316_1519'), + ] + + operations = [ + migrations.AlterField( + model_name='collection', + name='pid', + field=models.CharField(default='2r7vqn48', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/manifests/forms.py b/apps/iiif/manifests/forms.py index a0a548b66..3c5c1eae8 100644 --- a/apps/iiif/manifests/forms.py +++ b/apps/iiif/manifests/forms.py @@ -21,9 +21,9 @@ class Meta: model = Manifest fields = ( 'id', 'pid', 'label', 'summary', 'author', - 'published_city', 'published_date', 'publisher', + 'published_city', 'published_date', 'publisher', 'language', 'pdf', 'metadata', 'viewingdirection', 'collections', - 'image_server', 'start_canvas', 'attribution', 'logo', 'license' + 'image_server', 'start_canvas', 'attribution', 'logo', 'license', 'scanned_by', 'identifier', 'identifier_uri' ) def __init__(self, *args, **kwargs): super(ManifestAdminForm, self).__init__(*args, **kwargs) diff --git a/apps/iiif/manifests/migrations/0039_auto_20220316_1530.py b/apps/iiif/manifests/migrations/0039_auto_20220316_1530.py new file mode 100644 index 000000000..97fed9f6c --- /dev/null +++ b/apps/iiif/manifests/migrations/0039_auto_20220316_1530.py @@ -0,0 +1,38 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('manifests', '0038_auto_20220316_1519'), + ] + + operations = [ + migrations.AddField( + model_name='manifest', + name='identifier', + field=models.CharField(blank=True, help_text='Call number or other unique id.', max_length=255, null=True), + ), + migrations.AddField( + model_name='manifest', + name='identifier_uri', + field=models.URLField(blank=True, help_text='Only enter a link to a catalog record.', null=True), + ), + migrations.AddField( + model_name='manifest', + name='language', + field=models.CharField(blank=True, help_text='Enter multiple entities separated by a semicolon (;).', max_length=255, null=True), + ), + migrations.AddField( + model_name='manifest', + name='scanned_by', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AlterField( + model_name='manifest', + name='pid', + field=models.CharField(default='2r7vqn48', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/manifests/models.py b/apps/iiif/manifests/models.py index c368364d4..f410f15f7 100644 --- a/apps/iiif/manifests/models.py +++ b/apps/iiif/manifests/models.py @@ -86,6 +86,7 @@ class Manifest(IiifBase): published_city = models.TextField(null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") published_date = models.CharField(max_length=25, null=True, blank=True) publisher = models.TextField(null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") + language = models.CharField(max_length=255, null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") attribution = models.CharField( max_length=255, null=True, @@ -106,8 +107,11 @@ class Manifest(IiifBase): default="https://creativecommons.org/publicdomain/zero/1.0/", help_text="Only enter a URI to a license statement." ) + scanned_by = models.CharField(max_length=255, null=True, blank=True) + identifier = models.CharField(max_length=255, null=True, blank=True, help_text="Call number or other unique id.") + identifier_uri = models.URLField(null=True, blank=True, help_text="Only enter a link to a catalog record.") collections = models.ManyToManyField(Collection, blank=True, related_name='manifests') - pdf = models.URLField(null=True, blank=True) + pdf = models.URLField(null=True, blank=True, help_text="Enter a link to an online pdf.") metadata = JSONField(default=dict, blank=True) viewingdirection = models.CharField(max_length=13, choices=DIRECTIONS, default="left-to-right") created_at = models.DateTimeField(auto_now_add=True) From d94dbde674cf4c3a626aee1aa21a02e642f2871d Mon Sep 17 00:00:00 2001 From: jcmundy Date: Wed, 16 Mar 2022 12:29:08 -0400 Subject: [PATCH 007/172] added edtf --- .../migrations/0023_auto_20220316_1549.py | 18 +++++++ .../migrations/0024_auto_20220316_1611.py | 18 +++++++ .../migrations/0025_auto_20220316_1612.py | 18 +++++++ .../migrations/0019_auto_20220316_1549.py | 18 +++++++ .../migrations/0020_auto_20220316_1611.py | 18 +++++++ .../migrations/0021_auto_20220316_1612.py | 18 +++++++ apps/iiif/manifests/forms.py | 2 +- .../migrations/0040_auto_20220316_1549.py | 54 +++++++++++++++++++ .../migrations/0041_auto_20220316_1611.py | 29 ++++++++++ .../migrations/0042_auto_20220316_1612.py | 29 ++++++++++ apps/iiif/manifests/models.py | 20 ++++++- requirements/base.txt | 1 + 12 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 apps/iiif/canvases/migrations/0023_auto_20220316_1549.py create mode 100644 apps/iiif/canvases/migrations/0024_auto_20220316_1611.py create mode 100644 apps/iiif/canvases/migrations/0025_auto_20220316_1612.py create mode 100644 apps/iiif/kollections/migrations/0019_auto_20220316_1549.py create mode 100644 apps/iiif/kollections/migrations/0020_auto_20220316_1611.py create mode 100644 apps/iiif/kollections/migrations/0021_auto_20220316_1612.py create mode 100644 apps/iiif/manifests/migrations/0040_auto_20220316_1549.py create mode 100644 apps/iiif/manifests/migrations/0041_auto_20220316_1611.py create mode 100644 apps/iiif/manifests/migrations/0042_auto_20220316_1612.py diff --git a/apps/iiif/canvases/migrations/0023_auto_20220316_1549.py b/apps/iiif/canvases/migrations/0023_auto_20220316_1549.py new file mode 100644 index 000000000..3cff6cc64 --- /dev/null +++ b/apps/iiif/canvases/migrations/0023_auto_20220316_1549.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('canvases', '0022_auto_20220316_1530'), + ] + + operations = [ + migrations.AlterField( + model_name='canvas', + name='pid', + field=models.CharField(default='2r8kvr0m', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/canvases/migrations/0024_auto_20220316_1611.py b/apps/iiif/canvases/migrations/0024_auto_20220316_1611.py new file mode 100644 index 000000000..d701e5078 --- /dev/null +++ b/apps/iiif/canvases/migrations/0024_auto_20220316_1611.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 16:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('canvases', '0023_auto_20220316_1549'), + ] + + operations = [ + migrations.AlterField( + model_name='canvas', + name='pid', + field=models.CharField(default='2r7xbj80', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/canvases/migrations/0025_auto_20220316_1612.py b/apps/iiif/canvases/migrations/0025_auto_20220316_1612.py new file mode 100644 index 000000000..3851abe53 --- /dev/null +++ b/apps/iiif/canvases/migrations/0025_auto_20220316_1612.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 16:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('canvases', '0024_auto_20220316_1611'), + ] + + operations = [ + migrations.AlterField( + model_name='canvas', + name='pid', + field=models.CharField(default='2r84kvmd', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/kollections/migrations/0019_auto_20220316_1549.py b/apps/iiif/kollections/migrations/0019_auto_20220316_1549.py new file mode 100644 index 000000000..4eec13132 --- /dev/null +++ b/apps/iiif/kollections/migrations/0019_auto_20220316_1549.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('kollections', '0018_auto_20220316_1530'), + ] + + operations = [ + migrations.AlterField( + model_name='collection', + name='pid', + field=models.CharField(default='2r8kvr0m', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/kollections/migrations/0020_auto_20220316_1611.py b/apps/iiif/kollections/migrations/0020_auto_20220316_1611.py new file mode 100644 index 000000000..9c81b16ca --- /dev/null +++ b/apps/iiif/kollections/migrations/0020_auto_20220316_1611.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 16:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('kollections', '0019_auto_20220316_1549'), + ] + + operations = [ + migrations.AlterField( + model_name='collection', + name='pid', + field=models.CharField(default='2r7xbj80', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/kollections/migrations/0021_auto_20220316_1612.py b/apps/iiif/kollections/migrations/0021_auto_20220316_1612.py new file mode 100644 index 000000000..50a30a658 --- /dev/null +++ b/apps/iiif/kollections/migrations/0021_auto_20220316_1612.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-16 16:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('kollections', '0020_auto_20220316_1611'), + ] + + operations = [ + migrations.AlterField( + model_name='collection', + name='pid', + field=models.CharField(default='2r84kvmd', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/manifests/forms.py b/apps/iiif/manifests/forms.py index 3c5c1eae8..9f3e20675 100644 --- a/apps/iiif/manifests/forms.py +++ b/apps/iiif/manifests/forms.py @@ -21,7 +21,7 @@ class Meta: model = Manifest fields = ( 'id', 'pid', 'label', 'summary', 'author', - 'published_city', 'published_date', 'publisher', 'language', + 'published_city', 'published_date', 'published_date_edtf', 'publisher', 'language', 'pdf', 'metadata', 'viewingdirection', 'collections', 'image_server', 'start_canvas', 'attribution', 'logo', 'license', 'scanned_by', 'identifier', 'identifier_uri' ) diff --git a/apps/iiif/manifests/migrations/0040_auto_20220316_1549.py b/apps/iiif/manifests/migrations/0040_auto_20220316_1549.py new file mode 100644 index 000000000..f5d971f40 --- /dev/null +++ b/apps/iiif/manifests/migrations/0040_auto_20220316_1549.py @@ -0,0 +1,54 @@ +# Generated by Django 2.2.24 on 2022-03-16 15:49 + +from django.db import migrations, models +import edtf.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('manifests', '0039_auto_20220316_1530'), + ] + + operations = [ + migrations.AddField( + model_name='manifest', + name='date_earliest', + field=models.FloatField(blank=True, null=True), + ), + migrations.AddField( + model_name='manifest', + name='date_latest', + field=models.FloatField(blank=True, null=True), + ), + migrations.AddField( + model_name='manifest', + name='date_sort_ascending', + field=models.FloatField(blank=True, null=True), + ), + migrations.AddField( + model_name='manifest', + name='date_sort_descending', + field=models.FloatField(blank=True, null=True), + ), + migrations.AddField( + model_name='manifest', + name='published_date_edtf', + field=edtf.fields.EDTFField(blank=True, help_text='Use standard EDTF dates. For examples go to https://github.com/ixc/python-edtf#natural-language-representation', lower_fuzzy_field='date_earliest', lower_strict_field='date_sort_ascending', natural_text_field='published_date', null=True, upper_fuzzy_field='date_latest', upper_strict_field='date_sort_descending', verbose_name='Date of creation (EDTF)'), + ), + migrations.AlterField( + model_name='manifest', + name='pdf', + field=models.URLField(blank=True, help_text='Enter a link to an online pdf.', null=True), + ), + migrations.AlterField( + model_name='manifest', + name='pid', + field=models.CharField(default='2r8kvr0m', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + migrations.AlterField( + model_name='manifest', + name='published_date', + field=models.CharField(blank=True, max_length=255, null=True), + ), + ] diff --git a/apps/iiif/manifests/migrations/0041_auto_20220316_1611.py b/apps/iiif/manifests/migrations/0041_auto_20220316_1611.py new file mode 100644 index 000000000..575689053 --- /dev/null +++ b/apps/iiif/manifests/migrations/0041_auto_20220316_1611.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2.24 on 2022-03-16 16:11 + +from django.db import migrations, models +import edtf.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('manifests', '0040_auto_20220316_1549'), + ] + + operations = [ + migrations.AddField( + model_name='manifest', + name='date_edtf', + field=edtf.fields.EDTFField(blank=True, help_text="Use standard EDTF dates. For examples go to https://github.com/ixc/python-edtf#natural-language-representation", lower_fuzzy_field='date_earliest', lower_strict_field='date_sort_ascending', natural_text_field='published_date_edtf', null=True, upper_fuzzy_field='date_latest', upper_strict_field='date_sort_descending', verbose_name='Date of creation (EDTF)'), + ), + migrations.AlterField( + model_name='manifest', + name='pid', + field=models.CharField(default='2r7xbj80', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + migrations.AlterField( + model_name='manifest', + name='published_date_edtf', + field=models.CharField(blank=True, max_length=255, null=True), + ), + ] diff --git a/apps/iiif/manifests/migrations/0042_auto_20220316_1612.py b/apps/iiif/manifests/migrations/0042_auto_20220316_1612.py new file mode 100644 index 000000000..3e95a4e5a --- /dev/null +++ b/apps/iiif/manifests/migrations/0042_auto_20220316_1612.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2.24 on 2022-03-16 16:12 + +from django.db import migrations, models +import edtf.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('manifests', '0041_auto_20220316_1611'), + ] + + operations = [ + migrations.AlterField( + model_name='manifest', + name='date_edtf', + field=edtf.fields.EDTFField(blank=True, lower_fuzzy_field='date_earliest', lower_strict_field='date_sort_ascending', natural_text_field='published_date_edtf', null=True, upper_fuzzy_field='date_latest', upper_strict_field='date_sort_descending', verbose_name='Date of creation (EDTF)'), + ), + migrations.AlterField( + model_name='manifest', + name='pid', + field=models.CharField(default='2r84kvmd', help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + migrations.AlterField( + model_name='manifest', + name='published_date_edtf', + field=models.CharField(blank=True, help_text="Use standard EDTF dates. For examples go to https://github.com/ixc/python-edtf#natural-language-representation", max_length=255, null=True), + ), + ] diff --git a/apps/iiif/manifests/models.py b/apps/iiif/manifests/models.py index f410f15f7..fc32a723e 100644 --- a/apps/iiif/manifests/models.py +++ b/apps/iiif/manifests/models.py @@ -12,6 +12,7 @@ from django.contrib.contenttypes.models import ContentType from django.conf import settings from modelcluster.models import ClusterableModel +from edtf.fields import EDTFField import config.settings.local as settings from ..choices import Choices from ..kollections.models import Collection @@ -84,7 +85,24 @@ class Manifest(IiifBase): summary = models.TextField(null=True, blank=True) author = models.TextField(null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") published_city = models.TextField(null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") - published_date = models.CharField(max_length=25, null=True, blank=True) + published_date = models.CharField(max_length=255, null=True, blank=True) + published_date_edtf = models.CharField(max_length=255, null=True, blank=True, help_text="Use standard EDTF dates. For examples go to https://github.com/ixc/python-edtf#natural-language-representation") + date_edtf = EDTFField( + "Date of creation (EDTF)", + natural_text_field='published_date_edtf', + lower_fuzzy_field='date_earliest', + upper_fuzzy_field='date_latest', + lower_strict_field='date_sort_ascending', + upper_strict_field='date_sort_descending', + blank=True, + null=True, + ) + # use for filtering + date_earliest = models.FloatField(blank=True, null=True) + date_latest = models.FloatField(blank=True, null=True) + # use for sorting + date_sort_ascending = models.FloatField(blank=True, null=True) + date_sort_descending = models.FloatField(blank=True, null=True) publisher = models.TextField(null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") language = models.CharField(max_length=255, null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") attribution = models.CharField( diff --git a/requirements/base.txt b/requirements/base.txt index 4976bc701..a2f4a11f0 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -9,6 +9,7 @@ progress python-memcached==1.59 pyld==1.0.5 hocr-spec==0.2.0 +edtf # Django # ------------------------------------------------------------------------------ From 14e18e6c2e0fc551dc49e79f64e981e9d2d61b50 Mon Sep 17 00:00:00 2001 From: Jay Varner Date: Mon, 21 Mar 2022 08:48:33 -0400 Subject: [PATCH 008/172] Use BCP 47 language codes --- apps/iiif/choices.py | 8122 +----------------------------------------- 1 file changed, 2 insertions(+), 8120 deletions(-) diff --git a/apps/iiif/choices.py b/apps/iiif/choices.py index eb20b3d42..0a10fe196 100644 --- a/apps/iiif/choices.py +++ b/apps/iiif/choices.py @@ -1,5 +1,5 @@ """ Collection of choices to be used in choice fields. """ -from django.utils.translation import gettext as _ +from bcp47 import languages class Choices(): """ Collection of choices to be used in choice fields. """ @@ -15,8123 +15,5 @@ class Choices(): """ List of languages for use in model choice fields. - Code taken from https://github.com/audiolion/django-language-field - Thanks audiolion! """ - LANGUAGES = ( - ("aa", _(u"Afar")), - ("ab", _(u"Abkhazian")), - ("ae", _(u"Avestan")), - ("af", _(u"Afrikaans")), - ("ak", _(u"Akan")), - ("am", _(u"Amharic")), - ("an", _(u"Aragonese")), - ("ar", _(u"Arabic")), - ("as", _(u"Assamese")), - ("av", _(u"Avaric")), - ("ay", _(u"Aymara")), - ("az", _(u"Azerbaijani")), - ("ba", _(u"Bashkir")), - ("be", _(u"Belarusian")), - ("bg", _(u"Bulgarian")), - ("bh", _(u"Bihari languages")), - ("bi", _(u"Bislama")), - ("bm", _(u"Bambara")), - ("bn", _(u"Bengali")), - ("bo", _(u"Tibetan")), - ("br", _(u"Breton")), - ("bs", _(u"Bosnian")), - ("ca", _(u"Catalan")), - ("ce", _(u"Chechen")), - ("ch", _(u"Chamorro")), - ("co", _(u"Corsican")), - ("cr", _(u"Cree")), - ("cs", _(u"Czech")), - ("cu", _(u"Church Slavic")), - ("cv", _(u"Chuvash")), - ("cy", _(u"Welsh")), - ("da", _(u"Danish")), - ("de", _(u"German")), - ("dv", _(u"Dhivehi")), - ("dz", _(u"Dzongkha")), - ("ee", _(u"Ewe")), - ("el", _(u"Modern Greek")), - ("en", _(u"English")), - ("eo", _(u"Esperanto")), - ("es", _(u"Spanish")), - ("et", _(u"Estonian")), - ("eu", _(u"Basque")), - ("fa", _(u"Persian")), - ("ff", _(u"Fulah")), - ("fi", _(u"Finnish")), - ("fj", _(u"Fijian")), - ("fo", _(u"Faroese")), - ("fr", _(u"French")), - ("fy", _(u"Western Frisian")), - ("ga", _(u"Irish")), - ("gd", _(u"Scottish Gaelic")), - ("gl", _(u"Galician")), - ("gn", _(u"Guarani")), - ("gu", _(u"Gujarati")), - ("gv", _(u"Manx")), - ("ha", _(u"Hausa")), - ("he", _(u"Hebrew")), - ("hi", _(u"Hindi")), - ("ho", _(u"Hiri Motu")), - ("hr", _(u"Croatian")), - ("ht", _(u"Haitian")), - ("hu", _(u"Hungarian")), - ("hy", _(u"Armenian")), - ("hz", _(u"Herero")), - ("ia", _(u"Interlingua")), - ("id", _(u"Indonesian")), - ("ie", _(u"Interlingue")), - ("ig", _(u"Igbo")), - ("ii", _(u"Sichuan Yi")), - ("ik", _(u"Inupiaq")), - ("in", _(u"Indonesian")), - ("io", _(u"Ido")), - ("is", _(u"Icelandic")), - ("it", _(u"Italian")), - ("iu", _(u"Inuktitut")), - ("iw", _(u"Hebrew")), - ("ja", _(u"Japanese")), - ("ji", _(u"Yiddish")), - ("jv", _(u"Javanese")), - ("jw", _(u"Javanese")), - ("ka", _(u"Georgian")), - ("kg", _(u"Kongo")), - ("ki", _(u"Kikuyu")), - ("kj", _(u"Kuanyama")), - ("kk", _(u"Kazakh")), - ("kl", _(u"Kalaallisut")), - ("km", _(u"Central Khmer")), - ("kn", _(u"Kannada")), - ("ko", _(u"Korean")), - ("kr", _(u"Kanuri")), - ("ks", _(u"Kashmiri")), - ("ku", _(u"Kurdish")), - ("kv", _(u"Komi")), - ("kw", _(u"Cornish")), - ("ky", _(u"Kirghiz")), - ("la", _(u"Latin")), - ("lb", _(u"Luxembourgish")), - ("lg", _(u"Ganda")), - ("li", _(u"Limburgan")), - ("ln", _(u"Lingala")), - ("lo", _(u"Lao")), - ("lt", _(u"Lithuanian")), - ("lu", _(u"Luba-Katanga")), - ("lv", _(u"Latvian")), - ("mg", _(u"Malagasy")), - ("mh", _(u"Marshallese")), - ("mi", _(u"Maori")), - ("mk", _(u"Macedonian")), - ("ml", _(u"Malayalam")), - ("mn", _(u"Mongolian")), - ("mo", _(u"Moldavian")), - ("mr", _(u"Marathi")), - ("ms", _(u"Malay")), - ("mt", _(u"Maltese")), - ("my", _(u"Burmese")), - ("na", _(u"Nauru")), - ("nb", _(u"Norwegian Bokmål")), - ("nd", _(u"North Ndebele")), - ("ne", _(u"Nepali")), - ("ng", _(u"Ndonga")), - ("nl", _(u"Dutch")), - ("nn", _(u"Norwegian Nynorsk")), - ("no", _(u"Norwegian")), - ("nr", _(u"South Ndebele")), - ("nv", _(u"Navajo")), - ("ny", _(u"Nyanja")), - ("oc", _(u"Occitan")), - ("oj", _(u"Ojibwa")), - ("om", _(u"Oromo")), - ("or", _(u"Oriya")), - ("os", _(u"Ossetian")), - ("pa", _(u"Panjabi")), - ("pi", _(u"Pali")), - ("pl", _(u"Polish")), - ("ps", _(u"Pushto")), - ("pt", _(u"Portuguese")), - ("qu", _(u"Quechua")), - ("rm", _(u"Romansh")), - ("rn", _(u"Rundi")), - ("ro", _(u"Romanian")), - ("ru", _(u"Russian")), - ("rw", _(u"Kinyarwanda")), - ("sa", _(u"Sanskrit")), - ("sc", _(u"Sardinian")), - ("sd", _(u"Sindhi")), - ("se", _(u"Northern Sami")), - ("sg", _(u"Sango")), - ("sh", _(u"Serbo-Croatian")), - ("si", _(u"Sinhala")), - ("sk", _(u"Slovak")), - ("sl", _(u"Slovenian")), - ("sm", _(u"Samoan")), - ("sn", _(u"Shona")), - ("so", _(u"Somali")), - ("sq", _(u"Albanian")), - ("sr", _(u"Serbian")), - ("ss", _(u"Swati")), - ("st", _(u"Southern Sotho")), - ("su", _(u"Sundanese")), - ("sv", _(u"Swedish")), - ("sw", _(u"Swahili")), - ("ta", _(u"Tamil")), - ("te", _(u"Telugu")), - ("tg", _(u"Tajik")), - ("th", _(u"Thai")), - ("ti", _(u"Tigrinya")), - ("tk", _(u"Turkmen")), - ("tl", _(u"Tagalog")), - ("tn", _(u"Tswana")), - ("to", _(u"Tonga")), - ("tr", _(u"Turkish")), - ("ts", _(u"Tsonga")), - ("tt", _(u"Tatar")), - ("tw", _(u"Twi")), - ("ty", _(u"Tahitian")), - ("ug", _(u"Uighur")), - ("uk", _(u"Ukrainian")), - ("ur", _(u"Urdu")), - ("uz", _(u"Uzbek")), - ("ve", _(u"Venda")), - ("vi", _(u"Vietnamese")), - ("vo", _(u"Volapük")), - ("wa", _(u"Walloon")), - ("wo", _(u"Wolof")), - ("xh", _(u"Xhosa")), - ("yi", _(u"Yiddish")), - ("yo", _(u"Yoruba")), - ("za", _(u"Zhuang")), - ("zh", _(u"Chinese")), - ("zu", _(u"Zulu")), - ("aaa", _(u"Ghotuo")), - ("aab", _(u"Alumu-Tesu")), - ("aac", _(u"Ari")), - ("aad", _(u"Amal")), - ("aae", _(u"Arbëreshë Albanian")), - ("aaf", _(u"Aranadan")), - ("aag", _(u"Ambrak")), - ("aah", _(u"Abu' Arapesh")), - ("aai", _(u"Arifama-Miniafia")), - ("aak", _(u"Ankave")), - ("aal", _(u"Afade")), - ("aam", _(u"Aramanik")), - ("aan", _(u"Anambé")), - ("aao", _(u"Algerian Saharan Arabic")), - ("aap", _(u"Pará Arára")), - ("aaq", _(u"Eastern Abnaki")), - ("aas", _(u"Aasáx")), - ("aat", _(u"Arvanitika Albanian")), - ("aau", _(u"Abau")), - ("aav", _(u"Austro-Asiatic languages")), - ("aaw", _(u"Solong")), - ("aax", _(u"Mandobo Atas")), - ("aaz", _(u"Amarasi")), - ("aba", _(u"Abé")), - ("abb", _(u"Bankon")), - ("abc", _(u"Ambala Ayta")), - ("abd", _(u"Manide")), - ("abe", _(u"Western Abnaki")), - ("abf", _(u"Abai Sungai")), - ("abg", _(u"Abaga")), - ("abh", _(u"Tajiki Arabic")), - ("abi", _(u"Abidji")), - ("abj", _(u"Aka-Bea")), - ("abl", _(u"Lampung Nyo")), - ("abm", _(u"Abanyom")), - ("abn", _(u"Abua")), - ("abo", _(u"Abon")), - ("abp", _(u"Abellen Ayta")), - ("abq", _(u"Abaza")), - ("abr", _(u"Abron")), - ("abs", _(u"Ambonese Malay")), - ("abt", _(u"Ambulas")), - ("abu", _(u"Abure")), - ("abv", _(u"Baharna Arabic")), - ("abw", _(u"Pal")), - ("abx", _(u"Inabaknon")), - ("aby", _(u"Aneme Wake")), - ("abz", _(u"Abui")), - ("aca", _(u"Achagua")), - ("acb", _(u"Áncá")), - ("acd", _(u"Gikyode")), - ("ace", _(u"Achinese")), - ("acf", _(u"Saint Lucian Creole French")), - ("ach", _(u"Acoli")), - ("aci", _(u"Aka-Cari")), - ("ack", _(u"Aka-Kora")), - ("acl", _(u"Akar-Bale")), - ("acm", _(u"Mesopotamian Arabic")), - ("acn", _(u"Achang")), - ("acp", _(u"Eastern Acipa")), - ("acq", _(u"Ta'izzi-Adeni Arabic")), - ("acr", _(u"Achi")), - ("acs", _(u"Acroá")), - ("act", _(u"Achterhoeks")), - ("acu", _(u"Achuar-Shiwiar")), - ("acv", _(u"Achumawi")), - ("acw", _(u"Hijazi Arabic")), - ("acx", _(u"Omani Arabic")), - ("acy", _(u"Cypriot Arabic")), - ("acz", _(u"Acheron")), - ("ada", _(u"Adangme")), - ("adb", _(u"Adabe")), - ("add", _(u"Dzodinka")), - ("ade", _(u"Adele")), - ("adf", _(u"Dhofari Arabic")), - ("adg", _(u"Andegerebinha")), - ("adh", _(u"Adhola")), - ("adi", _(u"Adi")), - ("adj", _(u"Adioukrou")), - ("adl", _(u"Galo")), - ("adn", _(u"Adang")), - ("ado", _(u"Abu")), - ("adp", _(u"Adap")), - ("adq", _(u"Adangbe")), - ("adr", _(u"Adonara")), - ("ads", _(u"Adamorobe Sign Language")), - ("adt", _(u"Adnyamathanha")), - ("adu", _(u"Aduge")), - ("adw", _(u"Amundava")), - ("adx", _(u"Amdo Tibetan")), - ("ady", _(u"Adyghe")), - ("adz", _(u"Adzera")), - ("aea", _(u"Areba")), - ("aeb", _(u"Tunisian Arabic")), - ("aec", _(u"Saidi Arabic")), - ("aed", _(u"Argentine Sign Language")), - ("aee", _(u"Northeast Pashai")), - ("aek", _(u"Haeke")), - ("ael", _(u"Ambele")), - ("aem", _(u"Arem")), - ("aen", _(u"Armenian Sign Language")), - ("aeq", _(u"Aer")), - ("aer", _(u"Eastern Arrernte")), - ("aes", _(u"Alsea")), - ("aeu", _(u"Akeu")), - ("aew", _(u"Ambakich")), - ("aey", _(u"Amele")), - ("aez", _(u"Aeka")), - ("afa", _(u"Afro-Asiatic languages")), - ("afb", _(u"Gulf Arabic")), - ("afd", _(u"Andai")), - ("afe", _(u"Putukwam")), - ("afg", _(u"Afghan Sign Language")), - ("afh", _(u"Afrihili")), - ("afi", _(u"Akrukay")), - ("afk", _(u"Nanubae")), - ("afn", _(u"Defaka")), - ("afo", _(u"Eloyi")), - ("afp", _(u"Tapei")), - ("afs", _(u"Afro-Seminole Creole")), - ("aft", _(u"Afitti")), - ("afu", _(u"Awutu")), - ("afz", _(u"Obokuitai")), - ("aga", _(u"Aguano")), - ("agb", _(u"Legbo")), - ("agc", _(u"Agatu")), - ("agd", _(u"Agarabi")), - ("age", _(u"Angal")), - ("agf", _(u"Arguni")), - ("agg", _(u"Angor")), - ("agh", _(u"Ngelima")), - ("agi", _(u"Agariya")), - ("agj", _(u"Argobba")), - ("agk", _(u"Isarog Agta")), - ("agl", _(u"Fembe")), - ("agm", _(u"Angaataha")), - ("agn", _(u"Agutaynen")), - ("ago", _(u"Tainae")), - ("agp", _(u"Paranan")), - ("agq", _(u"Aghem")), - ("agr", _(u"Aguaruna")), - ("ags", _(u"Esimbi")), - ("agt", _(u"Central Cagayan Agta")), - ("agu", _(u"Aguacateco")), - ("agv", _(u"Remontado Dumagat")), - ("agw", _(u"Kahua")), - ("agx", _(u"Aghul")), - ("agy", _(u"Southern Alta")), - ("agz", _(u"Mt. Iriga Agta")), - ("aha", _(u"Ahanta")), - ("ahb", _(u"Axamb")), - ("ahg", _(u"Qimant")), - ("ahh", _(u"Aghu")), - ("ahi", _(u"Tiagbamrin Aizi")), - ("ahk", _(u"Akha")), - ("ahl", _(u"Igo")), - ("ahm", _(u"Mobumrin Aizi")), - ("ahn", _(u"Àhàn")), - ("aho", _(u"Ahom")), - ("ahp", _(u"Aproumu Aizi")), - ("ahr", _(u"Ahirani")), - ("ahs", _(u"Ashe")), - ("aht", _(u"Ahtena")), - ("aia", _(u"Arosi")), - ("aib", _(u"Ainu")), - ("aic", _(u"Ainbai")), - ("aid", _(u"Alngith")), - ("aie", _(u"Amara")), - ("aif", _(u"Agi")), - ("aig", _(u"Antigua and Barbuda Creole English")), - ("aih", _(u"Ai-Cham")), - ("aii", _(u"Assyrian Neo-Aramaic")), - ("aij", _(u"Lishanid Noshan")), - ("aik", _(u"Ake")), - ("ail", _(u"Aimele")), - ("aim", _(u"Aimol")), - ("ain", _(u"Ainu")), - ("aio", _(u"Aiton")), - ("aip", _(u"Burumakok")), - ("aiq", _(u"Aimaq")), - ("air", _(u"Airoran")), - ("ais", _(u"Nataoran Amis")), - ("ait", _(u"Arikem")), - ("aiw", _(u"Aari")), - ("aix", _(u"Aighon")), - ("aiy", _(u"Ali")), - ("aja", _(u"Aja")), - ("ajg", _(u"Aja")), - ("aji", _(u"Ajië")), - ("ajn", _(u"Andajin")), - ("ajp", _(u"South Levantine Arabic")), - ("ajt", _(u"Judeo-Tunisian Arabic")), - ("aju", _(u"Judeo-Moroccan Arabic")), - ("ajw", _(u"Ajawa")), - ("ajz", _(u"Amri Karbi")), - ("akb", _(u"Batak Angkola")), - ("akc", _(u"Mpur")), - ("akd", _(u"Ukpet-Ehom")), - ("ake", _(u"Akawaio")), - ("akf", _(u"Akpa")), - ("akg", _(u"Anakalangu")), - ("akh", _(u"Angal Heneng")), - ("aki", _(u"Aiome")), - ("akj", _(u"Aka-Jeru")), - ("akk", _(u"Akkadian")), - ("akl", _(u"Aklanon")), - ("akm", _(u"Aka-Bo")), - ("ako", _(u"Akurio")), - ("akp", _(u"Siwu")), - ("akq", _(u"Ak")), - ("akr", _(u"Araki")), - ("aks", _(u"Akaselem")), - ("akt", _(u"Akolet")), - ("aku", _(u"Akum")), - ("akv", _(u"Akhvakh")), - ("akw", _(u"Akwa")), - ("akx", _(u"Aka-Kede")), - ("aky", _(u"Aka-Kol")), - ("akz", _(u"Alabama")), - ("ala", _(u"Alago")), - ("alc", _(u"Qawasqar")), - ("ald", _(u"Alladian")), - ("ale", _(u"Aleut")), - ("alf", _(u"Alege")), - ("alg", _(u"Algonquian languages")), - ("alh", _(u"Alawa")), - ("ali", _(u"Amaimon")), - ("alj", _(u"Alangan")), - ("alk", _(u"Alak")), - ("all", _(u"Allar")), - ("alm", _(u"Amblong")), - ("aln", _(u"Gheg Albanian")), - ("alo", _(u"Larike-Wakasihu")), - ("alp", _(u"Alune")), - ("alq", _(u"Algonquin")), - ("alr", _(u"Alutor")), - ("als", _(u"Tosk Albanian")), - ("alt", _(u"Southern Altai")), - ("alu", _(u"'Are'are")), - ("alv", _(u"Atlantic-Congo languages")), - ("alw", _(u"Alaba-K’abeena")), - ("alx", _(u"Amol")), - ("aly", _(u"Alyawarr")), - ("alz", _(u"Alur")), - ("ama", _(u"Amanayé")), - ("amb", _(u"Ambo")), - ("amc", _(u"Amahuaca")), - ("ame", _(u"Yanesha'")), - ("amf", _(u"Hamer-Banna")), - ("amg", _(u"Amurdak")), - ("ami", _(u"Amis")), - ("amj", _(u"Amdang")), - ("amk", _(u"Ambai")), - ("aml", _(u"War-Jaintia")), - ("amm", _(u"Ama")), - ("amn", _(u"Amanab")), - ("amo", _(u"Amo")), - ("amp", _(u"Alamblak")), - ("amq", _(u"Amahai")), - ("amr", _(u"Amarakaeri")), - ("ams", _(u"Southern Amami-Oshima")), - ("amt", _(u"Amto")), - ("amu", _(u"Guerrero Amuzgo")), - ("amv", _(u"Ambelau")), - ("amw", _(u"Western Neo-Aramaic")), - ("amx", _(u"Anmatyerre")), - ("amy", _(u"Ami")), - ("amz", _(u"Atampaya")), - ("ana", _(u"Andaqui")), - ("anb", _(u"Andoa")), - ("anc", _(u"Ngas")), - ("and", _(u"Ansus")), - ("ane", _(u"Xârâcùù")), - ("anf", _(u"Animere")), - ("ang", _(u"Old English")), - ("anh", _(u"Nend")), - ("ani", _(u"Andi")), - ("anj", _(u"Anor")), - ("ank", _(u"Goemai")), - ("anl", _(u"Anu-Hkongso Chin")), - ("anm", _(u"Anal")), - ("ann", _(u"Obolo")), - ("ano", _(u"Andoque")), - ("anp", _(u"Angika")), - ("anq", _(u"Jarawa")), - ("anr", _(u"Andh")), - ("ans", _(u"Anserma")), - ("ant", _(u"Antakarinya")), - ("anu", _(u"Anuak")), - ("anv", _(u"Denya")), - ("anw", _(u"Anaang")), - ("anx", _(u"Andra-Hus")), - ("any", _(u"Anyin")), - ("anz", _(u"Anem")), - ("aoa", _(u"Angolar")), - ("aob", _(u"Abom")), - ("aoc", _(u"Pemon")), - ("aod", _(u"Andarum")), - ("aoe", _(u"Angal Enen")), - ("aof", _(u"Bragat")), - ("aog", _(u"Angoram")), - ("aoh", _(u"Arma")), - ("aoi", _(u"Anindilyakwa")), - ("aoj", _(u"Mufian")), - ("aok", _(u"Arhö")), - ("aol", _(u"Alor")), - ("aom", _(u"Ömie")), - ("aon", _(u"Bumbita Arapesh")), - ("aor", _(u"Aore")), - ("aos", _(u"Taikat")), - ("aot", _(u"Atong")), - ("aou", _(u"A'ou")), - ("aox", _(u"Atorada")), - ("aoz", _(u"Uab Meto")), - ("apa", _(u"Apache languages")), - ("apb", _(u"Sa'a")), - ("apc", _(u"North Levantine Arabic")), - ("apd", _(u"Sudanese Arabic")), - ("ape", _(u"Bukiyip")), - ("apf", _(u"Pahanan Agta")), - ("apg", _(u"Ampanang")), - ("aph", _(u"Athpariya")), - ("api", _(u"Apiaká")), - ("apj", _(u"Jicarilla Apache")), - ("apk", _(u"Kiowa Apache")), - ("apl", _(u"Lipan Apache")), - ("apm", _(u"Mescalero-Chiricahua Apache")), - ("apn", _(u"Apinayé")), - ("apo", _(u"Ambul")), - ("app", _(u"Apma")), - ("apq", _(u"A-Pucikwar")), - ("apr", _(u"Arop-Lokep")), - ("aps", _(u"Arop-Sissano")), - ("apt", _(u"Apatani")), - ("apu", _(u"Apurinã")), - ("apv", _(u"Alapmunte")), - ("apw", _(u"Western Apache")), - ("apx", _(u"Aputai")), - ("apy", _(u"Apalaí")), - ("apz", _(u"Safeyoka")), - ("aqa", _(u"Alacalufan languages")), - ("aqc", _(u"Archi")), - ("aqd", _(u"Ampari Dogon")), - ("aqg", _(u"Arigidi")), - ("aql", _(u"Algic languages")), - ("aqm", _(u"Atohwaim")), - ("aqn", _(u"Northern Alta")), - ("aqp", _(u"Atakapa")), - ("aqr", _(u"Arhâ")), - ("aqt", _(u"Angaité")), - ("aqz", _(u"Akuntsu")), - ("arb", _(u"Standard Arabic")), - ("arc", _(u"Official Aramaic")), - ("ard", _(u"Arabana")), - ("are", _(u"Western Arrarnta")), - ("arh", _(u"Arhuaco")), - ("ari", _(u"Arikara")), - ("arj", _(u"Arapaso")), - ("ark", _(u"Arikapú")), - ("arl", _(u"Arabela")), - ("arn", _(u"Mapudungun")), - ("aro", _(u"Araona")), - ("arp", _(u"Arapaho")), - ("arq", _(u"Algerian Arabic")), - ("arr", _(u"Karo")), - ("ars", _(u"Najdi Arabic")), - ("art", _(u"Artificial languages")), - ("aru", _(u"Aruá")), - ("arv", _(u"Arbore")), - ("arw", _(u"Arawak")), - ("arx", _(u"Aruá")), - ("ary", _(u"Moroccan Arabic")), - ("arz", _(u"Egyptian Arabic")), - ("asa", _(u"Asu")), - ("asb", _(u"Assiniboine")), - ("asc", _(u"Casuarina Coast Asmat")), - ("asd", _(u"Asas")), - ("ase", _(u"American Sign Language")), - ("asf", _(u"Australian Sign Language")), - ("asg", _(u"Cishingini")), - ("ash", _(u"Abishira")), - ("asi", _(u"Buruwai")), - ("asj", _(u"Sari")), - ("ask", _(u"Ashkun")), - ("asl", _(u"Asilulu")), - ("asn", _(u"Xingú Asuriní")), - ("aso", _(u"Dano")), - ("asp", _(u"Algerian Sign Language")), - ("asq", _(u"Austrian Sign Language")), - ("asr", _(u"Asuri")), - ("ass", _(u"Ipulo")), - ("ast", _(u"Asturian")), - ("asu", _(u"Tocantins Asurini")), - ("asv", _(u"Asoa")), - ("asw", _(u"Australian Aborigines Sign Language")), - ("asx", _(u"Muratayak")), - ("asy", _(u"Yaosakor Asmat")), - ("asz", _(u"As")), - ("ata", _(u"Pele-Ata")), - ("atb", _(u"Zaiwa")), - ("atc", _(u"Atsahuaca")), - ("atd", _(u"Ata Manobo")), - ("ate", _(u"Atemble")), - ("atg", _(u"Ivbie North-Okpela-Arhe")), - ("ath", _(u"Athapascan languages")), - ("ati", _(u"Attié")), - ("atj", _(u"Atikamekw")), - ("atk", _(u"Ati")), - ("atl", _(u"Mt. Iraya Agta")), - ("atm", _(u"Ata")), - ("atn", _(u"Ashtiani")), - ("ato", _(u"Atong")), - ("atp", _(u"Pudtol Atta")), - ("atq", _(u"Aralle-Tabulahan")), - ("atr", _(u"Waimiri-Atroari")), - ("ats", _(u"Gros Ventre")), - ("att", _(u"Pamplona Atta")), - ("atu", _(u"Reel")), - ("atv", _(u"Northern Altai")), - ("atw", _(u"Atsugewi")), - ("atx", _(u"Arutani")), - ("aty", _(u"Aneityum")), - ("atz", _(u"Arta")), - ("aua", _(u"Asumboa")), - ("aub", _(u"Alugu")), - ("auc", _(u"Waorani")), - ("aud", _(u"Anuta")), - ("aue", _(u"=/Kx'au//'ein")), - ("auf", _(u"Arauan languages")), - ("aug", _(u"Aguna")), - ("auh", _(u"Aushi")), - ("aui", _(u"Anuki")), - ("auj", _(u"Awjilah")), - ("auk", _(u"Heyo")), - ("aul", _(u"Aulua")), - ("aum", _(u"Asu")), - ("aun", _(u"Molmo One")), - ("auo", _(u"Auyokawa")), - ("aup", _(u"Makayam")), - ("auq", _(u"Anus")), - ("aur", _(u"Aruek")), - ("aus", _(u"Australian languages")), - ("aut", _(u"Austral")), - ("auu", _(u"Auye")), - ("auw", _(u"Awyi")), - ("aux", _(u"Aurá")), - ("auy", _(u"Awiyaana")), - ("auz", _(u"Uzbeki Arabic")), - ("avb", _(u"Avau")), - ("avd", _(u"Alviri-Vidari")), - ("avi", _(u"Avikam")), - ("avk", _(u"Kotava")), - ("avl", _(u"Eastern Egyptian Bedawi Arabic")), - ("avm", _(u"Angkamuthi")), - ("avn", _(u"Avatime")), - ("avo", _(u"Agavotaguerra")), - ("avs", _(u"Aushiri")), - ("avt", _(u"Au")), - ("avu", _(u"Avokaya")), - ("avv", _(u"Avá-Canoeiro")), - ("awa", _(u"Awadhi")), - ("awb", _(u"Awa")), - ("awc", _(u"Cicipu")), - ("awd", _(u"Arawakan languages")), - ("awe", _(u"Awetí")), - ("awg", _(u"Anguthimri")), - ("awh", _(u"Awbono")), - ("awi", _(u"Aekyom")), - ("awk", _(u"Awabakal")), - ("awm", _(u"Arawum")), - ("awn", _(u"Awngi")), - ("awo", _(u"Awak")), - ("awr", _(u"Awera")), - ("aws", _(u"South Awyu")), - ("awt", _(u"Araweté")), - ("awu", _(u"Central Awyu")), - ("awv", _(u"Jair Awyu")), - ("aww", _(u"Awun")), - ("awx", _(u"Awara")), - ("awy", _(u"Edera Awyu")), - ("axb", _(u"Abipon")), - ("axe", _(u"Ayerrerenge")), - ("axg", _(u"Mato Grosso Arára")), - ("axk", _(u"Yaka")), - ("axl", _(u"Lower Southern Aranda")), - ("axm", _(u"Middle Armenian")), - ("axx", _(u"Xârâgurè")), - ("aya", _(u"Awar")), - ("ayb", _(u"Ayizo Gbe")), - ("ayc", _(u"Southern Aymara")), - ("ayd", _(u"Ayabadhu")), - ("aye", _(u"Ayere")), - ("ayg", _(u"Ginyanga")), - ("ayh", _(u"Hadrami Arabic")), - ("ayi", _(u"Leyigha")), - ("ayk", _(u"Akuku")), - ("ayl", _(u"Libyan Arabic")), - ("ayn", _(u"Sanaani Arabic")), - ("ayo", _(u"Ayoreo")), - ("ayp", _(u"North Mesopotamian Arabic")), - ("ayq", _(u"Ayi")), - ("ayr", _(u"Central Aymara")), - ("ays", _(u"Sorsogon Ayta")), - ("ayt", _(u"Magbukun Ayta")), - ("ayu", _(u"Ayu")), - ("ayx", _(u"Ayi")), - ("ayy", _(u"Tayabas Ayta")), - ("ayz", _(u"Mai Brat")), - ("aza", _(u"Azha")), - ("azb", _(u"South Azerbaijani")), - ("azc", _(u"Uto-Aztecan languages")), - ("azd", _(u"Eastern Durango Nahuatl")), - ("azg", _(u"San Pedro Amuzgos Amuzgo")), - ("azj", _(u"North Azerbaijani")), - ("azm", _(u"Ipalapa Amuzgo")), - ("azn", _(u"Western Durango Nahuatl")), - ("azo", _(u"Awing")), - ("azt", _(u"Faire Atta")), - ("azz", _(u"Highland Puebla Nahuatl")), - ("baa", _(u"Babatana")), - ("bab", _(u"Bainouk-Gunyuño")), - ("bac", _(u"Badui")), - ("bad", _(u"Banda languages")), - ("bae", _(u"Baré")), - ("baf", _(u"Nubaca")), - ("bag", _(u"Tuki")), - ("bah", _(u"Bahamas Creole English")), - ("bai", _(u"Bamileke languages")), - ("baj", _(u"Barakai")), - ("bal", _(u"Baluchi")), - ("ban", _(u"Balinese")), - ("bao", _(u"Waimaha")), - ("bap", _(u"Bantawa")), - ("bar", _(u"Bavarian")), - ("bas", _(u"Basa")), - ("bat", _(u"Baltic languages")), - ("bau", _(u"Bada")), - ("bav", _(u"Vengo")), - ("baw", _(u"Bambili-Bambui")), - ("bax", _(u"Bamun")), - ("bay", _(u"Batuley")), - ("baz", _(u"Tunen")), - ("bba", _(u"Baatonum")), - ("bbb", _(u"Barai")), - ("bbc", _(u"Batak Toba")), - ("bbd", _(u"Bau")), - ("bbe", _(u"Bangba")), - ("bbf", _(u"Baibai")), - ("bbg", _(u"Barama")), - ("bbh", _(u"Bugan")), - ("bbi", _(u"Barombi")), - ("bbj", _(u"Ghomálá'")), - ("bbk", _(u"Babanki")), - ("bbl", _(u"Bats")), - ("bbm", _(u"Babango")), - ("bbn", _(u"Uneapa")), - ("bbo", _(u"Northern Bobo Madaré")), - ("bbp", _(u"West Central Banda")), - ("bbq", _(u"Bamali")), - ("bbr", _(u"Girawa")), - ("bbs", _(u"Bakpinka")), - ("bbt", _(u"Mburku")), - ("bbu", _(u"Kulung")), - ("bbv", _(u"Karnai")), - ("bbw", _(u"Baba")), - ("bbx", _(u"Bubia")), - ("bby", _(u"Befang")), - ("bbz", _(u"Babalia Creole Arabic")), - ("bca", _(u"Central Bai")), - ("bcb", _(u"Bainouk-Samik")), - ("bcc", _(u"Southern Balochi")), - ("bcd", _(u"North Babar")), - ("bce", _(u"Bamenyam")), - ("bcf", _(u"Bamu")), - ("bcg", _(u"Baga Pokur")), - ("bch", _(u"Bariai")), - ("bci", _(u"Baoulé")), - ("bcj", _(u"Bardi")), - ("bck", _(u"Bunaba")), - ("bcl", _(u"Central Bikol")), - ("bcm", _(u"Bannoni")), - ("bcn", _(u"Bali")), - ("bco", _(u"Kaluli")), - ("bcp", _(u"Bali")), - ("bcq", _(u"Bench")), - ("bcr", _(u"Babine")), - ("bcs", _(u"Kohumono")), - ("bct", _(u"Bendi")), - ("bcu", _(u"Awad Bing")), - ("bcv", _(u"Shoo-Minda-Nye")), - ("bcw", _(u"Bana")), - ("bcy", _(u"Bacama")), - ("bcz", _(u"Bainouk-Gunyaamolo")), - ("bda", _(u"Bayot")), - ("bdb", _(u"Basap")), - ("bdc", _(u"Emberá-Baudó")), - ("bdd", _(u"Bunama")), - ("bde", _(u"Bade")), - ("bdf", _(u"Biage")), - ("bdg", _(u"Bonggi")), - ("bdh", _(u"Baka")), - ("bdi", _(u"Burun")), - ("bdj", _(u"Bai")), - ("bdk", _(u"Budukh")), - ("bdl", _(u"Indonesian Bajau")), - ("bdm", _(u"Buduma")), - ("bdn", _(u"Baldemu")), - ("bdo", _(u"Morom")), - ("bdp", _(u"Bende")), - ("bdq", _(u"Bahnar")), - ("bdr", _(u"West Coast Bajau")), - ("bds", _(u"Burunge")), - ("bdt", _(u"Bokoto")), - ("bdu", _(u"Oroko")), - ("bdv", _(u"Bodo Parja")), - ("bdw", _(u"Baham")), - ("bdx", _(u"Budong-Budong")), - ("bdy", _(u"Bandjalang")), - ("bdz", _(u"Badeshi")), - ("bea", _(u"Beaver")), - ("beb", _(u"Bebele")), - ("bec", _(u"Iceve-Maci")), - ("bed", _(u"Bedoanas")), - ("bee", _(u"Byangsi")), - ("bef", _(u"Benabena")), - ("beg", _(u"Belait")), - ("beh", _(u"Biali")), - ("bei", _(u"Bekati'")), - ("bej", _(u"Beja")), - ("bek", _(u"Bebeli")), - ("bem", _(u"Bemba")), - ("beo", _(u"Beami")), - ("bep", _(u"Besoa")), - ("beq", _(u"Beembe")), - ("ber", _(u"Berber languages")), - ("bes", _(u"Besme")), - ("bet", _(u"Guiberoua Béte")), - ("beu", _(u"Blagar")), - ("bev", _(u"Daloa Bété")), - ("bew", _(u"Betawi")), - ("bex", _(u"Jur Modo")), - ("bey", _(u"Beli")), - ("bez", _(u"Bena")), - ("bfa", _(u"Bari")), - ("bfb", _(u"Pauri Bareli")), - ("bfc", _(u"Panyi Bai")), - ("bfd", _(u"Bafut")), - ("bfe", _(u"Betaf")), - ("bff", _(u"Bofi")), - ("bfg", _(u"Busang Kayan")), - ("bfh", _(u"Blafe")), - ("bfi", _(u"British Sign Language")), - ("bfj", _(u"Bafanji")), - ("bfk", _(u"Ban Khor Sign Language")), - ("bfl", _(u"Banda-Ndélé")), - ("bfm", _(u"Mmen")), - ("bfn", _(u"Bunak")), - ("bfo", _(u"Malba Birifor")), - ("bfp", _(u"Beba")), - ("bfq", _(u"Badaga")), - ("bfr", _(u"Bazigar")), - ("bfs", _(u"Southern Bai")), - ("bft", _(u"Balti")), - ("bfu", _(u"Gahri")), - ("bfw", _(u"Bondo")), - ("bfx", _(u"Bantayanon")), - ("bfy", _(u"Bagheli")), - ("bfz", _(u"Mahasu Pahari")), - ("bga", _(u"Gwamhi-Wuri")), - ("bgb", _(u"Bobongko")), - ("bgc", _(u"Haryanvi")), - ("bgd", _(u"Rathwi Bareli")), - ("bge", _(u"Bauria")), - ("bgf", _(u"Bangandu")), - ("bgg", _(u"Bugun")), - ("bgi", _(u"Giangan")), - ("bgj", _(u"Bangolan")), - ("bgk", _(u"Bit")), - ("bgl", _(u"Bo")), - ("bgm", _(u"Baga Mboteni")), - ("bgn", _(u"Western Balochi")), - ("bgo", _(u"Baga Koga")), - ("bgp", _(u"Eastern Balochi")), - ("bgq", _(u"Bagri")), - ("bgr", _(u"Bawm Chin")), - ("bgs", _(u"Tagabawa")), - ("bgt", _(u"Bughotu")), - ("bgu", _(u"Mbongno")), - ("bgv", _(u"Warkay-Bipim")), - ("bgw", _(u"Bhatri")), - ("bgx", _(u"Balkan Gagauz Turkish")), - ("bgy", _(u"Benggoi")), - ("bgz", _(u"Banggai")), - ("bha", _(u"Bharia")), - ("bhb", _(u"Bhili")), - ("bhc", _(u"Biga")), - ("bhd", _(u"Bhadrawahi")), - ("bhe", _(u"Bhaya")), - ("bhf", _(u"Odiai")), - ("bhg", _(u"Binandere")), - ("bhh", _(u"Bukharic")), - ("bhi", _(u"Bhilali")), - ("bhj", _(u"Bahing")), - ("bhk", _(u"Albay Bicolano")), - ("bhl", _(u"Bimin")), - ("bhm", _(u"Bathari")), - ("bhn", _(u"Bohtan Neo-Aramaic")), - ("bho", _(u"Bhojpuri")), - ("bhp", _(u"Bima")), - ("bhq", _(u"Tukang Besi South")), - ("bhr", _(u"Bara Malagasy")), - ("bhs", _(u"Buwal")), - ("bht", _(u"Bhattiyali")), - ("bhu", _(u"Bhunjia")), - ("bhv", _(u"Bahau")), - ("bhw", _(u"Biak")), - ("bhx", _(u"Bhalay")), - ("bhy", _(u"Bhele")), - ("bhz", _(u"Bada")), - ("bia", _(u"Badimaya")), - ("bib", _(u"Bissa")), - ("bic", _(u"Bikaru")), - ("bid", _(u"Bidiyo")), - ("bie", _(u"Bepour")), - ("bif", _(u"Biafada")), - ("big", _(u"Biangai")), - ("bij", _(u"Vaghat-Ya-Bijim-Legeri")), - ("bik", _(u"Bikol")), - ("bil", _(u"Bile")), - ("bim", _(u"Bimoba")), - ("bin", _(u"Bini")), - ("bio", _(u"Nai")), - ("bip", _(u"Bila")), - ("biq", _(u"Bipi")), - ("bir", _(u"Bisorio")), - ("bit", _(u"Berinomo")), - ("biu", _(u"Biete")), - ("biv", _(u"Southern Birifor")), - ("biw", _(u"Kol")), - ("bix", _(u"Bijori")), - ("biy", _(u"Birhor")), - ("biz", _(u"Baloi")), - ("bja", _(u"Budza")), - ("bjb", _(u"Banggarla")), - ("bjc", _(u"Bariji")), - ("bjd", _(u"Bandjigali")), - ("bje", _(u"Biao-Jiao Mien")), - ("bjf", _(u"Barzani Jewish Neo-Aramaic")), - ("bjg", _(u"Bidyogo")), - ("bjh", _(u"Bahinemo")), - ("bji", _(u"Burji")), - ("bjj", _(u"Kanauji")), - ("bjk", _(u"Barok")), - ("bjl", _(u"Bulu")), - ("bjm", _(u"Bajelani")), - ("bjn", _(u"Banjar")), - ("bjo", _(u"Mid-Southern Banda")), - ("bjp", _(u"Fanamaket")), - ("bjq", _(u"Southern Betsimisaraka Malagasy")), - ("bjr", _(u"Binumarien")), - ("bjs", _(u"Bajan")), - ("bjt", _(u"Balanta-Ganja")), - ("bju", _(u"Busuu")), - ("bjv", _(u"Bedjond")), - ("bjw", _(u"Bakwé")), - ("bjx", _(u"Banao Itneg")), - ("bjy", _(u"Bayali")), - ("bjz", _(u"Baruga")), - ("bka", _(u"Kyak")), - ("bkb", _(u"Finallig")), - ("bkc", _(u"Baka")), - ("bkd", _(u"Binukid")), - ("bkf", _(u"Beeke")), - ("bkg", _(u"Buraka")), - ("bkh", _(u"Bakoko")), - ("bki", _(u"Baki")), - ("bkj", _(u"Pande")), - ("bkk", _(u"Brokskat")), - ("bkl", _(u"Berik")), - ("bkm", _(u"Kom")), - ("bkn", _(u"Bukitan")), - ("bko", _(u"Kwa'")), - ("bkp", _(u"Boko")), - ("bkq", _(u"Bakairí")), - ("bkr", _(u"Bakumpai")), - ("bks", _(u"Northern Sorsoganon")), - ("bkt", _(u"Boloki")), - ("bku", _(u"Buhid")), - ("bkv", _(u"Bekwarra")), - ("bkw", _(u"Bekwel")), - ("bkx", _(u"Baikeno")), - ("bky", _(u"Bokyi")), - ("bkz", _(u"Bungku")), - ("bla", _(u"Siksika")), - ("blb", _(u"Bilua")), - ("blc", _(u"Bella Coola")), - ("bld", _(u"Bolango")), - ("ble", _(u"Balanta-Kentohe")), - ("blf", _(u"Buol")), - ("blg", _(u"Balau")), - ("blh", _(u"Kuwaa")), - ("bli", _(u"Bolia")), - ("blj", _(u"Bolongan")), - ("blk", _(u"Pa'o Karen")), - ("bll", _(u"Biloxi")), - ("blm", _(u"Beli")), - ("bln", _(u"Southern Catanduanes Bikol")), - ("blo", _(u"Anii")), - ("blp", _(u"Blablanga")), - ("blq", _(u"Baluan-Pam")), - ("blr", _(u"Blang")), - ("bls", _(u"Balaesang")), - ("blt", _(u"Tai Dam")), - ("blv", _(u"Bolo")), - ("blw", _(u"Balangao")), - ("blx", _(u"Mag-Indi Ayta")), - ("bly", _(u"Notre")), - ("blz", _(u"Balantak")), - ("bma", _(u"Lame")), - ("bmb", _(u"Bembe")), - ("bmc", _(u"Biem")), - ("bmd", _(u"Baga Manduri")), - ("bme", _(u"Limassa")), - ("bmf", _(u"Bom")), - ("bmg", _(u"Bamwe")), - ("bmh", _(u"Kein")), - ("bmi", _(u"Bagirmi")), - ("bmj", _(u"Bote-Majhi")), - ("bmk", _(u"Ghayavi")), - ("bml", _(u"Bomboli")), - ("bmm", _(u"Northern Betsimisaraka Malagasy")), - ("bmn", _(u"Bina")), - ("bmo", _(u"Bambalang")), - ("bmp", _(u"Bulgebi")), - ("bmq", _(u"Bomu")), - ("bmr", _(u"Muinane")), - ("bms", _(u"Bilma Kanuri")), - ("bmt", _(u"Biao Mon")), - ("bmu", _(u"Somba-Siawari")), - ("bmv", _(u"Bum")), - ("bmw", _(u"Bomwali")), - ("bmx", _(u"Baimak")), - ("bmy", _(u"Bemba")), - ("bmz", _(u"Baramu")), - ("bna", _(u"Bonerate")), - ("bnb", _(u"Bookan")), - ("bnc", _(u"Bontok")), - ("bnd", _(u"Banda")), - ("bne", _(u"Bintauna")), - ("bnf", _(u"Masiwang")), - ("bng", _(u"Benga")), - ("bni", _(u"Bangi")), - ("bnj", _(u"Eastern Tawbuid")), - ("bnk", _(u"Bierebo")), - ("bnl", _(u"Boon")), - ("bnm", _(u"Batanga")), - ("bnn", _(u"Bunun")), - ("bno", _(u"Bantoanon")), - ("bnp", _(u"Bola")), - ("bnq", _(u"Bantik")), - ("bnr", _(u"Butmas-Tur")), - ("bns", _(u"Bundeli")), - ("bnt", _(u"Bantu languages")), - ("bnu", _(u"Bentong")), - ("bnv", _(u"Bonerif")), - ("bnw", _(u"Bisis")), - ("bnx", _(u"Bangubangu")), - ("bny", _(u"Bintulu")), - ("bnz", _(u"Beezen")), - ("boa", _(u"Bora")), - ("bob", _(u"Aweer")), - ("boe", _(u"Mundabli")), - ("bof", _(u"Bolon")), - ("bog", _(u"Bamako Sign Language")), - ("boh", _(u"Boma")), - ("boi", _(u"Barbareño")), - ("boj", _(u"Anjam")), - ("bok", _(u"Bonjo")), - ("bol", _(u"Bole")), - ("bom", _(u"Berom")), - ("bon", _(u"Bine")), - ("boo", _(u"Tiemacèwè Bozo")), - ("bop", _(u"Bonkiman")), - ("boq", _(u"Bogaya")), - ("bor", _(u"Borôro")), - ("bot", _(u"Bongo")), - ("bou", _(u"Bondei")), - ("bov", _(u"Tuwuli")), - ("bow", _(u"Rema")), - ("box", _(u"Buamu")), - ("boy", _(u"Bodo")), - ("boz", _(u"Tiéyaxo Bozo")), - ("bpa", _(u"Daakaka")), - ("bpb", _(u"Barbacoas")), - ("bpd", _(u"Banda-Banda")), - ("bpg", _(u"Bonggo")), - ("bph", _(u"Botlikh")), - ("bpi", _(u"Bagupi")), - ("bpj", _(u"Binji")), - ("bpk", _(u"Orowe")), - ("bpl", _(u"Broome Pearling Lugger Pidgin")), - ("bpm", _(u"Biyom")), - ("bpn", _(u"Dzao Min")), - ("bpo", _(u"Anasi")), - ("bpp", _(u"Kaure")), - ("bpq", _(u"Banda Malay")), - ("bpr", _(u"Koronadal Blaan")), - ("bps", _(u"Sarangani Blaan")), - ("bpt", _(u"Barrow Point")), - ("bpu", _(u"Bongu")), - ("bpv", _(u"Bian Marind")), - ("bpw", _(u"Bo")), - ("bpx", _(u"Palya Bareli")), - ("bpy", _(u"Bishnupriya")), - ("bpz", _(u"Bilba")), - ("bqa", _(u"Tchumbuli")), - ("bqb", _(u"Bagusa")), - ("bqc", _(u"Boko")), - ("bqd", _(u"Bung")), - ("bqf", _(u"Baga Kaloum")), - ("bqg", _(u"Bago-Kusuntu")), - ("bqh", _(u"Baima")), - ("bqi", _(u"Bakhtiari")), - ("bqj", _(u"Bandial")), - ("bqk", _(u"Banda-Mbrès")), - ("bql", _(u"Bilakura")), - ("bqm", _(u"Wumboko")), - ("bqn", _(u"Bulgarian Sign Language")), - ("bqo", _(u"Balo")), - ("bqp", _(u"Busa")), - ("bqq", _(u"Biritai")), - ("bqr", _(u"Burusu")), - ("bqs", _(u"Bosngun")), - ("bqt", _(u"Bamukumbit")), - ("bqu", _(u"Boguru")), - ("bqv", _(u"Koro Wachi")), - ("bqw", _(u"Buru")), - ("bqx", _(u"Baangi")), - ("bqy", _(u"Bengkala Sign Language")), - ("bqz", _(u"Bakaka")), - ("bra", _(u"Braj")), - ("brb", _(u"Lave")), - ("brc", _(u"Berbice Creole Dutch")), - ("brd", _(u"Baraamu")), - ("brf", _(u"Bera")), - ("brg", _(u"Baure")), - ("brh", _(u"Brahui")), - ("bri", _(u"Mokpwe")), - ("brj", _(u"Bieria")), - ("brk", _(u"Birked")), - ("brl", _(u"Birwa")), - ("brm", _(u"Barambu")), - ("brn", _(u"Boruca")), - ("bro", _(u"Brokkat")), - ("brp", _(u"Barapasi")), - ("brq", _(u"Breri")), - ("brr", _(u"Birao")), - ("brs", _(u"Baras")), - ("brt", _(u"Bitare")), - ("bru", _(u"Eastern Bru")), - ("brv", _(u"Western Bru")), - ("brw", _(u"Bellari")), - ("brx", _(u"Bodo")), - ("bry", _(u"Burui")), - ("brz", _(u"Bilbil")), - ("bsa", _(u"Abinomn")), - ("bsb", _(u"Brunei Bisaya")), - ("bsc", _(u"Bassari")), - ("bse", _(u"Wushi")), - ("bsf", _(u"Bauchi")), - ("bsg", _(u"Bashkardi")), - ("bsh", _(u"Kati")), - ("bsi", _(u"Bassossi")), - ("bsj", _(u"Bangwinji")), - ("bsk", _(u"Burushaski")), - ("bsl", _(u"Basa-Gumna")), - ("bsm", _(u"Busami")), - ("bsn", _(u"Barasana-Eduria")), - ("bso", _(u"Buso")), - ("bsp", _(u"Baga Sitemu")), - ("bsq", _(u"Bassa")), - ("bsr", _(u"Bassa-Kontagora")), - ("bss", _(u"Akoose")), - ("bst", _(u"Basketo")), - ("bsu", _(u"Bahonsuai")), - ("bsv", _(u"Baga Sobané")), - ("bsw", _(u"Baiso")), - ("bsx", _(u"Yangkam")), - ("bsy", _(u"Sabah Bisaya")), - ("bta", _(u"Bata")), - ("btb", _(u"Beti")), - ("btc", _(u"Bati")), - ("btd", _(u"Batak Dairi")), - ("bte", _(u"Gamo-Ningi")), - ("btf", _(u"Birgit")), - ("btg", _(u"Gagnoa Bété")), - ("bth", _(u"Biatah Bidayuh")), - ("bti", _(u"Burate")), - ("btj", _(u"Bacanese Malay")), - ("btk", _(u"Batak languages")), - ("btl", _(u"Bhatola")), - ("btm", _(u"Batak Mandailing")), - ("btn", _(u"Ratagnon")), - ("bto", _(u"Rinconada Bikol")), - ("btp", _(u"Budibud")), - ("btq", _(u"Batek")), - ("btr", _(u"Baetora")), - ("bts", _(u"Batak Simalungun")), - ("btt", _(u"Bete-Bendi")), - ("btu", _(u"Batu")), - ("btv", _(u"Bateri")), - ("btw", _(u"Butuanon")), - ("btx", _(u"Batak Karo")), - ("bty", _(u"Bobot")), - ("btz", _(u"Batak Alas-Kluet")), - ("bua", _(u"Buriat")), - ("bub", _(u"Bua")), - ("buc", _(u"Bushi")), - ("bud", _(u"Ntcham")), - ("bue", _(u"Beothuk")), - ("buf", _(u"Bushoong")), - ("bug", _(u"Buginese")), - ("buh", _(u"Younuo Bunu")), - ("bui", _(u"Bongili")), - ("buj", _(u"Basa-Gurmana")), - ("buk", _(u"Bugawac")), - ("bum", _(u"Bulu")), - ("bun", _(u"Sherbro")), - ("buo", _(u"Terei")), - ("bup", _(u"Busoa")), - ("buq", _(u"Brem")), - ("bus", _(u"Bokobaru")), - ("but", _(u"Bungain")), - ("buu", _(u"Budu")), - ("buv", _(u"Bun")), - ("buw", _(u"Bubi")), - ("bux", _(u"Boghom")), - ("buy", _(u"Bullom So")), - ("buz", _(u"Bukwen")), - ("bva", _(u"Barein")), - ("bvb", _(u"Bube")), - ("bvc", _(u"Baelelea")), - ("bvd", _(u"Baeggu")), - ("bve", _(u"Berau Malay")), - ("bvf", _(u"Boor")), - ("bvg", _(u"Bonkeng")), - ("bvh", _(u"Bure")), - ("bvi", _(u"Belanda Viri")), - ("bvj", _(u"Baan")), - ("bvk", _(u"Bukat")), - ("bvl", _(u"Bolivian Sign Language")), - ("bvm", _(u"Bamunka")), - ("bvn", _(u"Buna")), - ("bvo", _(u"Bolgo")), - ("bvp", _(u"Bumang")), - ("bvq", _(u"Birri")), - ("bvr", _(u"Burarra")), - ("bvt", _(u"Bati")), - ("bvu", _(u"Bukit Malay")), - ("bvv", _(u"Baniva")), - ("bvw", _(u"Boga")), - ("bvx", _(u"Dibole")), - ("bvy", _(u"Baybayanon")), - ("bvz", _(u"Bauzi")), - ("bwa", _(u"Bwatoo")), - ("bwb", _(u"Namosi-Naitasiri-Serua")), - ("bwc", _(u"Bwile")), - ("bwd", _(u"Bwaidoka")), - ("bwe", _(u"Bwe Karen")), - ("bwf", _(u"Boselewa")), - ("bwg", _(u"Barwe")), - ("bwh", _(u"Bishuo")), - ("bwi", _(u"Baniwa")), - ("bwj", _(u"Láá Láá Bwamu")), - ("bwk", _(u"Bauwaki")), - ("bwl", _(u"Bwela")), - ("bwm", _(u"Biwat")), - ("bwn", _(u"Wunai Bunu")), - ("bwo", _(u"Boro")), - ("bwp", _(u"Mandobo Bawah")), - ("bwq", _(u"Southern Bobo Madaré")), - ("bwr", _(u"Bura-Pabir")), - ("bws", _(u"Bomboma")), - ("bwt", _(u"Bafaw-Balong")), - ("bwu", _(u"Buli")), - ("bww", _(u"Bwa")), - ("bwx", _(u"Bu-Nao Bunu")), - ("bwy", _(u"Cwi Bwamu")), - ("bwz", _(u"Bwisi")), - ("bxa", _(u"Tairaha")), - ("bxb", _(u"Belanda Bor")), - ("bxc", _(u"Molengue")), - ("bxd", _(u"Pela")), - ("bxe", _(u"Birale")), - ("bxf", _(u"Bilur")), - ("bxg", _(u"Bangala")), - ("bxh", _(u"Buhutu")), - ("bxi", _(u"Pirlatapa")), - ("bxj", _(u"Bayungu")), - ("bxk", _(u"Bukusu")), - ("bxl", _(u"Jalkunan")), - ("bxm", _(u"Mongolia Buriat")), - ("bxn", _(u"Burduna")), - ("bxo", _(u"Barikanchi")), - ("bxp", _(u"Bebil")), - ("bxq", _(u"Beele")), - ("bxr", _(u"Russia Buriat")), - ("bxs", _(u"Busam")), - ("bxu", _(u"China Buriat")), - ("bxv", _(u"Berakou")), - ("bxw", _(u"Bankagooma")), - ("bxx", _(u"Borna")), - ("bxz", _(u"Binahari")), - ("bya", _(u"Batak")), - ("byb", _(u"Bikya")), - ("byc", _(u"Ubaghara")), - ("byd", _(u"Benyadu'")), - ("bye", _(u"Pouye")), - ("byf", _(u"Bete")), - ("byg", _(u"Baygo")), - ("byh", _(u"Bhujel")), - ("byi", _(u"Buyu")), - ("byj", _(u"Bina")), - ("byk", _(u"Biao")), - ("byl", _(u"Bayono")), - ("bym", _(u"Bidyara")), - ("byn", _(u"Bilin")), - ("byo", _(u"Biyo")), - ("byp", _(u"Bumaji")), - ("byq", _(u"Basay")), - ("byr", _(u"Baruya")), - ("bys", _(u"Burak")), - ("byt", _(u"Berti")), - ("byv", _(u"Medumba")), - ("byw", _(u"Belhariya")), - ("byx", _(u"Qaqet")), - ("byy", _(u"Buya")), - ("byz", _(u"Banaro")), - ("bza", _(u"Bandi")), - ("bzb", _(u"Andio")), - ("bzc", _(u"Southern Betsimisaraka Malagasy")), - ("bzd", _(u"Bribri")), - ("bze", _(u"Jenaama Bozo")), - ("bzf", _(u"Boikin")), - ("bzg", _(u"Babuza")), - ("bzh", _(u"Mapos Buang")), - ("bzi", _(u"Bisu")), - ("bzj", _(u"Belize Kriol English")), - ("bzk", _(u"Nicaragua Creole English")), - ("bzl", _(u"Boano")), - ("bzm", _(u"Bolondo")), - ("bzn", _(u"Boano")), - ("bzo", _(u"Bozaba")), - ("bzp", _(u"Kemberano")), - ("bzq", _(u"Buli")), - ("bzr", _(u"Biri")), - ("bzs", _(u"Brazilian Sign Language")), - ("bzt", _(u"Brithenig")), - ("bzu", _(u"Burmeso")), - ("bzv", _(u"Naami")), - ("bzw", _(u"Basa")), - ("bzx", _(u"Kɛlɛngaxo Bozo")), - ("bzy", _(u"Obanliku")), - ("bzz", _(u"Evant")), - ("caa", _(u"Chortí")), - ("cab", _(u"Garifuna")), - ("cac", _(u"Chuj")), - ("cad", _(u"Caddo")), - ("cae", _(u"Lehar")), - ("caf", _(u"Southern Carrier")), - ("cag", _(u"Nivaclé")), - ("cah", _(u"Cahuarano")), - ("cai", _(u"Central American Indian languages")), - ("caj", _(u"Chané")), - ("cak", _(u"Kaqchikel")), - ("cal", _(u"Carolinian")), - ("cam", _(u"Cemuhî")), - ("can", _(u"Chambri")), - ("cao", _(u"Chácobo")), - ("cap", _(u"Chipaya")), - ("caq", _(u"Car Nicobarese")), - ("car", _(u"Galibi Carib")), - ("cas", _(u"Tsimané")), - ("cau", _(u"Caucasian languages")), - ("cav", _(u"Cavineña")), - ("caw", _(u"Callawalla")), - ("cax", _(u"Chiquitano")), - ("cay", _(u"Cayuga")), - ("caz", _(u"Canichana")), - ("cba", _(u"Chibchan languages")), - ("cbb", _(u"Cabiyarí")), - ("cbc", _(u"Carapana")), - ("cbd", _(u"Carijona")), - ("cbe", _(u"Chipiajes")), - ("cbg", _(u"Chimila")), - ("cbh", _(u"Cagua")), - ("cbi", _(u"Chachi")), - ("cbj", _(u"Ede Cabe")), - ("cbk", _(u"Chavacano")), - ("cbl", _(u"Bualkhaw Chin")), - ("cbn", _(u"Nyahkur")), - ("cbo", _(u"Izora")), - ("cbq", _(u"Tsucuba")), - ("cbr", _(u"Cashibo-Cacataibo")), - ("cbs", _(u"Cashinahua")), - ("cbt", _(u"Chayahuita")), - ("cbu", _(u"Candoshi-Shapra")), - ("cbv", _(u"Cacua")), - ("cbw", _(u"Kinabalian")), - ("cby", _(u"Carabayo")), - ("cca", _(u"Cauca")), - ("ccc", _(u"Chamicuro")), - ("ccd", _(u"Cafundo Creole")), - ("cce", _(u"Chopi")), - ("ccg", _(u"Samba Daka")), - ("cch", _(u"Atsam")), - ("ccj", _(u"Kasanga")), - ("ccl", _(u"Cutchi-Swahili")), - ("ccm", _(u"Malaccan Creole Malay")), - ("ccn", _(u"North Caucasian languages")), - ("cco", _(u"Comaltepec Chinantec")), - ("ccp", _(u"Chakma")), - ("ccq", _(u"Chaungtha")), - ("ccr", _(u"Cacaopera")), - ("ccs", _(u"South Caucasian languages")), - ("cda", _(u"Choni")), - ("cdc", _(u"Chadic languages")), - ("cdd", _(u"Caddoan languages")), - ("cde", _(u"Chenchu")), - ("cdf", _(u"Chiru")), - ("cdg", _(u"Chamari")), - ("cdh", _(u"Chambeali")), - ("cdi", _(u"Chodri")), - ("cdj", _(u"Churahi")), - ("cdm", _(u"Chepang")), - ("cdn", _(u"Chaudangsi")), - ("cdo", _(u"Min Dong Chinese")), - ("cdr", _(u"Cinda-Regi-Tiyal")), - ("cds", _(u"Chadian Sign Language")), - ("cdy", _(u"Chadong")), - ("cdz", _(u"Koda")), - ("cea", _(u"Lower Chehalis")), - ("ceb", _(u"Cebuano")), - ("ceg", _(u"Chamacoco")), - ("cek", _(u"Eastern Khumi Chin")), - ("cel", _(u"Celtic languages")), - ("cen", _(u"Cen")), - ("cet", _(u"Centúúm")), - ("cfa", _(u"Dijim-Bwilim")), - ("cfd", _(u"Cara")), - ("cfg", _(u"Como Karim")), - ("cfm", _(u"Falam Chin")), - ("cga", _(u"Changriwa")), - ("cgc", _(u"Kagayanen")), - ("cgg", _(u"Chiga")), - ("cgk", _(u"Chocangacakha")), - ("chb", _(u"Chibcha")), - ("chc", _(u"Catawba")), - ("chd", _(u"Highland Oaxaca Chontal")), - ("chf", _(u"Tabasco Chontal")), - ("chg", _(u"Chagatai")), - ("chh", _(u"Chinook")), - ("chj", _(u"Ojitlán Chinantec")), - ("chk", _(u"Chuukese")), - ("chl", _(u"Cahuilla")), - ("chm", _(u"Mari")), - ("chn", _(u"Chinook jargon")), - ("cho", _(u"Choctaw")), - ("chp", _(u"Chipewyan")), - ("chq", _(u"Quiotepec Chinantec")), - ("chr", _(u"Cherokee")), - ("cht", _(u"Cholón")), - ("chw", _(u"Chuwabu")), - ("chx", _(u"Chantyal")), - ("chy", _(u"Cheyenne")), - ("chz", _(u"Ozumacín Chinantec")), - ("cia", _(u"Cia-Cia")), - ("cib", _(u"Ci Gbe")), - ("cic", _(u"Chickasaw")), - ("cid", _(u"Chimariko")), - ("cie", _(u"Cineni")), - ("cih", _(u"Chinali")), - ("cik", _(u"Chitkuli Kinnauri")), - ("cim", _(u"Cimbrian")), - ("cin", _(u"Cinta Larga")), - ("cip", _(u"Chiapanec")), - ("cir", _(u"Tiri")), - ("ciw", _(u"Chippewa")), - ("ciy", _(u"Chaima")), - ("cja", _(u"Western Cham")), - ("cje", _(u"Chru")), - ("cjh", _(u"Upper Chehalis")), - ("cji", _(u"Chamalal")), - ("cjk", _(u"Chokwe")), - ("cjm", _(u"Eastern Cham")), - ("cjn", _(u"Chenapian")), - ("cjo", _(u"Ashéninka Pajonal")), - ("cjp", _(u"Cabécar")), - ("cjr", _(u"Chorotega")), - ("cjs", _(u"Shor")), - ("cjv", _(u"Chuave")), - ("cjy", _(u"Jinyu Chinese")), - ("cka", _(u"Khumi Awa Chin")), - ("ckb", _(u"Central Kurdish")), - ("ckh", _(u"Chak")), - ("ckl", _(u"Cibak")), - ("ckn", _(u"Kaang Chin")), - ("cko", _(u"Anufo")), - ("ckq", _(u"Kajakse")), - ("ckr", _(u"Kairak")), - ("cks", _(u"Tayo")), - ("ckt", _(u"Chukot")), - ("cku", _(u"Koasati")), - ("ckv", _(u"Kavalan")), - ("ckx", _(u"Caka")), - ("cky", _(u"Cakfem-Mushere")), - ("ckz", _(u"Cakchiquel-Quiché Mixed Language")), - ("cla", _(u"Ron")), - ("clc", _(u"Chilcotin")), - ("cld", _(u"Chaldean Neo-Aramaic")), - ("cle", _(u"Lealao Chinantec")), - ("clh", _(u"Chilisso")), - ("cli", _(u"Chakali")), - ("clj", _(u"Laitu Chin")), - ("clk", _(u"Idu-Mishmi")), - ("cll", _(u"Chala")), - ("clm", _(u"Clallam")), - ("clo", _(u"Lowland Oaxaca Chontal")), - ("clt", _(u"Lautu Chin")), - ("clu", _(u"Caluyanun")), - ("clw", _(u"Chulym")), - ("cly", _(u"Eastern Highland Chatino")), - ("cma", _(u"Maa")), - ("cmc", _(u"Chamic languages")), - ("cme", _(u"Cerma")), - ("cmg", _(u"Classical Mongolian")), - ("cmi", _(u"Emberá-Chamí")), - ("cmk", _(u"Chimakum")), - ("cml", _(u"Campalagian")), - ("cmm", _(u"Michigamea")), - ("cmn", _(u"Mandarin Chinese")), - ("cmo", _(u"Central Mnong")), - ("cmr", _(u"Mro-Khimi Chin")), - ("cms", _(u"Messapic")), - ("cmt", _(u"Camtho")), - ("cna", _(u"Changthang")), - ("cnb", _(u"Chinbon Chin")), - ("cnc", _(u"Côông")), - ("cng", _(u"Northern Qiang")), - ("cnh", _(u"Hakha Chin")), - ("cni", _(u"Asháninka")), - ("cnk", _(u"Khumi Chin")), - ("cnl", _(u"Lalana Chinantec")), - ("cno", _(u"Con")), - ("cns", _(u"Central Asmat")), - ("cnt", _(u"Tepetotutla Chinantec")), - ("cnu", _(u"Chenoua")), - ("cnw", _(u"Ngawn Chin")), - ("cnx", _(u"Middle Cornish")), - ("coa", _(u"Cocos Islands Malay")), - ("cob", _(u"Chicomuceltec")), - ("coc", _(u"Cocopa")), - ("cod", _(u"Cocama-Cocamilla")), - ("coe", _(u"Koreguaje")), - ("cof", _(u"Colorado")), - ("cog", _(u"Chong")), - ("coh", _(u"Chonyi-Dzihana-Kauma")), - ("coj", _(u"Cochimi")), - ("cok", _(u"Santa Teresa Cora")), - ("col", _(u"Columbia-Wenatchi")), - ("com", _(u"Comanche")), - ("con", _(u"Cofán")), - ("coo", _(u"Comox")), - ("cop", _(u"Coptic")), - ("coq", _(u"Coquille")), - ("cot", _(u"Caquinte")), - ("cou", _(u"Wamey")), - ("cov", _(u"Cao Miao")), - ("cow", _(u"Cowlitz")), - ("cox", _(u"Nanti")), - ("coy", _(u"Coyaima")), - ("coz", _(u"Chochotec")), - ("cpa", _(u"Palantla Chinantec")), - ("cpb", _(u"Ucayali-Yurúa Ashéninka")), - ("cpc", _(u"Ajyíninka Apurucayali")), - ("cpe", _(u"English-based creoles and pidgins")), - ("cpf", _(u"French-based creoles and pidgins")), - ("cpg", _(u"Cappadocian Greek")), - ("cpi", _(u"Chinese Pidgin English")), - ("cpn", _(u"Cherepon")), - ("cpo", _(u"Kpeego")), - ("cpp", _(u"Portuguese-based creoles and pidgins")), - ("cps", _(u"Capiznon")), - ("cpu", _(u"Pichis Ashéninka")), - ("cpx", _(u"Pu-Xian Chinese")), - ("cpy", _(u"South Ucayali Ashéninka")), - ("cqd", _(u"Chuanqiandian Cluster Miao")), - ("cqu", _(u"Chilean Quechua")), - ("cra", _(u"Chara")), - ("crb", _(u"Island Carib")), - ("crc", _(u"Lonwolwol")), - ("crd", _(u"Coeur d'Alene")), - ("crf", _(u"Caramanta")), - ("crg", _(u"Michif")), - ("crh", _(u"Crimean Tatar")), - ("cri", _(u"Sãotomense")), - ("crj", _(u"Southern East Cree")), - ("crk", _(u"Plains Cree")), - ("crl", _(u"Northern East Cree")), - ("crm", _(u"Moose Cree")), - ("crn", _(u"El Nayar Cora")), - ("cro", _(u"Crow")), - ("crp", _(u"Creoles and pidgins")), - ("crq", _(u"Iyo'wujwa Chorote")), - ("crr", _(u"Carolina Algonquian")), - ("crs", _(u"Seselwa Creole French")), - ("crt", _(u"Iyojwa'ja Chorote")), - ("crv", _(u"Chaura")), - ("crw", _(u"Chrau")), - ("crx", _(u"Carrier")), - ("cry", _(u"Cori")), - ("crz", _(u"Cruzeño")), - ("csa", _(u"Chiltepec Chinantec")), - ("csb", _(u"Kashubian")), - ("csc", _(u"Catalan Sign Language")), - ("csd", _(u"Chiangmai Sign Language")), - ("cse", _(u"Czech Sign Language")), - ("csf", _(u"Cuba Sign Language")), - ("csg", _(u"Chilean Sign Language")), - ("csh", _(u"Asho Chin")), - ("csi", _(u"Coast Miwok")), - ("csj", _(u"Songlai Chin")), - ("csk", _(u"Jola-Kasa")), - ("csl", _(u"Chinese Sign Language")), - ("csm", _(u"Central Sierra Miwok")), - ("csn", _(u"Colombian Sign Language")), - ("cso", _(u"Sochiapam Chinantec")), - ("csq", _(u"Croatia Sign Language")), - ("csr", _(u"Costa Rican Sign Language")), - ("css", _(u"Southern Ohlone")), - ("cst", _(u"Northern Ohlone")), - ("csu", _(u"Central Sudanic languages")), - ("csv", _(u"Sumtu Chin")), - ("csw", _(u"Swampy Cree")), - ("csy", _(u"Siyin Chin")), - ("csz", _(u"Coos")), - ("cta", _(u"Tataltepec Chatino")), - ("ctc", _(u"Chetco")), - ("ctd", _(u"Tedim Chin")), - ("cte", _(u"Tepinapa Chinantec")), - ("ctg", _(u"Chittagonian")), - ("cth", _(u"Thaiphum Chin")), - ("ctl", _(u"Tlacoatzintepec Chinantec")), - ("ctm", _(u"Chitimacha")), - ("ctn", _(u"Chhintange")), - ("cto", _(u"Emberá-Catío")), - ("ctp", _(u"Western Highland Chatino")), - ("cts", _(u"Northern Catanduanes Bikol")), - ("ctt", _(u"Wayanad Chetti")), - ("ctu", _(u"Chol")), - ("ctz", _(u"Zacatepec Chatino")), - ("cua", _(u"Cua")), - ("cub", _(u"Cubeo")), - ("cuc", _(u"Usila Chinantec")), - ("cug", _(u"Cung")), - ("cuh", _(u"Chuka")), - ("cui", _(u"Cuiba")), - ("cuj", _(u"Mashco Piro")), - ("cuk", _(u"San Blas Kuna")), - ("cul", _(u"Culina")), - ("cum", _(u"Cumeral")), - ("cuo", _(u"Cumanagoto")), - ("cup", _(u"Cupeño")), - ("cuq", _(u"Cun")), - ("cur", _(u"Chhulung")), - ("cus", _(u"Cushitic languages")), - ("cut", _(u"Teutila Cuicatec")), - ("cuu", _(u"Tai Ya")), - ("cuv", _(u"Cuvok")), - ("cuw", _(u"Chukwa")), - ("cux", _(u"Tepeuxila Cuicatec")), - ("cvg", _(u"Chug")), - ("cvn", _(u"Valle Nacional Chinantec")), - ("cwa", _(u"Kabwa")), - ("cwb", _(u"Maindo")), - ("cwd", _(u"Woods Cree")), - ("cwe", _(u"Kwere")), - ("cwg", _(u"Chewong")), - ("cwt", _(u"Kuwaataay")), - ("cya", _(u"Nopala Chatino")), - ("cyb", _(u"Cayubaba")), - ("cyo", _(u"Cuyonon")), - ("czh", _(u"Huizhou Chinese")), - ("czk", _(u"Knaanic")), - ("czn", _(u"Zenzontepec Chatino")), - ("czo", _(u"Min Zhong Chinese")), - ("czt", _(u"Zotung Chin")), - ("daa", _(u"Dangaléat")), - ("dac", _(u"Dambi")), - ("dad", _(u"Marik")), - ("dae", _(u"Duupa")), - ("daf", _(u"Dan")), - ("dag", _(u"Dagbani")), - ("dah", _(u"Gwahatike")), - ("dai", _(u"Day")), - ("daj", _(u"Dar Fur Daju")), - ("dak", _(u"Dakota")), - ("dal", _(u"Dahalo")), - ("dam", _(u"Damakawa")), - ("dao", _(u"Daai Chin")), - ("dap", _(u"Nisi")), - ("daq", _(u"Dandami Maria")), - ("dar", _(u"Dargwa")), - ("das", _(u"Daho-Doo")), - ("dau", _(u"Dar Sila Daju")), - ("dav", _(u"Taita")), - ("daw", _(u"Davawenyo")), - ("dax", _(u"Dayi")), - ("day", _(u"Land Dayak languages")), - ("daz", _(u"Dao")), - ("dba", _(u"Bangime")), - ("dbb", _(u"Deno")), - ("dbd", _(u"Dadiya")), - ("dbe", _(u"Dabe")), - ("dbf", _(u"Edopi")), - ("dbg", _(u"Dogul Dom Dogon")), - ("dbi", _(u"Doka")), - ("dbj", _(u"Ida'an")), - ("dbl", _(u"Dyirbal")), - ("dbm", _(u"Duguri")), - ("dbn", _(u"Duriankere")), - ("dbo", _(u"Dulbu")), - ("dbp", _(u"Duwai")), - ("dbq", _(u"Daba")), - ("dbr", _(u"Dabarre")), - ("dbt", _(u"Ben Tey Dogon")), - ("dbu", _(u"Bondum Dom Dogon")), - ("dbv", _(u"Dungu")), - ("dbw", _(u"Bankan Tey Dogon")), - ("dby", _(u"Dibiyaso")), - ("dcc", _(u"Deccan")), - ("dcr", _(u"Negerhollands")), - ("dda", _(u"Dadi Dadi")), - ("ddd", _(u"Dongotono")), - ("dde", _(u"Doondo")), - ("ddg", _(u"Fataluku")), - ("ddi", _(u"West Goodenough")), - ("ddj", _(u"Jaru")), - ("ddn", _(u"Dendi")), - ("ddo", _(u"Dido")), - ("ddr", _(u"Dhudhuroa")), - ("dds", _(u"Donno So Dogon")), - ("ddw", _(u"Dawera-Daweloor")), - ("dec", _(u"Dagik")), - ("ded", _(u"Dedua")), - ("dee", _(u"Dewoin")), - ("def", _(u"Dezfuli")), - ("deg", _(u"Degema")), - ("deh", _(u"Dehwari")), - ("dei", _(u"Demisa")), - ("dek", _(u"Dek")), - ("del", _(u"Delaware")), - ("dem", _(u"Dem")), - ("den", _(u"Slave")), - ("dep", _(u"Pidgin Delaware")), - ("deq", _(u"Dendi")), - ("der", _(u"Deori")), - ("des", _(u"Desano")), - ("dev", _(u"Domung")), - ("dez", _(u"Dengese")), - ("dga", _(u"Southern Dagaare")), - ("dgb", _(u"Bunoge Dogon")), - ("dgc", _(u"Casiguran Dumagat Agta")), - ("dgd", _(u"Dagaari Dioula")), - ("dge", _(u"Degenan")), - ("dgg", _(u"Doga")), - ("dgh", _(u"Dghwede")), - ("dgi", _(u"Northern Dagara")), - ("dgk", _(u"Dagba")), - ("dgl", _(u"Andaandi")), - ("dgn", _(u"Dagoman")), - ("dgo", _(u"Dogri")), - ("dgr", _(u"Dogrib")), - ("dgs", _(u"Dogoso")), - ("dgt", _(u"Ndra'ngith")), - ("dgu", _(u"Degaru")), - ("dgw", _(u"Daungwurrung")), - ("dgx", _(u"Doghoro")), - ("dgz", _(u"Daga")), - ("dha", _(u"Dhanwar")), - ("dhd", _(u"Dhundari")), - ("dhg", _(u"Dhangu-Djangu")), - ("dhi", _(u"Dhimal")), - ("dhl", _(u"Dhalandji")), - ("dhm", _(u"Zemba")), - ("dhn", _(u"Dhanki")), - ("dho", _(u"Dhodia")), - ("dhr", _(u"Dhargari")), - ("dhs", _(u"Dhaiso")), - ("dhu", _(u"Dhurga")), - ("dhv", _(u"Dehu")), - ("dhw", _(u"Dhanwar")), - ("dhx", _(u"Dhungaloo")), - ("dia", _(u"Dia")), - ("dib", _(u"South Central Dinka")), - ("dic", _(u"Lakota Dida")), - ("did", _(u"Didinga")), - ("dif", _(u"Dieri")), - ("dig", _(u"Digo")), - ("dih", _(u"Kumiai")), - ("dii", _(u"Dimbong")), - ("dij", _(u"Dai")), - ("dik", _(u"Southwestern Dinka")), - ("dil", _(u"Dilling")), - ("dim", _(u"Dime")), - ("din", _(u"Dinka")), - ("dio", _(u"Dibo")), - ("dip", _(u"Northeastern Dinka")), - ("diq", _(u"Dimli")), - ("dir", _(u"Dirim")), - ("dis", _(u"Dimasa")), - ("dit", _(u"Dirari")), - ("diu", _(u"Diriku")), - ("diw", _(u"Northwestern Dinka")), - ("dix", _(u"Dixon Reef")), - ("diy", _(u"Diuwe")), - ("diz", _(u"Ding")), - ("dja", _(u"Djadjawurrung")), - ("djb", _(u"Djinba")), - ("djc", _(u"Dar Daju Daju")), - ("djd", _(u"Djamindjung")), - ("dje", _(u"Zarma")), - ("djf", _(u"Djangun")), - ("dji", _(u"Djinang")), - ("djj", _(u"Djeebbana")), - ("djk", _(u"Eastern Maroon Creole")), - ("djl", _(u"Djiwarli")), - ("djm", _(u"Jamsay Dogon")), - ("djn", _(u"Djauan")), - ("djo", _(u"Jangkang")), - ("djr", _(u"Djambarrpuyngu")), - ("dju", _(u"Kapriman")), - ("djw", _(u"Djawi")), - ("dka", _(u"Dakpakha")), - ("dkk", _(u"Dakka")), - ("dkl", _(u"Kolum So Dogon")), - ("dkr", _(u"Kuijau")), - ("dks", _(u"Southeastern Dinka")), - ("dkx", _(u"Mazagway")), - ("dlg", _(u"Dolgan")), - ("dlk", _(u"Dahalik")), - ("dlm", _(u"Dalmatian")), - ("dln", _(u"Darlong")), - ("dma", _(u"Duma")), - ("dmb", _(u"Mombo Dogon")), - ("dmc", _(u"Gavak")), - ("dmd", _(u"Madhi Madhi")), - ("dme", _(u"Dugwor")), - ("dmg", _(u"Upper Kinabatangan")), - ("dmk", _(u"Domaaki")), - ("dml", _(u"Dameli")), - ("dmm", _(u"Dama")), - ("dmn", _(u"Mande languages")), - ("dmo", _(u"Kemedzung")), - ("dmr", _(u"East Damar")), - ("dms", _(u"Dampelas")), - ("dmu", _(u"Dubu")), - ("dmv", _(u"Dumpas")), - ("dmw", _(u"Mudburra")), - ("dmx", _(u"Dema")), - ("dmy", _(u"Demta")), - ("dna", _(u"Upper Grand Valley Dani")), - ("dnd", _(u"Daonda")), - ("dne", _(u"Ndendeule")), - ("dng", _(u"Dungan")), - ("dni", _(u"Lower Grand Valley Dani")), - ("dnj", _(u"Dan")), - ("dnk", _(u"Dengka")), - ("dnn", _(u"Dzùùngoo")), - ("dnr", _(u"Danaru")), - ("dnt", _(u"Mid Grand Valley Dani")), - ("dnu", _(u"Danau")), - ("dnv", _(u"Danu")), - ("dnw", _(u"Western Dani")), - ("dny", _(u"Dení")), - ("doa", _(u"Dom")), - ("dob", _(u"Dobu")), - ("doc", _(u"Northern Dong")), - ("doe", _(u"Doe")), - ("dof", _(u"Domu")), - ("doh", _(u"Dong")), - ("doi", _(u"Dogri")), - ("dok", _(u"Dondo")), - ("dol", _(u"Doso")), - ("don", _(u"Toura")), - ("doo", _(u"Dongo")), - ("dop", _(u"Lukpa")), - ("doq", _(u"Dominican Sign Language")), - ("dor", _(u"Dori'o")), - ("dos", _(u"Dogosé")), - ("dot", _(u"Dass")), - ("dov", _(u"Dombe")), - ("dow", _(u"Doyayo")), - ("dox", _(u"Bussa")), - ("doy", _(u"Dompo")), - ("doz", _(u"Dorze")), - ("dpp", _(u"Papar")), - ("dra", _(u"Dravidian languages")), - ("drb", _(u"Dair")), - ("drc", _(u"Minderico")), - ("drd", _(u"Darmiya")), - ("dre", _(u"Dolpo")), - ("drg", _(u"Rungus")), - ("drh", _(u"Darkhat")), - ("dri", _(u"C'Lela")), - ("drl", _(u"Paakantyi")), - ("drn", _(u"West Damar")), - ("dro", _(u"Daro-Matu Melanau")), - ("drq", _(u"Dura")), - ("drr", _(u"Dororo")), - ("drs", _(u"Gedeo")), - ("drt", _(u"Drents")), - ("dru", _(u"Rukai")), - ("drw", _(u"Darwazi")), - ("dry", _(u"Darai")), - ("dsb", _(u"Lower Sorbian")), - ("dse", _(u"Dutch Sign Language")), - ("dsh", _(u"Daasanach")), - ("dsi", _(u"Disa")), - ("dsl", _(u"Danish Sign Language")), - ("dsn", _(u"Dusner")), - ("dso", _(u"Desiya")), - ("dsq", _(u"Tadaksahak")), - ("dta", _(u"Daur")), - ("dtb", _(u"Labuk-Kinabatangan Kadazan")), - ("dtd", _(u"Ditidaht")), - ("dth", _(u"Adithinngithigh")), - ("dti", _(u"Ana Tinga Dogon")), - ("dtk", _(u"Tene Kan Dogon")), - ("dtm", _(u"Tomo Kan Dogon")), - ("dtn", _(u"Daatsʼíin")), - ("dto", _(u"Tommo So Dogon")), - ("dtp", _(u"Kadazan Dusun")), - ("dtr", _(u"Lotud")), - ("dts", _(u"Toro So Dogon")), - ("dtt", _(u"Toro Tegu Dogon")), - ("dtu", _(u"Tebul Ure Dogon")), - ("dty", _(u"Dotyali")), - ("dua", _(u"Duala")), - ("dub", _(u"Dubli")), - ("duc", _(u"Duna")), - ("dud", _(u"Hun-Saare")), - ("due", _(u"Umiray Dumaget Agta")), - ("duf", _(u"Dumbea")), - ("dug", _(u"Duruma")), - ("duh", _(u"Dungra Bhil")), - ("dui", _(u"Dumun")), - ("duj", _(u"Dhuwal")), - ("duk", _(u"Uyajitaya")), - ("dul", _(u"Alabat Island Agta")), - ("dum", _(u"Middle Dutch")), - ("dun", _(u"Dusun Deyah")), - ("duo", _(u"Dupaninan Agta")), - ("dup", _(u"Duano")), - ("duq", _(u"Dusun Malang")), - ("dur", _(u"Dii")), - ("dus", _(u"Dumi")), - ("duu", _(u"Drung")), - ("duv", _(u"Duvle")), - ("duw", _(u"Dusun Witu")), - ("dux", _(u"Duungooma")), - ("duy", _(u"Dicamay Agta")), - ("duz", _(u"Duli-Gey")), - ("dva", _(u"Duau")), - ("dwa", _(u"Diri")), - ("dwl", _(u"Walo Kumbe Dogon")), - ("dwr", _(u"Dawro")), - ("dws", _(u"Dutton World Speedwords")), - ("dwu", _(u"Dhuwal")), - ("dww", _(u"Dawawa")), - ("dwy", _(u"Dhuwaya")), - ("dya", _(u"Dyan")), - ("dyb", _(u"Dyaberdyaber")), - ("dyd", _(u"Dyugun")), - ("dyg", _(u"Villa Viciosa Agta")), - ("dyi", _(u"Djimini Senoufo")), - ("dym", _(u"Yanda Dom Dogon")), - ("dyn", _(u"Dyangadi")), - ("dyo", _(u"Jola-Fonyi")), - ("dyu", _(u"Dyula")), - ("dyy", _(u"Dyaabugay")), - ("dza", _(u"Tunzu")), - ("dzd", _(u"Daza")), - ("dze", _(u"Djiwarli")), - ("dzg", _(u"Dazaga")), - ("dzl", _(u"Dzalakha")), - ("dzn", _(u"Dzando")), - ("eaa", _(u"Karenggapa")), - ("ebg", _(u"Ebughu")), - ("ebk", _(u"Eastern Bontok")), - ("ebo", _(u"Teke-Ebo")), - ("ebr", _(u"Ebrié")), - ("ebu", _(u"Embu")), - ("ecr", _(u"Eteocretan")), - ("ecs", _(u"Ecuadorian Sign Language")), - ("ecy", _(u"Eteocypriot")), - ("eee", _(u"E")), - ("efa", _(u"Efai")), - ("efe", _(u"Efe")), - ("efi", _(u"Efik")), - ("ega", _(u"Ega")), - ("egl", _(u"Emilian")), - ("ego", _(u"Eggon")), - ("egx", _(u"Egyptian languages")), - ("egy", _(u"Egyptian")), - ("ehu", _(u"Ehueun")), - ("eip", _(u"Eipomek")), - ("eit", _(u"Eitiep")), - ("eiv", _(u"Askopan")), - ("eja", _(u"Ejamat")), - ("eka", _(u"Ekajuk")), - ("ekc", _(u"Eastern Karnic")), - ("eke", _(u"Ekit")), - ("ekg", _(u"Ekari")), - ("eki", _(u"Eki")), - ("ekk", _(u"Standard Estonian")), - ("ekl", _(u"Kol")), - ("ekm", _(u"Elip")), - ("eko", _(u"Koti")), - ("ekp", _(u"Ekpeye")), - ("ekr", _(u"Yace")), - ("eky", _(u"Eastern Kayah")), - ("ele", _(u"Elepi")), - ("elh", _(u"El Hugeirat")), - ("eli", _(u"Nding")), - ("elk", _(u"Elkei")), - ("elm", _(u"Eleme")), - ("elo", _(u"El Molo")), - ("elp", _(u"Elpaputih")), - ("elu", _(u"Elu")), - ("elx", _(u"Elamite")), - ("ema", _(u"Emai-Iuleha-Ora")), - ("emb", _(u"Embaloh")), - ("eme", _(u"Emerillon")), - ("emg", _(u"Eastern Meohang")), - ("emi", _(u"Mussau-Emira")), - ("emk", _(u"Eastern Maninkakan")), - ("emm", _(u"Mamulique")), - ("emn", _(u"Eman")), - ("emo", _(u"Emok")), - ("emp", _(u"Northern Emberá")), - ("ems", _(u"Pacific Gulf Yupik")), - ("emu", _(u"Eastern Muria")), - ("emw", _(u"Emplawas")), - ("emx", _(u"Erromintxela")), - ("emy", _(u"Epigraphic Mayan")), - ("ena", _(u"Apali")), - ("enb", _(u"Markweeta")), - ("enc", _(u"En")), - ("end", _(u"Ende")), - ("enf", _(u"Forest Enets")), - ("enh", _(u"Tundra Enets")), - ("enl", _(u"Enlhet")), - ("enm", _(u"Middle English")), - ("enn", _(u"Engenni")), - ("eno", _(u"Enggano")), - ("enq", _(u"Enga")), - ("enr", _(u"Emumu")), - ("enu", _(u"Enu")), - ("env", _(u"Enwan")), - ("enw", _(u"Enwan")), - ("enx", _(u"Enxet")), - ("eot", _(u"Beti")), - ("epi", _(u"Epie")), - ("era", _(u"Eravallan")), - ("erg", _(u"Sie")), - ("erh", _(u"Eruwa")), - ("eri", _(u"Ogea")), - ("erk", _(u"South Efate")), - ("ero", _(u"Horpa")), - ("err", _(u"Erre")), - ("ers", _(u"Ersu")), - ("ert", _(u"Eritai")), - ("erw", _(u"Erokwanas")), - ("ese", _(u"Ese Ejja")), - ("esg", _(u"Aheri Gondi")), - ("esh", _(u"Eshtehardi")), - ("esi", _(u"North Alaskan Inupiatun")), - ("esk", _(u"Northwest Alaska Inupiatun")), - ("esl", _(u"Egypt Sign Language")), - ("esm", _(u"Esuma")), - ("esn", _(u"Salvadoran Sign Language")), - ("eso", _(u"Estonian Sign Language")), - ("esq", _(u"Esselen")), - ("ess", _(u"Central Siberian Yupik")), - ("esu", _(u"Central Yupik")), - ("esx", _(u"Eskimo-Aleut languages")), - ("esy", _(u"Eskayan")), - ("etb", _(u"Etebi")), - ("etc", _(u"Etchemin")), - ("eth", _(u"Ethiopian Sign Language")), - ("etn", _(u"Eton")), - ("eto", _(u"Eton")), - ("etr", _(u"Edolo")), - ("ets", _(u"Yekhee")), - ("ett", _(u"Etruscan")), - ("etu", _(u"Ejagham")), - ("etx", _(u"Eten")), - ("etz", _(u"Semimi")), - ("euq", _(u"Basque")), - ("eve", _(u"Even")), - ("evh", _(u"Uvbie")), - ("evn", _(u"Evenki")), - ("ewo", _(u"Ewondo")), - ("ext", _(u"Extremaduran")), - ("eya", _(u"Eyak")), - ("eyo", _(u"Keiyo")), - ("eza", _(u"Ezaa")), - ("eze", _(u"Uzekwe")), - ("faa", _(u"Fasu")), - ("fab", _(u"Fa d'Ambu")), - ("fad", _(u"Wagi")), - ("faf", _(u"Fagani")), - ("fag", _(u"Finongan")), - ("fah", _(u"Baissa Fali")), - ("fai", _(u"Faiwol")), - ("faj", _(u"Faita")), - ("fak", _(u"Fang")), - ("fal", _(u"South Fali")), - ("fam", _(u"Fam")), - ("fan", _(u"Fang")), - ("fap", _(u"Palor")), - ("far", _(u"Fataleka")), - ("fat", _(u"Fanti")), - ("fau", _(u"Fayu")), - ("fax", _(u"Fala")), - ("fay", _(u"Southwestern Fars")), - ("faz", _(u"Northwestern Fars")), - ("fbl", _(u"West Albay Bikol")), - ("fcs", _(u"Quebec Sign Language")), - ("fer", _(u"Feroge")), - ("ffi", _(u"Foia Foia")), - ("ffm", _(u"Maasina Fulfulde")), - ("fgr", _(u"Fongoro")), - ("fia", _(u"Nobiin")), - ("fie", _(u"Fyer")), - ("fil", _(u"Filipino")), - ("fip", _(u"Fipa")), - ("fir", _(u"Firan")), - ("fit", _(u"Tornedalen Finnish")), - ("fiu", _(u"Finno-Ugrian languages")), - ("fiw", _(u"Fiwaga")), - ("fkk", _(u"Kirya-Konzəl")), - ("fkv", _(u"Kven Finnish")), - ("fla", _(u"Kalispel-Pend d'Oreille")), - ("flh", _(u"Foau")), - ("fli", _(u"Fali")), - ("fll", _(u"North Fali")), - ("fln", _(u"Flinders Island")), - ("flr", _(u"Fuliiru")), - ("fly", _(u"Flaaitaal")), - ("fmp", _(u"Fe'fe'")), - ("fmu", _(u"Far Western Muria")), - ("fnb", _(u"Fanbak")), - ("fng", _(u"Fanagalo")), - ("fni", _(u"Fania")), - ("fod", _(u"Foodo")), - ("foi", _(u"Foi")), - ("fom", _(u"Foma")), - ("fon", _(u"Fon")), - ("for", _(u"Fore")), - ("fos", _(u"Siraya")), - ("fox", _(u"Formosan languages")), - ("fpe", _(u"Fernando Po Creole English")), - ("fqs", _(u"Fas")), - ("frc", _(u"Cajun French")), - ("frd", _(u"Fordata")), - ("frk", _(u"Frankish")), - ("frm", _(u"Middle French")), - ("fro", _(u"Old French")), - ("frp", _(u"Arpitan")), - ("frq", _(u"Forak")), - ("frr", _(u"Northern Frisian")), - ("frs", _(u"Eastern Frisian")), - ("frt", _(u"Fortsenal")), - ("fse", _(u"Finnish Sign Language")), - ("fsl", _(u"French Sign Language")), - ("fss", _(u"Finland-Swedish Sign Language")), - ("fub", _(u"Adamawa Fulfulde")), - ("fuc", _(u"Pulaar")), - ("fud", _(u"East Futuna")), - ("fue", _(u"Borgu Fulfulde")), - ("fuf", _(u"Pular")), - ("fuh", _(u"Western Niger Fulfulde")), - ("fui", _(u"Bagirmi Fulfulde")), - ("fuj", _(u"Ko")), - ("fum", _(u"Fum")), - ("fun", _(u"Fulniô")), - ("fuq", _(u"Central-Eastern Niger Fulfulde")), - ("fur", _(u"Friulian")), - ("fut", _(u"Futuna-Aniwa")), - ("fuu", _(u"Furu")), - ("fuv", _(u"Nigerian Fulfulde")), - ("fuy", _(u"Fuyug")), - ("fvr", _(u"Fur")), - ("fwa", _(u"Fwâi")), - ("fwe", _(u"Fwe")), - ("gaa", _(u"Ga")), - ("gab", _(u"Gabri")), - ("gac", _(u"Mixed Great Andamanese")), - ("gad", _(u"Gaddang")), - ("gae", _(u"Guarequena")), - ("gaf", _(u"Gende")), - ("gag", _(u"Gagauz")), - ("gah", _(u"Alekano")), - ("gai", _(u"Borei")), - ("gaj", _(u"Gadsup")), - ("gak", _(u"Gamkonora")), - ("gal", _(u"Galolen")), - ("gam", _(u"Kandawo")), - ("gan", _(u"Gan Chinese")), - ("gao", _(u"Gants")), - ("gap", _(u"Gal")), - ("gaq", _(u"Gata'")), - ("gar", _(u"Galeya")), - ("gas", _(u"Adiwasi Garasia")), - ("gat", _(u"Kenati")), - ("gau", _(u"Mudhili Gadaba")), - ("gav", _(u"Gabutamon")), - ("gaw", _(u"Nobonob")), - ("gax", _(u"Borana-Arsi-Guji Oromo")), - ("gay", _(u"Gayo")), - ("gaz", _(u"West Central Oromo")), - ("gba", _(u"Gbaya")), - ("gbb", _(u"Kaytetye")), - ("gbc", _(u"Garawa")), - ("gbd", _(u"Karadjeri")), - ("gbe", _(u"Niksek")), - ("gbf", _(u"Gaikundi")), - ("gbg", _(u"Gbanziri")), - ("gbh", _(u"Defi Gbe")), - ("gbi", _(u"Galela")), - ("gbj", _(u"Bodo Gadaba")), - ("gbk", _(u"Gaddi")), - ("gbl", _(u"Gamit")), - ("gbm", _(u"Garhwali")), - ("gbn", _(u"Mo'da")), - ("gbo", _(u"Northern Grebo")), - ("gbp", _(u"Gbaya-Bossangoa")), - ("gbq", _(u"Gbaya-Bozoum")), - ("gbr", _(u"Gbagyi")), - ("gbs", _(u"Gbesi Gbe")), - ("gbu", _(u"Gagadu")), - ("gbv", _(u"Gbanu")), - ("gbw", _(u"Gabi-Gabi")), - ("gbx", _(u"Eastern Xwla Gbe")), - ("gby", _(u"Gbari")), - ("gbz", _(u"Zoroastrian Dari")), - ("gcc", _(u"Mali")), - ("gcd", _(u"Ganggalida")), - ("gce", _(u"Galice")), - ("gcf", _(u"Guadeloupean Creole French")), - ("gcl", _(u"Grenadian Creole English")), - ("gcn", _(u"Gaina")), - ("gcr", _(u"Guianese Creole French")), - ("gct", _(u"Colonia Tovar German")), - ("gda", _(u"Gade Lohar")), - ("gdb", _(u"Pottangi Ollar Gadaba")), - ("gdc", _(u"Gugu Badhun")), - ("gdd", _(u"Gedaged")), - ("gde", _(u"Gude")), - ("gdf", _(u"Guduf-Gava")), - ("gdg", _(u"Ga'dang")), - ("gdh", _(u"Gadjerawang")), - ("gdi", _(u"Gundi")), - ("gdj", _(u"Gurdjar")), - ("gdk", _(u"Gadang")), - ("gdl", _(u"Dirasha")), - ("gdm", _(u"Laal")), - ("gdn", _(u"Umanakaina")), - ("gdo", _(u"Ghodoberi")), - ("gdq", _(u"Mehri")), - ("gdr", _(u"Wipi")), - ("gds", _(u"Ghandruk Sign Language")), - ("gdt", _(u"Kungardutyi")), - ("gdu", _(u"Gudu")), - ("gdx", _(u"Godwari")), - ("gea", _(u"Geruma")), - ("geb", _(u"Kire")), - ("gec", _(u"Gboloo Grebo")), - ("ged", _(u"Gade")), - ("geg", _(u"Gengle")), - ("geh", _(u"Hutterite German")), - ("gei", _(u"Gebe")), - ("gej", _(u"Gen")), - ("gek", _(u"Ywom")), - ("gel", _(u"ut-Ma'in")), - ("gem", _(u"Germanic languages")), - ("geq", _(u"Geme")), - ("ges", _(u"Geser-Gorom")), - ("gev", _(u"Eviya")), - ("gew", _(u"Gera")), - ("gex", _(u"Garre")), - ("gey", _(u"Enya")), - ("gez", _(u"Geez")), - ("gfk", _(u"Patpatar")), - ("gft", _(u"Gafat")), - ("gfx", _(u"Mangetti Dune !Xung")), - ("gga", _(u"Gao")), - ("ggb", _(u"Gbii")), - ("ggd", _(u"Gugadj")), - ("gge", _(u"Guragone")), - ("ggg", _(u"Gurgula")), - ("ggk", _(u"Kungarakany")), - ("ggl", _(u"Ganglau")), - ("ggn", _(u"Eastern Gurung")), - ("ggo", _(u"Southern Gondi")), - ("ggr", _(u"Aghu Tharnggalu")), - ("ggt", _(u"Gitua")), - ("ggu", _(u"Gagu")), - ("ggw", _(u"Gogodala")), - ("gha", _(u"Ghadamès")), - ("ghc", _(u"Hiberno-Scottish Gaelic")), - ("ghe", _(u"Southern Ghale")), - ("ghh", _(u"Northern Ghale")), - ("ghk", _(u"Geko Karen")), - ("ghl", _(u"Ghulfan")), - ("ghn", _(u"Ghanongga")), - ("gho", _(u"Ghomara")), - ("ghr", _(u"Ghera")), - ("ghs", _(u"Guhu-Samane")), - ("ght", _(u"Kuke")), - ("gia", _(u"Kitja")), - ("gib", _(u"Gibanawa")), - ("gic", _(u"Gail")), - ("gid", _(u"Gidar")), - ("gig", _(u"Goaria")), - ("gih", _(u"Githabul")), - ("gil", _(u"Gilbertese")), - ("gim", _(u"Gimi")), - ("gin", _(u"Hinukh")), - ("gio", _(u"Gelao")), - ("gip", _(u"Gimi")), - ("giq", _(u"Green Gelao")), - ("gir", _(u"Red Gelao")), - ("gis", _(u"North Giziga")), - ("git", _(u"Gitxsan")), - ("giu", _(u"Mulao")), - ("giw", _(u"White Gelao")), - ("gix", _(u"Gilima")), - ("giy", _(u"Giyug")), - ("giz", _(u"South Giziga")), - ("gji", _(u"Geji")), - ("gjk", _(u"Kachi Koli")), - ("gjm", _(u"Gunditjmara")), - ("gjn", _(u"Gonja")), - ("gjr", _(u"Gurindji Kriol")), - ("gju", _(u"Gujari")), - ("gka", _(u"Guya")), - ("gke", _(u"Ndai")), - ("gkn", _(u"Gokana")), - ("gko", _(u"Kok-Nar")), - ("gkp", _(u"Guinea Kpelle")), - ("gku", _(u"ǂUngkue")), - ("glc", _(u"Bon Gula")), - ("gld", _(u"Nanai")), - ("glh", _(u"Northwest Pashai")), - ("gli", _(u"Guliguli")), - ("glj", _(u"Gula Iro")), - ("glk", _(u"Gilaki")), - ("gll", _(u"Garlali")), - ("glo", _(u"Galambu")), - ("glr", _(u"Glaro-Twabo")), - ("glu", _(u"Gula")), - ("glw", _(u"Glavda")), - ("gly", _(u"Gule")), - ("gma", _(u"Gambera")), - ("gmb", _(u"Gula'alaa")), - ("gmd", _(u"Mághdì")), - ("gme", _(u"East Germanic languages")), - ("gmg", _(u"Magɨyi")), - ("gmh", _(u"Middle High German")), - ("gml", _(u"Middle Low German")), - ("gmm", _(u"Gbaya-Mbodomo")), - ("gmn", _(u"Gimnime")), - ("gmq", _(u"North Germanic languages")), - ("gmu", _(u"Gumalu")), - ("gmv", _(u"Gamo")), - ("gmw", _(u"West Germanic languages")), - ("gmx", _(u"Magoma")), - ("gmy", _(u"Mycenaean Greek")), - ("gmz", _(u"Mgbolizhia")), - ("gna", _(u"Kaansa")), - ("gnb", _(u"Gangte")), - ("gnc", _(u"Guanche")), - ("gnd", _(u"Zulgo-Gemzek")), - ("gne", _(u"Ganang")), - ("gng", _(u"Ngangam")), - ("gnh", _(u"Lere")), - ("gni", _(u"Gooniyandi")), - ("gnk", _(u"//Gana")), - ("gnl", _(u"Gangulu")), - ("gnm", _(u"Ginuman")), - ("gnn", _(u"Gumatj")), - ("gno", _(u"Northern Gondi")), - ("gnq", _(u"Gana")), - ("gnr", _(u"Gureng Gureng")), - ("gnt", _(u"Guntai")), - ("gnu", _(u"Gnau")), - ("gnw", _(u"Western Bolivian Guaraní")), - ("gnz", _(u"Ganzi")), - ("goa", _(u"Guro")), - ("gob", _(u"Playero")), - ("goc", _(u"Gorakor")), - ("god", _(u"Godié")), - ("goe", _(u"Gongduk")), - ("gof", _(u"Gofa")), - ("gog", _(u"Gogo")), - ("goh", _(u"Old High German")), - ("goi", _(u"Gobasi")), - ("goj", _(u"Gowlan")), - ("gok", _(u"Gowli")), - ("gol", _(u"Gola")), - ("gom", _(u"Goan Konkani")), - ("gon", _(u"Gondi")), - ("goo", _(u"Gone Dau")), - ("gop", _(u"Yeretuar")), - ("goq", _(u"Gorap")), - ("gor", _(u"Gorontalo")), - ("gos", _(u"Gronings")), - ("got", _(u"Gothic")), - ("gou", _(u"Gavar")), - ("gow", _(u"Gorowa")), - ("gox", _(u"Gobu")), - ("goy", _(u"Goundo")), - ("goz", _(u"Gozarkhani")), - ("gpa", _(u"Gupa-Abawa")), - ("gpe", _(u"Ghanaian Pidgin English")), - ("gpn", _(u"Taiap")), - ("gqa", _(u"Ga'anda")), - ("gqi", _(u"Guiqiong")), - ("gqn", _(u"Guana")), - ("gqr", _(u"Gor")), - ("gqu", _(u"Qau")), - ("gra", _(u"Rajput Garasia")), - ("grb", _(u"Grebo")), - ("grc", _(u"Ancient Greek")), - ("grd", _(u"Guruntum-Mbaaru")), - ("grg", _(u"Madi")), - ("grh", _(u"Gbiri-Niragu")), - ("gri", _(u"Ghari")), - ("grj", _(u"Southern Grebo")), - ("grk", _(u"Greek languages")), - ("grm", _(u"Kota Marudu Talantang")), - ("gro", _(u"Groma")), - ("grq", _(u"Gorovu")), - ("grr", _(u"Taznatit")), - ("grs", _(u"Gresi")), - ("grt", _(u"Garo")), - ("gru", _(u"Kistane")), - ("grv", _(u"Central Grebo")), - ("grw", _(u"Gweda")), - ("grx", _(u"Guriaso")), - ("gry", _(u"Barclayville Grebo")), - ("grz", _(u"Guramalum")), - ("gse", _(u"Ghanaian Sign Language")), - ("gsg", _(u"German Sign Language")), - ("gsl", _(u"Gusilay")), - ("gsm", _(u"Guatemalan Sign Language")), - ("gsn", _(u"Nema")), - ("gso", _(u"Southwest Gbaya")), - ("gsp", _(u"Wasembo")), - ("gss", _(u"Greek Sign Language")), - ("gsw", _(u"Swiss German")), - ("gta", _(u"Guató")), - ("gti", _(u"Gbati-ri")), - ("gtu", _(u"Aghu-Tharnggala")), - ("gua", _(u"Shiki")), - ("gub", _(u"Guajajára")), - ("guc", _(u"Wayuu")), - ("gud", _(u"Yocoboué Dida")), - ("gue", _(u"Gurinji")), - ("guf", _(u"Gupapuyngu")), - ("gug", _(u"Paraguayan Guaraní")), - ("guh", _(u"Guahibo")), - ("gui", _(u"Eastern Bolivian Guaraní")), - ("guk", _(u"Gumuz")), - ("gul", _(u"Sea Island Creole English")), - ("gum", _(u"Guambiano")), - ("gun", _(u"Mbyá Guaraní")), - ("guo", _(u"Guayabero")), - ("gup", _(u"Gunwinggu")), - ("guq", _(u"Aché")), - ("gur", _(u"Farefare")), - ("gus", _(u"Guinean Sign Language")), - ("gut", _(u"Maléku Jaíka")), - ("guu", _(u"Yanomamö")), - ("guv", _(u"Gey")), - ("guw", _(u"Gun")), - ("gux", _(u"Gourmanchéma")), - ("guz", _(u"Gusii")), - ("gva", _(u"Guana")), - ("gvc", _(u"Guanano")), - ("gve", _(u"Duwet")), - ("gvf", _(u"Golin")), - ("gvj", _(u"Guajá")), - ("gvl", _(u"Gulay")), - ("gvm", _(u"Gurmana")), - ("gvn", _(u"Kuku-Yalanji")), - ("gvo", _(u"Gavião Do Jiparaná")), - ("gvp", _(u"Pará Gavião")), - ("gvr", _(u"Gurung")), - ("gvs", _(u"Gumawana")), - ("gvy", _(u"Guyani")), - ("gwa", _(u"Mbato")), - ("gwb", _(u"Gwa")), - ("gwc", _(u"Kalami")), - ("gwd", _(u"Gawwada")), - ("gwe", _(u"Gweno")), - ("gwf", _(u"Gowro")), - ("gwg", _(u"Moo")), - ("gwi", _(u"Gwichʼin")), - ("gwj", _(u"/Gwi")), - ("gwm", _(u"Awngthim")), - ("gwn", _(u"Gwandara")), - ("gwr", _(u"Gwere")), - ("gwt", _(u"Gawar-Bati")), - ("gwu", _(u"Guwamu")), - ("gww", _(u"Kwini")), - ("gwx", _(u"Gua")), - ("gxx", _(u"Wè Southern")), - ("gya", _(u"Northwest Gbaya")), - ("gyb", _(u"Garus")), - ("gyd", _(u"Kayardild")), - ("gye", _(u"Gyem")), - ("gyf", _(u"Gungabula")), - ("gyg", _(u"Gbayi")), - ("gyi", _(u"Gyele")), - ("gyl", _(u"Gayil")), - ("gym", _(u"Ngäbere")), - ("gyn", _(u"Guyanese Creole English")), - ("gyr", _(u"Guarayu")), - ("gyy", _(u"Gunya")), - ("gza", _(u"Ganza")), - ("gzi", _(u"Gazi")), - ("gzn", _(u"Gane")), - ("haa", _(u"Han")), - ("hab", _(u"Hanoi Sign Language")), - ("hac", _(u"Gurani")), - ("had", _(u"Hatam")), - ("hae", _(u"Eastern Oromo")), - ("haf", _(u"Haiphong Sign Language")), - ("hag", _(u"Hanga")), - ("hah", _(u"Hahon")), - ("hai", _(u"Haida")), - ("haj", _(u"Hajong")), - ("hak", _(u"Hakka Chinese")), - ("hal", _(u"Halang")), - ("ham", _(u"Hewa")), - ("han", _(u"Hangaza")), - ("hao", _(u"Hakö")), - ("hap", _(u"Hupla")), - ("haq", _(u"Ha")), - ("har", _(u"Harari")), - ("has", _(u"Haisla")), - ("hav", _(u"Havu")), - ("haw", _(u"Hawaiian")), - ("hax", _(u"Southern Haida")), - ("hay", _(u"Haya")), - ("haz", _(u"Hazaragi")), - ("hba", _(u"Hamba")), - ("hbb", _(u"Huba")), - ("hbn", _(u"Heiban")), - ("hbo", _(u"Ancient Hebrew")), - ("hbu", _(u"Habu")), - ("hca", _(u"Andaman Creole Hindi")), - ("hch", _(u"Huichol")), - ("hdn", _(u"Northern Haida")), - ("hds", _(u"Honduras Sign Language")), - ("hdy", _(u"Hadiyya")), - ("hea", _(u"Northern Qiandong Miao")), - ("hed", _(u"Herdé")), - ("heg", _(u"Helong")), - ("heh", _(u"Hehe")), - ("hei", _(u"Heiltsuk")), - ("hem", _(u"Hemba")), - ("hgm", _(u"Hai//om")), - ("hgw", _(u"Haigwai")), - ("hhi", _(u"Hoia Hoia")), - ("hhr", _(u"Kerak")), - ("hhy", _(u"Hoyahoya")), - ("hia", _(u"Lamang")), - ("hib", _(u"Hibito")), - ("hid", _(u"Hidatsa")), - ("hif", _(u"Fiji Hindi")), - ("hig", _(u"Kamwe")), - ("hih", _(u"Pamosu")), - ("hii", _(u"Hinduri")), - ("hij", _(u"Hijuk")), - ("hik", _(u"Seit-Kaitetu")), - ("hil", _(u"Hiligaynon")), - ("him", _(u"Himachali languages")), - ("hio", _(u"Tsoa")), - ("hir", _(u"Himarimã")), - ("hit", _(u"Hittite")), - ("hiw", _(u"Hiw")), - ("hix", _(u"Hixkaryána")), - ("hji", _(u"Haji")), - ("hka", _(u"Kahe")), - ("hke", _(u"Hunde")), - ("hkk", _(u"Hunjara-Kaina Ke")), - ("hks", _(u"Hong Kong Sign Language")), - ("hla", _(u"Halia")), - ("hlb", _(u"Halbi")), - ("hld", _(u"Halang Doan")), - ("hle", _(u"Hlersu")), - ("hlt", _(u"Matu Chin")), - ("hlu", _(u"Hieroglyphic Luwian")), - ("hma", _(u"Southern Mashan Hmong")), - ("hmb", _(u"Humburi Senni Songhay")), - ("hmc", _(u"Central Huishui Hmong")), - ("hmd", _(u"Large Flowery Miao")), - ("hme", _(u"Eastern Huishui Hmong")), - ("hmf", _(u"Hmong Don")), - ("hmg", _(u"Southwestern Guiyang Hmong")), - ("hmh", _(u"Southwestern Huishui Hmong")), - ("hmi", _(u"Northern Huishui Hmong")), - ("hmj", _(u"Ge")), - ("hmk", _(u"Maek")), - ("hml", _(u"Luopohe Hmong")), - ("hmm", _(u"Central Mashan Hmong")), - ("hmn", _(u"Hmong")), - ("hmp", _(u"Northern Mashan Hmong")), - ("hmq", _(u"Eastern Qiandong Miao")), - ("hmr", _(u"Hmar")), - ("hms", _(u"Southern Qiandong Miao")), - ("hmt", _(u"Hamtai")), - ("hmu", _(u"Hamap")), - ("hmv", _(u"Hmong Dô")), - ("hmw", _(u"Western Mashan Hmong")), - ("hmx", _(u"Hmong-Mien languages")), - ("hmy", _(u"Southern Guiyang Hmong")), - ("hmz", _(u"Hmong Shua")), - ("hna", _(u"Mina")), - ("hnd", _(u"Southern Hindko")), - ("hne", _(u"Chhattisgarhi")), - ("hnh", _(u"//Ani")), - ("hni", _(u"Hani")), - ("hnj", _(u"Hmong Njua")), - ("hnn", _(u"Hanunoo")), - ("hno", _(u"Northern Hindko")), - ("hns", _(u"Caribbean Hindustani")), - ("hnu", _(u"Hung")), - ("hoa", _(u"Hoava")), - ("hob", _(u"Mari")), - ("hoc", _(u"Ho")), - ("hod", _(u"Holma")), - ("hoe", _(u"Horom")), - ("hoh", _(u"Hobyót")), - ("hoi", _(u"Holikachuk")), - ("hoj", _(u"Hadothi")), - ("hok", _(u"Hokan languages")), - ("hol", _(u"Holu")), - ("hom", _(u"Homa")), - ("hoo", _(u"Holoholo")), - ("hop", _(u"Hopi")), - ("hor", _(u"Horo")), - ("hos", _(u"Ho Chi Minh City Sign Language")), - ("hot", _(u"Hote")), - ("hov", _(u"Hovongan")), - ("how", _(u"Honi")), - ("hoy", _(u"Holiya")), - ("hoz", _(u"Hozo")), - ("hpo", _(u"Hpon")), - ("hps", _(u"Hawai'i Sign Language")), - ("hra", _(u"Hrangkhol")), - ("hrc", _(u"Niwer Mil")), - ("hre", _(u"Hre")), - ("hrk", _(u"Haruku")), - ("hrm", _(u"Horned Miao")), - ("hro", _(u"Haroi")), - ("hrp", _(u"Nhirrpi")), - ("hrr", _(u"Horuru")), - ("hrt", _(u"Hértevin")), - ("hru", _(u"Hruso")), - ("hrw", _(u"Warwar Feni")), - ("hrx", _(u"Hunsrik")), - ("hrz", _(u"Harzani")), - ("hsb", _(u"Upper Sorbian")), - ("hsh", _(u"Hungarian Sign Language")), - ("hsl", _(u"Hausa Sign Language")), - ("hsn", _(u"Xiang Chinese")), - ("hss", _(u"Harsusi")), - ("hti", _(u"Hoti")), - ("hto", _(u"Minica Huitoto")), - ("hts", _(u"Hadza")), - ("htu", _(u"Hitu")), - ("htx", _(u"Middle Hittite")), - ("hub", _(u"Huambisa")), - ("huc", _(u"=/Hua")), - ("hud", _(u"Huaulu")), - ("hue", _(u"San Francisco Del Mar Huave")), - ("huf", _(u"Humene")), - ("hug", _(u"Huachipaeri")), - ("huh", _(u"Huilliche")), - ("hui", _(u"Huli")), - ("huj", _(u"Northern Guiyang Hmong")), - ("huk", _(u"Hulung")), - ("hul", _(u"Hula")), - ("hum", _(u"Hungana")), - ("huo", _(u"Hu")), - ("hup", _(u"Hupa")), - ("huq", _(u"Tsat")), - ("hur", _(u"Halkomelem")), - ("hus", _(u"Huastec")), - ("hut", _(u"Humla")), - ("huu", _(u"Murui Huitoto")), - ("huv", _(u"San Mateo Del Mar Huave")), - ("huw", _(u"Hukumina")), - ("hux", _(u"Nüpode Huitoto")), - ("huy", _(u"Hulaulá")), - ("huz", _(u"Hunzib")), - ("hvc", _(u"Haitian Vodoun Culture Language")), - ("hve", _(u"San Dionisio Del Mar Huave")), - ("hvk", _(u"Haveke")), - ("hvn", _(u"Sabu")), - ("hvv", _(u"Santa María Del Mar Huave")), - ("hwa", _(u"Wané")), - ("hwc", _(u"Hawai'i Creole English")), - ("hwo", _(u"Hwana")), - ("hya", _(u"Hya")), - ("hyx", _(u"Armenian")), - ("iai", _(u"Iaai")), - ("ian", _(u"Iatmul")), - ("iap", _(u"Iapama")), - ("iar", _(u"Purari")), - ("iba", _(u"Iban")), - ("ibb", _(u"Ibibio")), - ("ibd", _(u"Iwaidja")), - ("ibe", _(u"Akpes")), - ("ibg", _(u"Ibanag")), - ("ibi", _(u"Ibilo")), - ("ibl", _(u"Ibaloi")), - ("ibm", _(u"Agoi")), - ("ibn", _(u"Ibino")), - ("ibr", _(u"Ibuoro")), - ("ibu", _(u"Ibu")), - ("iby", _(u"Ibani")), - ("ica", _(u"Ede Ica")), - ("ich", _(u"Etkywan")), - ("icl", _(u"Icelandic Sign Language")), - ("icr", _(u"Islander Creole English")), - ("ida", _(u"Idakho-Isukha-Tiriki")), - ("idb", _(u"Indo-Portuguese")), - ("idc", _(u"Idon")), - ("idd", _(u"Ede Idaca")), - ("ide", _(u"Idere")), - ("idi", _(u"Idi")), - ("idr", _(u"Indri")), - ("ids", _(u"Idesa")), - ("idt", _(u"Idaté")), - ("idu", _(u"Idoma")), - ("ifa", _(u"Amganad Ifugao")), - ("ifb", _(u"Batad Ifugao")), - ("ife", _(u"Ifè")), - ("iff", _(u"Ifo")), - ("ifk", _(u"Tuwali Ifugao")), - ("ifm", _(u"Teke-Fuumu")), - ("ifu", _(u"Mayoyao Ifugao")), - ("ify", _(u"Keley-I Kallahan")), - ("igb", _(u"Ebira")), - ("ige", _(u"Igede")), - ("igg", _(u"Igana")), - ("igl", _(u"Igala")), - ("igm", _(u"Kanggape")), - ("ign", _(u"Ignaciano")), - ("igo", _(u"Isebe")), - ("igs", _(u"Interglossa")), - ("igw", _(u"Igwe")), - ("ihb", _(u"Iha Based Pidgin")), - ("ihi", _(u"Ihievbe")), - ("ihp", _(u"Iha")), - ("ihw", _(u"Bidhawal")), - ("iin", _(u"Thiin")), - ("iir", _(u"Indo-Iranian languages")), - ("ijc", _(u"Izon")), - ("ije", _(u"Biseni")), - ("ijj", _(u"Ede Ije")), - ("ijn", _(u"Kalabari")), - ("ijo", _(u"Ijo languages")), - ("ijs", _(u"Southeast Ijo")), - ("ike", _(u"Eastern Canadian Inuktitut")), - ("iki", _(u"Iko")), - ("ikk", _(u"Ika")), - ("ikl", _(u"Ikulu")), - ("iko", _(u"Olulumo-Ikom")), - ("ikp", _(u"Ikpeshi")), - ("ikr", _(u"Ikaranggal")), - ("iks", _(u"Inuit Sign Language")), - ("ikt", _(u"Inuinnaqtun")), - ("ikv", _(u"Iku-Gora-Ankwa")), - ("ikw", _(u"Ikwere")), - ("ikx", _(u"Ik")), - ("ikz", _(u"Ikizu")), - ("ila", _(u"Ile Ape")), - ("ilb", _(u"Ila")), - ("ilg", _(u"Garig-Ilgar")), - ("ili", _(u"Ili Turki")), - ("ilk", _(u"Ilongot")), - ("ill", _(u"Iranun")), - ("ilm", _(u"Iranun")), - ("ilo", _(u"Iloko")), - ("ilp", _(u"Iranun")), - ("ils", _(u"International Sign")), - ("ilu", _(u"Ili'uun")), - ("ilv", _(u"Ilue")), - ("ilw", _(u"Talur")), - ("ima", _(u"Mala Malasar")), - ("ime", _(u"Imeraguen")), - ("imi", _(u"Anamgura")), - ("iml", _(u"Miluk")), - ("imn", _(u"Imonda")), - ("imo", _(u"Imbongu")), - ("imr", _(u"Imroing")), - ("ims", _(u"Marsian")), - ("imy", _(u"Milyan")), - ("inb", _(u"Inga")), - ("inc", _(u"Indic languages")), - ("ine", _(u"Indo-European languages")), - ("ing", _(u"Degexit'an")), - ("inh", _(u"Ingush")), - ("inj", _(u"Jungle Inga")), - ("inl", _(u"Indonesian Sign Language")), - ("inm", _(u"Minaean")), - ("inn", _(u"Isinai")), - ("ino", _(u"Inoke-Yate")), - ("inp", _(u"Iñapari")), - ("ins", _(u"Indian Sign Language")), - ("int", _(u"Intha")), - ("inz", _(u"Ineseño")), - ("ior", _(u"Inor")), - ("iou", _(u"Tuma-Irumu")), - ("iow", _(u"Iowa-Oto")), - ("ipi", _(u"Ipili")), - ("ipo", _(u"Ipiko")), - ("iqu", _(u"Iquito")), - ("iqw", _(u"Ikwo")), - ("ira", _(u"Iranian languages")), - ("ire", _(u"Iresim")), - ("irh", _(u"Irarutu")), - ("iri", _(u"Irigwe")), - ("irk", _(u"Iraqw")), - ("irn", _(u"Irántxe")), - ("iro", _(u"Iroquoian languages")), - ("irr", _(u"Ir")), - ("iru", _(u"Irula")), - ("irx", _(u"Kamberau")), - ("iry", _(u"Iraya")), - ("isa", _(u"Isabi")), - ("isc", _(u"Isconahua")), - ("isd", _(u"Isnag")), - ("ise", _(u"Italian Sign Language")), - ("isg", _(u"Irish Sign Language")), - ("ish", _(u"Esan")), - ("isi", _(u"Nkem-Nkum")), - ("isk", _(u"Ishkashimi")), - ("ism", _(u"Masimasi")), - ("isn", _(u"Isanzu")), - ("iso", _(u"Isoko")), - ("isr", _(u"Israeli Sign Language")), - ("ist", _(u"Istriot")), - ("isu", _(u"Isu")), - ("itb", _(u"Binongan Itneg")), - ("itc", _(u"Italic languages")), - ("itd", _(u"Southern Tidung")), - ("ite", _(u"Itene")), - ("iti", _(u"Inlaod Itneg")), - ("itk", _(u"Judeo-Italian")), - ("itl", _(u"Itelmen")), - ("itm", _(u"Itu Mbon Uzo")), - ("ito", _(u"Itonama")), - ("itr", _(u"Iteri")), - ("its", _(u"Isekiri")), - ("itt", _(u"Maeng Itneg")), - ("itv", _(u"Itawit")), - ("itw", _(u"Ito")), - ("itx", _(u"Itik")), - ("ity", _(u"Moyadan Itneg")), - ("itz", _(u"Itzá")), - ("ium", _(u"Iu Mien")), - ("ivb", _(u"Ibatan")), - ("ivv", _(u"Ivatan")), - ("iwk", _(u"I-Wak")), - ("iwm", _(u"Iwam")), - ("iwo", _(u"Iwur")), - ("iws", _(u"Sepik Iwam")), - ("ixc", _(u"Ixcatec")), - ("ixl", _(u"Ixil")), - ("iya", _(u"Iyayu")), - ("iyo", _(u"Mesaka")), - ("iyx", _(u"Yaka")), - ("izh", _(u"Ingrian")), - ("izi", _(u"Izi-Ezaa-Ikwo-Mgbo")), - ("izr", _(u"Izere")), - ("izz", _(u"Izii")), - ("jaa", _(u"Jamamadí")), - ("jab", _(u"Hyam")), - ("jac", _(u"Popti'")), - ("jad", _(u"Jahanka")), - ("jae", _(u"Yabem")), - ("jaf", _(u"Jara")), - ("jah", _(u"Jah Hut")), - ("jaj", _(u"Zazao")), - ("jak", _(u"Jakun")), - ("jal", _(u"Yalahatan")), - ("jam", _(u"Jamaican Creole English")), - ("jan", _(u"Jandai")), - ("jao", _(u"Yanyuwa")), - ("jaq", _(u"Yaqay")), - ("jar", _(u"Jarawa")), - ("jas", _(u"New Caledonian Javanese")), - ("jat", _(u"Jakati")), - ("jau", _(u"Yaur")), - ("jax", _(u"Jambi Malay")), - ("jay", _(u"Yan-nhangu")), - ("jaz", _(u"Jawe")), - ("jbe", _(u"Judeo-Berber")), - ("jbi", _(u"Badjiri")), - ("jbj", _(u"Arandai")), - ("jbk", _(u"Barikewa")), - ("jbn", _(u"Nafusi")), - ("jbo", _(u"Lojban")), - ("jbr", _(u"Jofotek-Bromnya")), - ("jbt", _(u"Jabutí")), - ("jbu", _(u"Jukun Takum")), - ("jbw", _(u"Yawijibaya")), - ("jcs", _(u"Jamaican Country Sign Language")), - ("jct", _(u"Krymchak")), - ("jda", _(u"Jad")), - ("jdg", _(u"Jadgali")), - ("jdt", _(u"Judeo-Tat")), - ("jeb", _(u"Jebero")), - ("jee", _(u"Jerung")), - ("jeg", _(u"Jeng")), - ("jeh", _(u"Jeh")), - ("jei", _(u"Yei")), - ("jek", _(u"Jeri Kuo")), - ("jel", _(u"Yelmek")), - ("jen", _(u"Dza")), - ("jer", _(u"Jere")), - ("jet", _(u"Manem")), - ("jeu", _(u"Jonkor Bourmataguil")), - ("jgb", _(u"Ngbee")), - ("jge", _(u"Judeo-Georgian")), - ("jgk", _(u"Gwak")), - ("jgo", _(u"Ngomba")), - ("jhi", _(u"Jehai")), - ("jhs", _(u"Jhankot Sign Language")), - ("jia", _(u"Jina")), - ("jib", _(u"Jibu")), - ("jic", _(u"Tol")), - ("jid", _(u"Bu")), - ("jie", _(u"Jilbe")), - ("jig", _(u"Djingili")), - ("jih", _(u"sTodsde")), - ("jii", _(u"Jiiddu")), - ("jil", _(u"Jilim")), - ("jim", _(u"Jimi")), - ("jio", _(u"Jiamao")), - ("jiq", _(u"Guanyinqiao")), - ("jit", _(u"Jita")), - ("jiu", _(u"Youle Jinuo")), - ("jiv", _(u"Shuar")), - ("jiy", _(u"Buyuan Jinuo")), - ("jje", _(u"Jejueo")), - ("jjr", _(u"Bankal")), - ("jka", _(u"Kaera")), - ("jkm", _(u"Mobwa Karen")), - ("jko", _(u"Kubo")), - ("jkp", _(u"Paku Karen")), - ("jkr", _(u"Koro")), - ("jku", _(u"Labir")), - ("jle", _(u"Ngile")), - ("jls", _(u"Jamaican Sign Language")), - ("jma", _(u"Dima")), - ("jmb", _(u"Zumbun")), - ("jmc", _(u"Machame")), - ("jmd", _(u"Yamdena")), - ("jmi", _(u"Jimi")), - ("jml", _(u"Jumli")), - ("jmn", _(u"Makuri Naga")), - ("jmr", _(u"Kamara")), - ("jms", _(u"Mashi")), - ("jmw", _(u"Mouwase")), - ("jmx", _(u"Western Juxtlahuaca Mixtec")), - ("jna", _(u"Jangshung")), - ("jnd", _(u"Jandavra")), - ("jng", _(u"Yangman")), - ("jni", _(u"Janji")), - ("jnj", _(u"Yemsa")), - ("jnl", _(u"Rawat")), - ("jns", _(u"Jaunsari")), - ("job", _(u"Joba")), - ("jod", _(u"Wojenaka")), - ("jog", _(u"Jogi")), - ("jor", _(u"Jorá")), - ("jos", _(u"Jordanian Sign Language")), - ("jow", _(u"Jowulu")), - ("jpa", _(u"Jewish Palestinian Aramaic")), - ("jpr", _(u"Judeo-Persian")), - ("jpx", _(u"Japanese")), - ("jqr", _(u"Jaqaru")), - ("jra", _(u"Jarai")), - ("jrb", _(u"Judeo-Arabic")), - ("jrr", _(u"Jiru")), - ("jrt", _(u"Jorto")), - ("jru", _(u"Japrería")), - ("jsl", _(u"Japanese Sign Language")), - ("jua", _(u"Júma")), - ("jub", _(u"Wannu")), - ("juc", _(u"Jurchen")), - ("jud", _(u"Worodougou")), - ("juh", _(u"Hõne")), - ("jui", _(u"Ngadjuri")), - ("juk", _(u"Wapan")), - ("jul", _(u"Jirel")), - ("jum", _(u"Jumjum")), - ("jun", _(u"Juang")), - ("juo", _(u"Jiba")), - ("jup", _(u"Hupdë")), - ("jur", _(u"Jurúna")), - ("jus", _(u"Jumla Sign Language")), - ("jut", _(u"Jutish")), - ("juu", _(u"Ju")), - ("juw", _(u"Wãpha")), - ("juy", _(u"Juray")), - ("jvd", _(u"Javindo")), - ("jvn", _(u"Caribbean Javanese")), - ("jwi", _(u"Jwira-Pepesa")), - ("jya", _(u"Jiarong")), - ("jye", _(u"Judeo-Yemeni Arabic")), - ("jyy", _(u"Jaya")), - ("kaa", _(u"Kara-Kalpak")), - ("kab", _(u"Kabyle")), - ("kac", _(u"Kachin")), - ("kad", _(u"Adara")), - ("kae", _(u"Ketangalan")), - ("kaf", _(u"Katso")), - ("kag", _(u"Kajaman")), - ("kah", _(u"Kara")), - ("kai", _(u"Karekare")), - ("kaj", _(u"Jju")), - ("kak", _(u"Kalanguya")), - ("kam", _(u"Kamba")), - ("kao", _(u"Xaasongaxango")), - ("kap", _(u"Bezhta")), - ("kaq", _(u"Capanahua")), - ("kar", _(u"Karen languages")), - ("kav", _(u"Katukína")), - ("kaw", _(u"Kawi")), - ("kax", _(u"Kao")), - ("kay", _(u"Kamayurá")), - ("kba", _(u"Kalarko")), - ("kbb", _(u"Kaxuiâna")), - ("kbc", _(u"Kadiwéu")), - ("kbd", _(u"Kabardian")), - ("kbe", _(u"Kanju")), - ("kbf", _(u"Kakauhua")), - ("kbg", _(u"Khamba")), - ("kbh", _(u"Camsá")), - ("kbi", _(u"Kaptiau")), - ("kbj", _(u"Kari")), - ("kbk", _(u"Grass Koiari")), - ("kbl", _(u"Kanembu")), - ("kbm", _(u"Iwal")), - ("kbn", _(u"Kare")), - ("kbo", _(u"Keliko")), - ("kbp", _(u"Kabiyè")), - ("kbq", _(u"Kamano")), - ("kbr", _(u"Kafa")), - ("kbs", _(u"Kande")), - ("kbt", _(u"Abadi")), - ("kbu", _(u"Kabutra")), - ("kbv", _(u"Dera")), - ("kbw", _(u"Kaiep")), - ("kbx", _(u"Ap Ma")), - ("kby", _(u"Manga Kanuri")), - ("kbz", _(u"Duhwa")), - ("kca", _(u"Khanty")), - ("kcb", _(u"Kawacha")), - ("kcc", _(u"Lubila")), - ("kcd", _(u"Ngkâlmpw Kanum")), - ("kce", _(u"Kaivi")), - ("kcf", _(u"Ukaan")), - ("kcg", _(u"Tyap")), - ("kch", _(u"Vono")), - ("kci", _(u"Kamantan")), - ("kcj", _(u"Kobiana")), - ("kck", _(u"Kalanga")), - ("kcl", _(u"Kela")), - ("kcm", _(u"Gula")), - ("kcn", _(u"Nubi")), - ("kco", _(u"Kinalakna")), - ("kcp", _(u"Kanga")), - ("kcq", _(u"Kamo")), - ("kcr", _(u"Katla")), - ("kcs", _(u"Koenoem")), - ("kct", _(u"Kaian")), - ("kcu", _(u"Kami")), - ("kcv", _(u"Kete")), - ("kcw", _(u"Kabwari")), - ("kcx", _(u"Kachama-Ganjule")), - ("kcy", _(u"Korandje")), - ("kcz", _(u"Konongo")), - ("kda", _(u"Worimi")), - ("kdc", _(u"Kutu")), - ("kdd", _(u"Yankunytjatjara")), - ("kde", _(u"Makonde")), - ("kdf", _(u"Mamusi")), - ("kdg", _(u"Seba")), - ("kdh", _(u"Tem")), - ("kdi", _(u"Kumam")), - ("kdj", _(u"Karamojong")), - ("kdk", _(u"Numèè")), - ("kdl", _(u"Tsikimba")), - ("kdm", _(u"Kagoma")), - ("kdn", _(u"Kunda")), - ("kdo", _(u"Kordofanian languages")), - ("kdp", _(u"Kaningdon-Nindem")), - ("kdq", _(u"Koch")), - ("kdr", _(u"Karaim")), - ("kdt", _(u"Kuy")), - ("kdu", _(u"Kadaru")), - ("kdv", _(u"Kado")), - ("kdw", _(u"Koneraw")), - ("kdx", _(u"Kam")), - ("kdy", _(u"Keder")), - ("kdz", _(u"Kwaja")), - ("kea", _(u"Kabuverdianu")), - ("keb", _(u"Kélé")), - ("kec", _(u"Keiga")), - ("ked", _(u"Kerewe")), - ("kee", _(u"Eastern Keres")), - ("kef", _(u"Kpessi")), - ("keg", _(u"Tese")), - ("keh", _(u"Keak")), - ("kei", _(u"Kei")), - ("kej", _(u"Kadar")), - ("kek", _(u"Kekchí")), - ("kel", _(u"Kela")), - ("kem", _(u"Kemak")), - ("ken", _(u"Kenyang")), - ("keo", _(u"Kakwa")), - ("kep", _(u"Kaikadi")), - ("keq", _(u"Kamar")), - ("ker", _(u"Kera")), - ("kes", _(u"Kugbo")), - ("ket", _(u"Ket")), - ("keu", _(u"Akebu")), - ("kev", _(u"Kanikkaran")), - ("kew", _(u"West Kewa")), - ("kex", _(u"Kukna")), - ("key", _(u"Kupia")), - ("kez", _(u"Kukele")), - ("kfa", _(u"Kodava")), - ("kfb", _(u"Northwestern Kolami")), - ("kfc", _(u"Konda-Dora")), - ("kfd", _(u"Korra Koraga")), - ("kfe", _(u"Kota")), - ("kff", _(u"Koya")), - ("kfg", _(u"Kudiya")), - ("kfh", _(u"Kurichiya")), - ("kfi", _(u"Kannada Kurumba")), - ("kfj", _(u"Kemiehua")), - ("kfk", _(u"Kinnauri")), - ("kfl", _(u"Kung")), - ("kfm", _(u"Khunsari")), - ("kfn", _(u"Kuk")), - ("kfo", _(u"Koro")), - ("kfp", _(u"Korwa")), - ("kfq", _(u"Korku")), - ("kfr", _(u"Kachhi")), - ("kfs", _(u"Bilaspuri")), - ("kft", _(u"Kanjari")), - ("kfu", _(u"Katkari")), - ("kfv", _(u"Kurmukar")), - ("kfw", _(u"Kharam Naga")), - ("kfx", _(u"Kullu Pahari")), - ("kfy", _(u"Kumaoni")), - ("kfz", _(u"Koromfé")), - ("kga", _(u"Koyaga")), - ("kgb", _(u"Kawe")), - ("kgc", _(u"Kasseng")), - ("kgd", _(u"Kataang")), - ("kge", _(u"Komering")), - ("kgf", _(u"Kube")), - ("kgg", _(u"Kusunda")), - ("kgh", _(u"Upper Tanudan Kalinga")), - ("kgi", _(u"Selangor Sign Language")), - ("kgj", _(u"Gamale Kham")), - ("kgk", _(u"Kaiwá")), - ("kgl", _(u"Kunggari")), - ("kgm", _(u"Karipúna")), - ("kgn", _(u"Karingani")), - ("kgo", _(u"Krongo")), - ("kgp", _(u"Kaingang")), - ("kgq", _(u"Kamoro")), - ("kgr", _(u"Abun")), - ("kgs", _(u"Kumbainggar")), - ("kgt", _(u"Somyev")), - ("kgu", _(u"Kobol")), - ("kgv", _(u"Karas")), - ("kgw", _(u"Karon Dori")), - ("kgx", _(u"Kamaru")), - ("kgy", _(u"Kyerung")), - ("kha", _(u"Khasi")), - ("khb", _(u"Lü")), - ("khc", _(u"Tukang Besi North")), - ("khd", _(u"Bädi Kanum")), - ("khe", _(u"Korowai")), - ("khf", _(u"Khuen")), - ("khg", _(u"Khams Tibetan")), - ("khh", _(u"Kehu")), - ("khi", _(u"Khoisan languages")), - ("khj", _(u"Kuturmi")), - ("khk", _(u"Halh Mongolian")), - ("khl", _(u"Lusi")), - ("khn", _(u"Khandesi")), - ("kho", _(u"Khotanese")), - ("khp", _(u"Kapori")), - ("khq", _(u"Koyra Chiini Songhay")), - ("khr", _(u"Kharia")), - ("khs", _(u"Kasua")), - ("kht", _(u"Khamti")), - ("khu", _(u"Nkhumbi")), - ("khv", _(u"Khvarshi")), - ("khw", _(u"Khowar")), - ("khx", _(u"Kanu")), - ("khy", _(u"Kele")), - ("khz", _(u"Keapara")), - ("kia", _(u"Kim")), - ("kib", _(u"Koalib")), - ("kic", _(u"Kickapoo")), - ("kid", _(u"Koshin")), - ("kie", _(u"Kibet")), - ("kif", _(u"Eastern Parbate Kham")), - ("kig", _(u"Kimaama")), - ("kih", _(u"Kilmeri")), - ("kii", _(u"Kitsai")), - ("kij", _(u"Kilivila")), - ("kil", _(u"Kariya")), - ("kim", _(u"Karagas")), - ("kio", _(u"Kiowa")), - ("kip", _(u"Sheshi Kham")), - ("kiq", _(u"Kosadle")), - ("kis", _(u"Kis")), - ("kit", _(u"Agob")), - ("kiu", _(u"Kirmanjki")), - ("kiv", _(u"Kimbu")), - ("kiw", _(u"Northeast Kiwai")), - ("kix", _(u"Khiamniungan Naga")), - ("kiy", _(u"Kirikiri")), - ("kiz", _(u"Kisi")), - ("kja", _(u"Mlap")), - ("kjb", _(u"Q'anjob'al")), - ("kjc", _(u"Coastal Konjo")), - ("kjd", _(u"Southern Kiwai")), - ("kje", _(u"Kisar")), - ("kjf", _(u"Khalaj")), - ("kjg", _(u"Khmu")), - ("kjh", _(u"Khakas")), - ("kji", _(u"Zabana")), - ("kjj", _(u"Khinalugh")), - ("kjk", _(u"Highland Konjo")), - ("kjl", _(u"Western Parbate Kham")), - ("kjm", _(u"Kháng")), - ("kjn", _(u"Kunjen")), - ("kjo", _(u"Harijan Kinnauri")), - ("kjp", _(u"Pwo Eastern Karen")), - ("kjq", _(u"Western Keres")), - ("kjr", _(u"Kurudu")), - ("kjs", _(u"East Kewa")), - ("kjt", _(u"Phrae Pwo Karen")), - ("kju", _(u"Kashaya")), - ("kjv", _(u"Kaikavian Literary Language")), - ("kjx", _(u"Ramopa")), - ("kjy", _(u"Erave")), - ("kjz", _(u"Bumthangkha")), - ("kka", _(u"Kakanda")), - ("kkb", _(u"Kwerisa")), - ("kkc", _(u"Odoodee")), - ("kkd", _(u"Kinuku")), - ("kke", _(u"Kakabe")), - ("kkf", _(u"Kalaktang Monpa")), - ("kkg", _(u"Mabaka Valley Kalinga")), - ("kkh", _(u"Khün")), - ("kki", _(u"Kagulu")), - ("kkj", _(u"Kako")), - ("kkk", _(u"Kokota")), - ("kkl", _(u"Kosarek Yale")), - ("kkm", _(u"Kiong")), - ("kkn", _(u"Kon Keu")), - ("kko", _(u"Karko")), - ("kkp", _(u"Gugubera")), - ("kkq", _(u"Kaiku")), - ("kkr", _(u"Kir-Balar")), - ("kks", _(u"Giiwo")), - ("kkt", _(u"Koi")), - ("kku", _(u"Tumi")), - ("kkv", _(u"Kangean")), - ("kkw", _(u"Teke-Kukuya")), - ("kkx", _(u"Kohin")), - ("kky", _(u"Guguyimidjir")), - ("kkz", _(u"Kaska")), - ("kla", _(u"Klamath-Modoc")), - ("klb", _(u"Kiliwa")), - ("klc", _(u"Kolbila")), - ("kld", _(u"Gamilaraay")), - ("kle", _(u"Kulung")), - ("klf", _(u"Kendeje")), - ("klg", _(u"Tagakaulo")), - ("klh", _(u"Weliki")), - ("kli", _(u"Kalumpang")), - ("klj", _(u"Turkic Khalaj")), - ("klk", _(u"Kono")), - ("kll", _(u"Kagan Kalagan")), - ("klm", _(u"Migum")), - ("kln", _(u"Kalenjin")), - ("klo", _(u"Kapya")), - ("klp", _(u"Kamasa")), - ("klq", _(u"Rumu")), - ("klr", _(u"Khaling")), - ("kls", _(u"Kalasha")), - ("klt", _(u"Nukna")), - ("klu", _(u"Klao")), - ("klv", _(u"Maskelynes")), - ("klw", _(u"Lindu")), - ("klx", _(u"Koluwawa")), - ("kly", _(u"Kalao")), - ("klz", _(u"Kabola")), - ("kma", _(u"Konni")), - ("kmb", _(u"Kimbundu")), - ("kmc", _(u"Southern Dong")), - ("kmd", _(u"Majukayang Kalinga")), - ("kme", _(u"Bakole")), - ("kmf", _(u"Kare")), - ("kmg", _(u"Kâte")), - ("kmh", _(u"Kalam")), - ("kmi", _(u"Kami")), - ("kmj", _(u"Kumarbhag Paharia")), - ("kmk", _(u"Limos Kalinga")), - ("kml", _(u"Tanudan Kalinga")), - ("kmm", _(u"Kom")), - ("kmn", _(u"Awtuw")), - ("kmo", _(u"Kwoma")), - ("kmp", _(u"Gimme")), - ("kmq", _(u"Kwama")), - ("kmr", _(u"Northern Kurdish")), - ("kms", _(u"Kamasau")), - ("kmt", _(u"Kemtuik")), - ("kmu", _(u"Kanite")), - ("kmv", _(u"Karipúna Creole French")), - ("kmw", _(u"Komo")), - ("kmx", _(u"Waboda")), - ("kmy", _(u"Koma")), - ("kmz", _(u"Khorasani Turkish")), - ("kna", _(u"Dera")), - ("knb", _(u"Lubuagan Kalinga")), - ("knc", _(u"Central Kanuri")), - ("knd", _(u"Konda")), - ("kne", _(u"Kankanaey")), - ("knf", _(u"Mankanya")), - ("kng", _(u"Koongo")), - ("kni", _(u"Kanufi")), - ("knj", _(u"Western Kanjobal")), - ("knk", _(u"Kuranko")), - ("knl", _(u"Keninjal")), - ("knm", _(u"Kanamarí")), - ("knn", _(u"Konkani")), - ("kno", _(u"Kono")), - ("knp", _(u"Kwanja")), - ("knq", _(u"Kintaq")), - ("knr", _(u"Kaningra")), - ("kns", _(u"Kensiu")), - ("knt", _(u"Panoan Katukína")), - ("knu", _(u"Kono")), - ("knv", _(u"Tabo")), - ("knw", _(u"Kung-Ekoka")), - ("knx", _(u"Kendayan")), - ("kny", _(u"Kanyok")), - ("knz", _(u"Kalamsé")), - ("koa", _(u"Konomala")), - ("koc", _(u"Kpati")), - ("kod", _(u"Kodi")), - ("koe", _(u"Kacipo-Balesi")), - ("kof", _(u"Kubi")), - ("kog", _(u"Cogui")), - ("koh", _(u"Koyo")), - ("koi", _(u"Komi-Permyak")), - ("koj", _(u"Sara Dunjo")), - ("kok", _(u"Konkani")), - ("kol", _(u"Kol")), - ("koo", _(u"Konzo")), - ("kop", _(u"Waube")), - ("koq", _(u"Kota")), - ("kos", _(u"Kosraean")), - ("kot", _(u"Lagwan")), - ("kou", _(u"Koke")), - ("kov", _(u"Kudu-Camo")), - ("kow", _(u"Kugama")), - ("kox", _(u"Coxima")), - ("koy", _(u"Koyukon")), - ("koz", _(u"Korak")), - ("kpa", _(u"Kutto")), - ("kpb", _(u"Mullu Kurumba")), - ("kpc", _(u"Curripaco")), - ("kpd", _(u"Koba")), - ("kpe", _(u"Kpelle")), - ("kpf", _(u"Komba")), - ("kpg", _(u"Kapingamarangi")), - ("kph", _(u"Kplang")), - ("kpi", _(u"Kofei")), - ("kpj", _(u"Karajá")), - ("kpk", _(u"Kpan")), - ("kpl", _(u"Kpala")), - ("kpm", _(u"Koho")), - ("kpn", _(u"Kepkiriwát")), - ("kpo", _(u"Ikposo")), - ("kpp", _(u"Paku Karen")), - ("kpq", _(u"Korupun-Sela")), - ("kpr", _(u"Korafe-Yegha")), - ("kps", _(u"Tehit")), - ("kpt", _(u"Karata")), - ("kpu", _(u"Kafoa")), - ("kpv", _(u"Komi-Zyrian")), - ("kpw", _(u"Kobon")), - ("kpx", _(u"Mountain Koiali")), - ("kpy", _(u"Koryak")), - ("kpz", _(u"Kupsabiny")), - ("kqa", _(u"Mum")), - ("kqb", _(u"Kovai")), - ("kqc", _(u"Doromu-Koki")), - ("kqd", _(u"Koy Sanjaq Surat")), - ("kqe", _(u"Kalagan")), - ("kqf", _(u"Kakabai")), - ("kqg", _(u"Khe")), - ("kqh", _(u"Kisankasa")), - ("kqi", _(u"Koitabu")), - ("kqj", _(u"Koromira")), - ("kqk", _(u"Kotafon Gbe")), - ("kql", _(u"Kyenele")), - ("kqm", _(u"Khisa")), - ("kqn", _(u"Kaonde")), - ("kqo", _(u"Eastern Krahn")), - ("kqp", _(u"Kimré")), - ("kqq", _(u"Krenak")), - ("kqr", _(u"Kimaragang")), - ("kqs", _(u"Northern Kissi")), - ("kqt", _(u"Klias River Kadazan")), - ("kqu", _(u"Seroa")), - ("kqv", _(u"Okolod")), - ("kqw", _(u"Kandas")), - ("kqx", _(u"Mser")), - ("kqy", _(u"Koorete")), - ("kqz", _(u"Korana")), - ("kra", _(u"Kumhali")), - ("krb", _(u"Karkin")), - ("krc", _(u"Karachay-Balkar")), - ("krd", _(u"Kairui-Midiki")), - ("kre", _(u"Panará")), - ("krf", _(u"Koro")), - ("krh", _(u"Kurama")), - ("kri", _(u"Krio")), - ("krj", _(u"Kinaray-A")), - ("krk", _(u"Kerek")), - ("krl", _(u"Karelian")), - ("krm", _(u"Krim")), - ("krn", _(u"Sapo")), - ("kro", _(u"Kru languages")), - ("krp", _(u"Korop")), - ("krr", _(u"Kru'ng 2")), - ("krs", _(u"Gbaya")), - ("krt", _(u"Tumari Kanuri")), - ("kru", _(u"Kurukh")), - ("krv", _(u"Kavet")), - ("krw", _(u"Western Krahn")), - ("krx", _(u"Karon")), - ("kry", _(u"Kryts")), - ("krz", _(u"Sota Kanum")), - ("ksa", _(u"Shuwa-Zamani")), - ("ksb", _(u"Shambala")), - ("ksc", _(u"Southern Kalinga")), - ("ksd", _(u"Kuanua")), - ("kse", _(u"Kuni")), - ("ksf", _(u"Bafia")), - ("ksg", _(u"Kusaghe")), - ("ksh", _(u"Kölsch")), - ("ksi", _(u"Krisa")), - ("ksj", _(u"Uare")), - ("ksk", _(u"Kansa")), - ("ksl", _(u"Kumalu")), - ("ksm", _(u"Kumba")), - ("ksn", _(u"Kasiguranin")), - ("kso", _(u"Kofa")), - ("ksp", _(u"Kaba")), - ("ksq", _(u"Kwaami")), - ("ksr", _(u"Borong")), - ("kss", _(u"Southern Kisi")), - ("kst", _(u"Winyé")), - ("ksu", _(u"Khamyang")), - ("ksv", _(u"Kusu")), - ("ksw", _(u"S'gaw Karen")), - ("ksx", _(u"Kedang")), - ("ksy", _(u"Kharia Thar")), - ("ksz", _(u"Kodaku")), - ("kta", _(u"Katua")), - ("ktb", _(u"Kambaata")), - ("ktc", _(u"Kholok")), - ("ktd", _(u"Kokata")), - ("kte", _(u"Nubri")), - ("ktf", _(u"Kwami")), - ("ktg", _(u"Kalkutung")), - ("kth", _(u"Karanga")), - ("kti", _(u"North Muyu")), - ("ktj", _(u"Plapo Krumen")), - ("ktk", _(u"Kaniet")), - ("ktl", _(u"Koroshi")), - ("ktm", _(u"Kurti")), - ("ktn", _(u"Karitiâna")), - ("kto", _(u"Kuot")), - ("ktp", _(u"Kaduo")), - ("ktq", _(u"Katabaga")), - ("ktr", _(u"Kota Marudu Tinagas")), - ("kts", _(u"South Muyu")), - ("ktt", _(u"Ketum")), - ("ktu", _(u"Kituba")), - ("ktv", _(u"Eastern Katu")), - ("ktw", _(u"Kato")), - ("ktx", _(u"Kaxararí")), - ("kty", _(u"Kango")), - ("ktz", _(u"Ju/'hoan")), - ("kub", _(u"Kutep")), - ("kuc", _(u"Kwinsu")), - ("kud", _(u"'Auhelawa")), - ("kue", _(u"Kuman")), - ("kuf", _(u"Western Katu")), - ("kug", _(u"Kupa")), - ("kuh", _(u"Kushi")), - ("kui", _(u"Kuikúro-Kalapálo")), - ("kuj", _(u"Kuria")), - ("kuk", _(u"Kepo'")), - ("kul", _(u"Kulere")), - ("kum", _(u"Kumyk")), - ("kun", _(u"Kunama")), - ("kuo", _(u"Kumukio")), - ("kup", _(u"Kunimaipa")), - ("kuq", _(u"Karipuna")), - ("kus", _(u"Kusaal")), - ("kut", _(u"Kutenai")), - ("kuu", _(u"Upper Kuskokwim")), - ("kuv", _(u"Kur")), - ("kuw", _(u"Kpagua")), - ("kux", _(u"Kukatja")), - ("kuy", _(u"Kuuku-Ya'u")), - ("kuz", _(u"Kunza")), - ("kva", _(u"Bagvalal")), - ("kvb", _(u"Kubu")), - ("kvc", _(u"Kove")), - ("kvd", _(u"Kui")), - ("kve", _(u"Kalabakan")), - ("kvf", _(u"Kabalai")), - ("kvg", _(u"Kuni-Boazi")), - ("kvh", _(u"Komodo")), - ("kvi", _(u"Kwang")), - ("kvj", _(u"Psikye")), - ("kvk", _(u"Korean Sign Language")), - ("kvl", _(u"Kayaw")), - ("kvm", _(u"Kendem")), - ("kvn", _(u"Border Kuna")), - ("kvo", _(u"Dobel")), - ("kvp", _(u"Kompane")), - ("kvq", _(u"Geba Karen")), - ("kvr", _(u"Kerinci")), - ("kvs", _(u"Kunggara")), - ("kvt", _(u"Lahta Karen")), - ("kvu", _(u"Yinbaw Karen")), - ("kvv", _(u"Kola")), - ("kvw", _(u"Wersing")), - ("kvx", _(u"Parkari Koli")), - ("kvy", _(u"Yintale Karen")), - ("kvz", _(u"Tsakwambo")), - ("kwa", _(u"Dâw")), - ("kwb", _(u"Kwa")), - ("kwc", _(u"Likwala")), - ("kwd", _(u"Kwaio")), - ("kwe", _(u"Kwerba")), - ("kwf", _(u"Kwara'ae")), - ("kwg", _(u"Sara Kaba Deme")), - ("kwh", _(u"Kowiai")), - ("kwi", _(u"Awa-Cuaiquer")), - ("kwj", _(u"Kwanga")), - ("kwk", _(u"Kwakiutl")), - ("kwl", _(u"Kofyar")), - ("kwm", _(u"Kwambi")), - ("kwn", _(u"Kwangali")), - ("kwo", _(u"Kwomtari")), - ("kwp", _(u"Kodia")), - ("kwq", _(u"Kwak")), - ("kwr", _(u"Kwer")), - ("kws", _(u"Kwese")), - ("kwt", _(u"Kwesten")), - ("kwu", _(u"Kwakum")), - ("kwv", _(u"Sara Kaba Náà")), - ("kww", _(u"Kwinti")), - ("kwx", _(u"Khirwar")), - ("kwy", _(u"San Salvador Kongo")), - ("kwz", _(u"Kwadi")), - ("kxa", _(u"Kairiru")), - ("kxb", _(u"Krobu")), - ("kxc", _(u"Konso")), - ("kxd", _(u"Brunei")), - ("kxe", _(u"Kakihum")), - ("kxf", _(u"Manumanaw Karen")), - ("kxh", _(u"Karo")), - ("kxi", _(u"Keningau Murut")), - ("kxj", _(u"Kulfa")), - ("kxk", _(u"Zayein Karen")), - ("kxl", _(u"Nepali Kurux")), - ("kxm", _(u"Northern Khmer")), - ("kxn", _(u"Kanowit-Tanjong Melanau")), - ("kxo", _(u"Kanoé")), - ("kxp", _(u"Wadiyara Koli")), - ("kxq", _(u"Smärky Kanum")), - ("kxr", _(u"Koro")), - ("kxs", _(u"Kangjia")), - ("kxt", _(u"Koiwat")), - ("kxu", _(u"Kui")), - ("kxv", _(u"Kuvi")), - ("kxw", _(u"Konai")), - ("kxx", _(u"Likuba")), - ("kxy", _(u"Kayong")), - ("kxz", _(u"Kerewo")), - ("kya", _(u"Kwaya")), - ("kyb", _(u"Butbut Kalinga")), - ("kyc", _(u"Kyaka")), - ("kyd", _(u"Karey")), - ("kye", _(u"Krache")), - ("kyf", _(u"Kouya")), - ("kyg", _(u"Keyagana")), - ("kyh", _(u"Karok")), - ("kyi", _(u"Kiput")), - ("kyj", _(u"Karao")), - ("kyk", _(u"Kamayo")), - ("kyl", _(u"Kalapuya")), - ("kym", _(u"Kpatili")), - ("kyn", _(u"Northern Binukidnon")), - ("kyo", _(u"Kelon")), - ("kyp", _(u"Kang")), - ("kyq", _(u"Kenga")), - ("kyr", _(u"Kuruáya")), - ("kys", _(u"Baram Kayan")), - ("kyt", _(u"Kayagar")), - ("kyu", _(u"Western Kayah")), - ("kyv", _(u"Kayort")), - ("kyw", _(u"Kudmali")), - ("kyx", _(u"Rapoisi")), - ("kyy", _(u"Kambaira")), - ("kyz", _(u"Kayabí")), - ("kza", _(u"Western Karaboro")), - ("kzb", _(u"Kaibobo")), - ("kzc", _(u"Bondoukou Kulango")), - ("kzd", _(u"Kadai")), - ("kze", _(u"Kosena")), - ("kzf", _(u"Da'a Kaili")), - ("kzg", _(u"Kikai")), - ("kzh", _(u"Kenuzi-Dongola")), - ("kzi", _(u"Kelabit")), - ("kzj", _(u"Coastal Kadazan")), - ("kzk", _(u"Kazukuru")), - ("kzl", _(u"Kayeli")), - ("kzm", _(u"Kais")), - ("kzn", _(u"Kokola")), - ("kzo", _(u"Kaningi")), - ("kzp", _(u"Kaidipang")), - ("kzq", _(u"Kaike")), - ("kzr", _(u"Karang")), - ("kzs", _(u"Sugut Dusun")), - ("kzt", _(u"Tambunan Dusun")), - ("kzu", _(u"Kayupulau")), - ("kzv", _(u"Komyandaret")), - ("kzw", _(u"Karirí-Xocó")), - ("kzx", _(u"Kamarian")), - ("kzy", _(u"Kango")), - ("kzz", _(u"Kalabra")), - ("laa", _(u"Southern Subanen")), - ("lab", _(u"Linear A")), - ("lac", _(u"Lacandon")), - ("lad", _(u"Ladino")), - ("lae", _(u"Pattani")), - ("laf", _(u"Lafofa")), - ("lag", _(u"Langi")), - ("lah", _(u"Lahnda")), - ("lai", _(u"Lambya")), - ("laj", _(u"Lango")), - ("lak", _(u"Laka")), - ("lal", _(u"Lalia")), - ("lam", _(u"Lamba")), - ("lan", _(u"Laru")), - ("lap", _(u"Laka")), - ("laq", _(u"Qabiao")), - ("lar", _(u"Larteh")), - ("las", _(u"Lama")), - ("lau", _(u"Laba")), - ("law", _(u"Lauje")), - ("lax", _(u"Tiwa")), - ("lay", _(u"Lama Bai")), - ("laz", _(u"Aribwatsa")), - ("lba", _(u"Lui")), - ("lbb", _(u"Label")), - ("lbc", _(u"Lakkia")), - ("lbe", _(u"Lak")), - ("lbf", _(u"Tinani")), - ("lbg", _(u"Laopang")), - ("lbi", _(u"La'bi")), - ("lbj", _(u"Ladakhi")), - ("lbk", _(u"Central Bontok")), - ("lbl", _(u"Libon Bikol")), - ("lbm", _(u"Lodhi")), - ("lbn", _(u"Lamet")), - ("lbo", _(u"Laven")), - ("lbq", _(u"Wampar")), - ("lbr", _(u"Lohorung")), - ("lbs", _(u"Libyan Sign Language")), - ("lbt", _(u"Lachi")), - ("lbu", _(u"Labu")), - ("lbv", _(u"Lavatbura-Lamusong")), - ("lbw", _(u"Tolaki")), - ("lbx", _(u"Lawangan")), - ("lby", _(u"Lamu-Lamu")), - ("lbz", _(u"Lardil")), - ("lcc", _(u"Legenyem")), - ("lcd", _(u"Lola")), - ("lce", _(u"Loncong")), - ("lcf", _(u"Lubu")), - ("lch", _(u"Luchazi")), - ("lcl", _(u"Lisela")), - ("lcm", _(u"Tungag")), - ("lcp", _(u"Western Lawa")), - ("lcq", _(u"Luhu")), - ("lcs", _(u"Lisabata-Nuniali")), - ("lda", _(u"Kla-Dan")), - ("ldb", _(u"Dũya")), - ("ldd", _(u"Luri")), - ("ldg", _(u"Lenyima")), - ("ldh", _(u"Lamja-Dengsa-Tola")), - ("ldi", _(u"Laari")), - ("ldj", _(u"Lemoro")), - ("ldk", _(u"Leelau")), - ("ldl", _(u"Kaan")), - ("ldm", _(u"Landoma")), - ("ldn", _(u"Láadan")), - ("ldo", _(u"Loo")), - ("ldp", _(u"Tso")), - ("ldq", _(u"Lufu")), - ("lea", _(u"Lega-Shabunda")), - ("leb", _(u"Lala-Bisa")), - ("lec", _(u"Leco")), - ("led", _(u"Lendu")), - ("lee", _(u"Lyélé")), - ("lef", _(u"Lelemi")), - ("leg", _(u"Lengua")), - ("leh", _(u"Lenje")), - ("lei", _(u"Lemio")), - ("lej", _(u"Lengola")), - ("lek", _(u"Leipon")), - ("lel", _(u"Lele")), - ("lem", _(u"Nomaande")), - ("len", _(u"Lenca")), - ("leo", _(u"Leti")), - ("lep", _(u"Lepcha")), - ("leq", _(u"Lembena")), - ("ler", _(u"Lenkau")), - ("les", _(u"Lese")), - ("let", _(u"Lesing-Gelimi")), - ("leu", _(u"Kara")), - ("lev", _(u"Lamma")), - ("lew", _(u"Ledo Kaili")), - ("lex", _(u"Luang")), - ("ley", _(u"Lemolang")), - ("lez", _(u"Lezghian")), - ("lfa", _(u"Lefa")), - ("lfn", _(u"Lingua Franca Nova")), - ("lga", _(u"Lungga")), - ("lgb", _(u"Laghu")), - ("lgg", _(u"Lugbara")), - ("lgh", _(u"Laghuu")), - ("lgi", _(u"Lengilu")), - ("lgk", _(u"Lingarak")), - ("lgl", _(u"Wala")), - ("lgm", _(u"Lega-Mwenga")), - ("lgn", _(u"Opuuo")), - ("lgq", _(u"Logba")), - ("lgr", _(u"Lengo")), - ("lgt", _(u"Pahi")), - ("lgu", _(u"Longgu")), - ("lgz", _(u"Ligenza")), - ("lha", _(u"Laha")), - ("lhh", _(u"Laha")), - ("lhi", _(u"Lahu Shi")), - ("lhl", _(u"Lahul Lohar")), - ("lhm", _(u"Lhomi")), - ("lhn", _(u"Lahanan")), - ("lhp", _(u"Lhokpu")), - ("lhs", _(u"Mlahsö")), - ("lht", _(u"Lo-Toga")), - ("lhu", _(u"Lahu")), - ("lia", _(u"West-Central Limba")), - ("lib", _(u"Likum")), - ("lic", _(u"Hlai")), - ("lid", _(u"Nyindrou")), - ("lie", _(u"Likila")), - ("lif", _(u"Limbu")), - ("lig", _(u"Ligbi")), - ("lih", _(u"Lihir")), - ("lii", _(u"Lingkhim")), - ("lij", _(u"Ligurian")), - ("lik", _(u"Lika")), - ("lil", _(u"Lillooet")), - ("lio", _(u"Liki")), - ("lip", _(u"Sekpele")), - ("liq", _(u"Libido")), - ("lir", _(u"Liberian English")), - ("lis", _(u"Lisu")), - ("liu", _(u"Logorik")), - ("liv", _(u"Liv")), - ("liw", _(u"Col")), - ("lix", _(u"Liabuku")), - ("liy", _(u"Banda-Bambari")), - ("liz", _(u"Libinza")), - ("lja", _(u"Golpa")), - ("lje", _(u"Rampi")), - ("lji", _(u"Laiyolo")), - ("ljl", _(u"Li'o")), - ("ljp", _(u"Lampung Api")), - ("ljw", _(u"Yirandali")), - ("ljx", _(u"Yuru")), - ("lka", _(u"Lakalei")), - ("lkb", _(u"Kabras")), - ("lkc", _(u"Kucong")), - ("lkd", _(u"Lakondê")), - ("lke", _(u"Kenyi")), - ("lkh", _(u"Lakha")), - ("lki", _(u"Laki")), - ("lkj", _(u"Remun")), - ("lkl", _(u"Laeko-Libuat")), - ("lkm", _(u"Kalaamaya")), - ("lkn", _(u"Lakon")), - ("lko", _(u"Khayo")), - ("lkr", _(u"Päri")), - ("lks", _(u"Kisa")), - ("lkt", _(u"Lakota")), - ("lku", _(u"Kungkari")), - ("lky", _(u"Lokoya")), - ("lla", _(u"Lala-Roba")), - ("llb", _(u"Lolo")), - ("llc", _(u"Lele")), - ("lld", _(u"Ladin")), - ("lle", _(u"Lele")), - ("llf", _(u"Hermit")), - ("llg", _(u"Lole")), - ("llh", _(u"Lamu")), - ("lli", _(u"Teke-Laali")), - ("llj", _(u"Ladji Ladji")), - ("llk", _(u"Lelak")), - ("lll", _(u"Lilau")), - ("llm", _(u"Lasalimu")), - ("lln", _(u"Lele")), - ("llo", _(u"Khlor")), - ("llp", _(u"North Efate")), - ("llq", _(u"Lolak")), - ("lls", _(u"Lithuanian Sign Language")), - ("llu", _(u"Lau")), - ("llx", _(u"Lauan")), - ("lma", _(u"East Limba")), - ("lmb", _(u"Merei")), - ("lmc", _(u"Limilngan")), - ("lmd", _(u"Lumun")), - ("lme", _(u"Pévé")), - ("lmf", _(u"South Lembata")), - ("lmg", _(u"Lamogai")), - ("lmh", _(u"Lambichhong")), - ("lmi", _(u"Lombi")), - ("lmj", _(u"West Lembata")), - ("lmk", _(u"Lamkang")), - ("lml", _(u"Hano")), - ("lmm", _(u"Lamam")), - ("lmn", _(u"Lambadi")), - ("lmo", _(u"Lombard")), - ("lmp", _(u"Limbum")), - ("lmq", _(u"Lamatuka")), - ("lmr", _(u"Lamalera")), - ("lmu", _(u"Lamenu")), - ("lmv", _(u"Lomaiviti")), - ("lmw", _(u"Lake Miwok")), - ("lmx", _(u"Laimbue")), - ("lmy", _(u"Lamboya")), - ("lmz", _(u"Lumbee")), - ("lna", _(u"Langbashe")), - ("lnb", _(u"Mbalanhu")), - ("lnd", _(u"Lundayeh")), - ("lng", _(u"Langobardic")), - ("lnh", _(u"Lanoh")), - ("lni", _(u"Daantanai'")), - ("lnj", _(u"Leningitij")), - ("lnl", _(u"South Central Banda")), - ("lnm", _(u"Langam")), - ("lnn", _(u"Lorediakarkar")), - ("lno", _(u"Lango")), - ("lns", _(u"Lamnso'")), - ("lnu", _(u"Longuda")), - ("lnw", _(u"Lanima")), - ("lnz", _(u"Lonzo")), - ("loa", _(u"Loloda")), - ("lob", _(u"Lobi")), - ("loc", _(u"Inonhan")), - ("loe", _(u"Saluan")), - ("lof", _(u"Logol")), - ("log", _(u"Logo")), - ("loh", _(u"Narim")), - ("loi", _(u"Loma")), - ("loj", _(u"Lou")), - ("lok", _(u"Loko")), - ("lol", _(u"Mongo")), - ("lom", _(u"Loma")), - ("lon", _(u"Malawi Lomwe")), - ("loo", _(u"Lombo")), - ("lop", _(u"Lopa")), - ("loq", _(u"Lobala")), - ("lor", _(u"Téén")), - ("los", _(u"Loniu")), - ("lot", _(u"Otuho")), - ("lou", _(u"Louisiana Creole")), - ("lov", _(u"Lopi")), - ("low", _(u"Tampias Lobu")), - ("lox", _(u"Loun")), - ("loy", _(u"Loke")), - ("loz", _(u"Lozi")), - ("lpa", _(u"Lelepa")), - ("lpe", _(u"Lepki")), - ("lpn", _(u"Long Phuri Naga")), - ("lpo", _(u"Lipo")), - ("lpx", _(u"Lopit")), - ("lra", _(u"Rara Bakati'")), - ("lrc", _(u"Northern Luri")), - ("lre", _(u"Laurentian")), - ("lrg", _(u"Laragia")), - ("lri", _(u"Marachi")), - ("lrk", _(u"Loarki")), - ("lrl", _(u"Lari")), - ("lrm", _(u"Marama")), - ("lrn", _(u"Lorang")), - ("lro", _(u"Laro")), - ("lrr", _(u"Southern Yamphu")), - ("lrt", _(u"Larantuka Malay")), - ("lrv", _(u"Larevat")), - ("lrz", _(u"Lemerig")), - ("lsa", _(u"Lasgerdi")), - ("lsd", _(u"Lishana Deni")), - ("lse", _(u"Lusengo")), - ("lsg", _(u"Lyons Sign Language")), - ("lsh", _(u"Lish")), - ("lsi", _(u"Lashi")), - ("lsl", _(u"Latvian Sign Language")), - ("lsm", _(u"Saamia")), - ("lso", _(u"Laos Sign Language")), - ("lsp", _(u"Panamanian Sign Language")), - ("lsr", _(u"Aruop")), - ("lss", _(u"Lasi")), - ("lst", _(u"Trinidad and Tobago Sign Language")), - ("lsy", _(u"Mauritian Sign Language")), - ("ltc", _(u"Late Middle Chinese")), - ("ltg", _(u"Latgalian")), - ("lti", _(u"Leti")), - ("ltn", _(u"Latundê")), - ("lto", _(u"Tsotso")), - ("lts", _(u"Tachoni")), - ("ltu", _(u"Latu")), - ("lua", _(u"Luba-Lulua")), - ("luc", _(u"Aringa")), - ("lud", _(u"Ludian")), - ("lue", _(u"Luvale")), - ("luf", _(u"Laua")), - ("lui", _(u"Luiseno")), - ("luj", _(u"Luna")), - ("luk", _(u"Lunanakha")), - ("lul", _(u"Olu'bo")), - ("lum", _(u"Luimbi")), - ("lun", _(u"Lunda")), - ("luo", _(u"Luo")), - ("lup", _(u"Lumbu")), - ("luq", _(u"Lucumi")), - ("lur", _(u"Laura")), - ("lus", _(u"Lushai")), - ("lut", _(u"Lushootseed")), - ("luu", _(u"Lumba-Yakkha")), - ("luv", _(u"Luwati")), - ("luw", _(u"Luo")), - ("luy", _(u"Luyia")), - ("luz", _(u"Southern Luri")), - ("lva", _(u"Maku'a")), - ("lvk", _(u"Lavukaleve")), - ("lvs", _(u"Standard Latvian")), - ("lvu", _(u"Levuka")), - ("lwa", _(u"Lwalu")), - ("lwe", _(u"Lewo Eleng")), - ("lwg", _(u"Wanga")), - ("lwh", _(u"White Lachi")), - ("lwl", _(u"Eastern Lawa")), - ("lwm", _(u"Laomian")), - ("lwo", _(u"Luwo")), - ("lwt", _(u"Lewotobi")), - ("lwu", _(u"Lawu")), - ("lww", _(u"Lewo")), - ("lya", _(u"Layakha")), - ("lyg", _(u"Lyngngam")), - ("lyn", _(u"Luyana")), - ("lzh", _(u"Literary Chinese")), - ("lzl", _(u"Litzlitz")), - ("lzn", _(u"Leinong Naga")), - ("lzz", _(u"Laz")), - ("maa", _(u"San Jerónimo Tecóatl Mazatec")), - ("mab", _(u"Yutanduchi Mixtec")), - ("mad", _(u"Madurese")), - ("mae", _(u"Bo-Rukul")), - ("maf", _(u"Mafa")), - ("mag", _(u"Magahi")), - ("mai", _(u"Maithili")), - ("maj", _(u"Jalapa De Díaz Mazatec")), - ("mak", _(u"Makasar")), - ("mam", _(u"Mam")), - ("man", _(u"Mandingo")), - ("map", _(u"Austronesian languages")), - ("maq", _(u"Chiquihuitlán Mazatec")), - ("mas", _(u"Masai")), - ("mat", _(u"San Francisco Matlatzinca")), - ("mau", _(u"Huautla Mazatec")), - ("mav", _(u"Sateré-Mawé")), - ("maw", _(u"Mampruli")), - ("max", _(u"North Moluccan Malay")), - ("maz", _(u"Central Mazahua")), - ("mba", _(u"Higaonon")), - ("mbb", _(u"Western Bukidnon Manobo")), - ("mbc", _(u"Macushi")), - ("mbd", _(u"Dibabawon Manobo")), - ("mbe", _(u"Molale")), - ("mbf", _(u"Baba Malay")), - ("mbh", _(u"Mangseng")), - ("mbi", _(u"Ilianen Manobo")), - ("mbj", _(u"Nadëb")), - ("mbk", _(u"Malol")), - ("mbl", _(u"Maxakalí")), - ("mbm", _(u"Ombamba")), - ("mbn", _(u"Macaguán")), - ("mbo", _(u"Mbo")), - ("mbp", _(u"Malayo")), - ("mbq", _(u"Maisin")), - ("mbr", _(u"Nukak Makú")), - ("mbs", _(u"Sarangani Manobo")), - ("mbt", _(u"Matigsalug Manobo")), - ("mbu", _(u"Mbula-Bwazza")), - ("mbv", _(u"Mbulungish")), - ("mbw", _(u"Maring")), - ("mbx", _(u"Mari")), - ("mby", _(u"Memoni")), - ("mbz", _(u"Amoltepec Mixtec")), - ("mca", _(u"Maca")), - ("mcb", _(u"Machiguenga")), - ("mcc", _(u"Bitur")), - ("mcd", _(u"Sharanahua")), - ("mce", _(u"Itundujia Mixtec")), - ("mcf", _(u"Matsés")), - ("mcg", _(u"Mapoyo")), - ("mch", _(u"Maquiritari")), - ("mci", _(u"Mese")), - ("mcj", _(u"Mvanip")), - ("mck", _(u"Mbunda")), - ("mcl", _(u"Macaguaje")), - ("mcm", _(u"Malaccan Creole Portuguese")), - ("mcn", _(u"Masana")), - ("mco", _(u"Coatlán Mixe")), - ("mcp", _(u"Makaa")), - ("mcq", _(u"Ese")), - ("mcr", _(u"Menya")), - ("mcs", _(u"Mambai")), - ("mct", _(u"Mengisa")), - ("mcu", _(u"Cameroon Mambila")), - ("mcv", _(u"Minanibai")), - ("mcw", _(u"Mawa")), - ("mcx", _(u"Mpiemo")), - ("mcy", _(u"South Watut")), - ("mcz", _(u"Mawan")), - ("mda", _(u"Mada")), - ("mdb", _(u"Morigi")), - ("mdc", _(u"Male")), - ("mdd", _(u"Mbum")), - ("mde", _(u"Maba")), - ("mdf", _(u"Moksha")), - ("mdg", _(u"Massalat")), - ("mdh", _(u"Maguindanaon")), - ("mdi", _(u"Mamvu")), - ("mdj", _(u"Mangbetu")), - ("mdk", _(u"Mangbutu")), - ("mdl", _(u"Maltese Sign Language")), - ("mdm", _(u"Mayogo")), - ("mdn", _(u"Mbati")), - ("mdp", _(u"Mbala")), - ("mdq", _(u"Mbole")), - ("mdr", _(u"Mandar")), - ("mds", _(u"Maria")), - ("mdt", _(u"Mbere")), - ("mdu", _(u"Mboko")), - ("mdv", _(u"Santa Lucía Monteverde Mixtec")), - ("mdw", _(u"Mbosi")), - ("mdx", _(u"Dizin")), - ("mdy", _(u"Male")), - ("mdz", _(u"Suruí Do Pará")), - ("mea", _(u"Menka")), - ("meb", _(u"Ikobi")), - ("mec", _(u"Mara")), - ("med", _(u"Melpa")), - ("mee", _(u"Mengen")), - ("mef", _(u"Megam")), - ("meg", _(u"Mea")), - ("meh", _(u"Southwestern Tlaxiaco Mixtec")), - ("mei", _(u"Midob")), - ("mej", _(u"Meyah")), - ("mek", _(u"Mekeo")), - ("mel", _(u"Central Melanau")), - ("mem", _(u"Mangala")), - ("men", _(u"Mende")), - ("meo", _(u"Kedah Malay")), - ("mep", _(u"Miriwung")), - ("meq", _(u"Merey")), - ("mer", _(u"Meru")), - ("mes", _(u"Masmaje")), - ("met", _(u"Mato")), - ("meu", _(u"Motu")), - ("mev", _(u"Mano")), - ("mew", _(u"Maaka")), - ("mey", _(u"Hassaniyya")), - ("mez", _(u"Menominee")), - ("mfa", _(u"Pattani Malay")), - ("mfb", _(u"Bangka")), - ("mfc", _(u"Mba")), - ("mfd", _(u"Mendankwe-Nkwen")), - ("mfe", _(u"Morisyen")), - ("mff", _(u"Naki")), - ("mfg", _(u"Mogofin")), - ("mfh", _(u"Matal")), - ("mfi", _(u"Wandala")), - ("mfj", _(u"Mefele")), - ("mfk", _(u"North Mofu")), - ("mfl", _(u"Putai")), - ("mfm", _(u"Marghi South")), - ("mfn", _(u"Cross River Mbembe")), - ("mfo", _(u"Mbe")), - ("mfp", _(u"Makassar Malay")), - ("mfq", _(u"Moba")), - ("mfr", _(u"Marithiel")), - ("mfs", _(u"Mexican Sign Language")), - ("mft", _(u"Mokerang")), - ("mfu", _(u"Mbwela")), - ("mfv", _(u"Mandjak")), - ("mfw", _(u"Mulaha")), - ("mfx", _(u"Melo")), - ("mfy", _(u"Mayo")), - ("mfz", _(u"Mabaan")), - ("mga", _(u"Middle Irish")), - ("mgb", _(u"Mararit")), - ("mgc", _(u"Morokodo")), - ("mgd", _(u"Moru")), - ("mge", _(u"Mango")), - ("mgf", _(u"Maklew")), - ("mgg", _(u"Mpumpong")), - ("mgh", _(u"Makhuwa-Meetto")), - ("mgi", _(u"Lijili")), - ("mgj", _(u"Abureni")), - ("mgk", _(u"Mawes")), - ("mgl", _(u"Maleu-Kilenge")), - ("mgm", _(u"Mambae")), - ("mgn", _(u"Mbangi")), - ("mgo", _(u"Meta'")), - ("mgp", _(u"Eastern Magar")), - ("mgq", _(u"Malila")), - ("mgr", _(u"Mambwe-Lungu")), - ("mgs", _(u"Manda")), - ("mgt", _(u"Mongol")), - ("mgu", _(u"Mailu")), - ("mgv", _(u"Matengo")), - ("mgw", _(u"Matumbi")), - ("mgx", _(u"Omati")), - ("mgy", _(u"Mbunga")), - ("mgz", _(u"Mbugwe")), - ("mha", _(u"Manda")), - ("mhb", _(u"Mahongwe")), - ("mhc", _(u"Mocho")), - ("mhd", _(u"Mbugu")), - ("mhe", _(u"Besisi")), - ("mhf", _(u"Mamaa")), - ("mhg", _(u"Margu")), - ("mhh", _(u"Maskoy Pidgin")), - ("mhi", _(u"Ma'di")), - ("mhj", _(u"Mogholi")), - ("mhk", _(u"Mungaka")), - ("mhl", _(u"Mauwake")), - ("mhm", _(u"Makhuwa-Moniga")), - ("mhn", _(u"Mócheno")), - ("mho", _(u"Mashi")), - ("mhp", _(u"Balinese Malay")), - ("mhq", _(u"Mandan")), - ("mhr", _(u"Eastern Mari")), - ("mhs", _(u"Buru")), - ("mht", _(u"Mandahuaca")), - ("mhu", _(u"Digaro-Mishmi")), - ("mhw", _(u"Mbukushu")), - ("mhx", _(u"Maru")), - ("mhy", _(u"Ma'anyan")), - ("mhz", _(u"Mor")), - ("mia", _(u"Miami")), - ("mib", _(u"Atatláhuca Mixtec")), - ("mic", _(u"Mi'kmaq")), - ("mid", _(u"Mandaic")), - ("mie", _(u"Ocotepec Mixtec")), - ("mif", _(u"Mofu-Gudur")), - ("mig", _(u"San Miguel El Grande Mixtec")), - ("mih", _(u"Chayuco Mixtec")), - ("mii", _(u"Chigmecatitlán Mixtec")), - ("mij", _(u"Abar")), - ("mik", _(u"Mikasuki")), - ("mil", _(u"Peñoles Mixtec")), - ("mim", _(u"Alacatlatzala Mixtec")), - ("min", _(u"Minangkabau")), - ("mio", _(u"Pinotepa Nacional Mixtec")), - ("mip", _(u"Apasco-Apoala Mixtec")), - ("miq", _(u"Mískito")), - ("mir", _(u"Isthmus Mixe")), - ("mis", _(u"Uncoded languages")), - ("mit", _(u"Southern Puebla Mixtec")), - ("miu", _(u"Cacaloxtepec Mixtec")), - ("miw", _(u"Akoye")), - ("mix", _(u"Mixtepec Mixtec")), - ("miy", _(u"Ayutla Mixtec")), - ("miz", _(u"Coatzospan Mixtec")), - ("mja", _(u"Mahei")), - ("mjb", _(u"Makalero")), - ("mjc", _(u"San Juan Colorado Mixtec")), - ("mjd", _(u"Northwest Maidu")), - ("mje", _(u"Muskum")), - ("mjg", _(u"Tu")), - ("mjh", _(u"Mwera")), - ("mji", _(u"Kim Mun")), - ("mjj", _(u"Mawak")), - ("mjk", _(u"Matukar")), - ("mjl", _(u"Mandeali")), - ("mjm", _(u"Medebur")), - ("mjn", _(u"Ma")), - ("mjo", _(u"Malankuravan")), - ("mjp", _(u"Malapandaram")), - ("mjq", _(u"Malaryan")), - ("mjr", _(u"Malavedan")), - ("mjs", _(u"Miship")), - ("mjt", _(u"Sauria Paharia")), - ("mju", _(u"Manna-Dora")), - ("mjv", _(u"Mannan")), - ("mjw", _(u"Karbi")), - ("mjx", _(u"Mahali")), - ("mjy", _(u"Mahican")), - ("mjz", _(u"Majhi")), - ("mka", _(u"Mbre")), - ("mkb", _(u"Mal Paharia")), - ("mkc", _(u"Siliput")), - ("mke", _(u"Mawchi")), - ("mkf", _(u"Miya")), - ("mkg", _(u"Mak")), - ("mkh", _(u"Mon-Khmer languages")), - ("mki", _(u"Dhatki")), - ("mkj", _(u"Mokilese")), - ("mkk", _(u"Byep")), - ("mkl", _(u"Mokole")), - ("mkm", _(u"Moklen")), - ("mkn", _(u"Kupang Malay")), - ("mko", _(u"Mingang Doso")), - ("mkp", _(u"Moikodi")), - ("mkq", _(u"Bay Miwok")), - ("mkr", _(u"Malas")), - ("mks", _(u"Silacayoapan Mixtec")), - ("mkt", _(u"Vamale")), - ("mku", _(u"Konyanka Maninka")), - ("mkv", _(u"Mafea")), - ("mkw", _(u"Kituba")), - ("mkx", _(u"Kinamiging Manobo")), - ("mky", _(u"East Makian")), - ("mkz", _(u"Makasae")), - ("mla", _(u"Malo")), - ("mlb", _(u"Mbule")), - ("mlc", _(u"Cao Lan")), - ("mld", _(u"Malakhel")), - ("mle", _(u"Manambu")), - ("mlf", _(u"Mal")), - ("mlh", _(u"Mape")), - ("mli", _(u"Malimpung")), - ("mlj", _(u"Miltu")), - ("mlk", _(u"Ilwana")), - ("mll", _(u"Malua Bay")), - ("mlm", _(u"Mulam")), - ("mln", _(u"Malango")), - ("mlo", _(u"Mlomp")), - ("mlp", _(u"Bargam")), - ("mlq", _(u"Western Maninkakan")), - ("mlr", _(u"Vame")), - ("mls", _(u"Masalit")), - ("mlu", _(u"To'abaita")), - ("mlv", _(u"Motlav")), - ("mlw", _(u"Moloko")), - ("mlx", _(u"Malfaxal")), - ("mlz", _(u"Malaynon")), - ("mma", _(u"Mama")), - ("mmb", _(u"Momina")), - ("mmc", _(u"Michoacán Mazahua")), - ("mmd", _(u"Maonan")), - ("mme", _(u"Mae")), - ("mmf", _(u"Mundat")), - ("mmg", _(u"North Ambrym")), - ("mmh", _(u"Mehináku")), - ("mmi", _(u"Musar")), - ("mmj", _(u"Majhwar")), - ("mmk", _(u"Mukha-Dora")), - ("mml", _(u"Man Met")), - ("mmm", _(u"Maii")), - ("mmn", _(u"Mamanwa")), - ("mmo", _(u"Mangga Buang")), - ("mmp", _(u"Siawi")), - ("mmq", _(u"Musak")), - ("mmr", _(u"Western Xiangxi Miao")), - ("mmt", _(u"Malalamai")), - ("mmu", _(u"Mmaala")), - ("mmv", _(u"Miriti")), - ("mmw", _(u"Emae")), - ("mmx", _(u"Madak")), - ("mmy", _(u"Migaama")), - ("mmz", _(u"Mabaale")), - ("mna", _(u"Mbula")), - ("mnb", _(u"Muna")), - ("mnc", _(u"Manchu")), - ("mnd", _(u"Mondé")), - ("mne", _(u"Naba")), - ("mnf", _(u"Mundani")), - ("mng", _(u"Eastern Mnong")), - ("mnh", _(u"Mono")), - ("mni", _(u"Manipuri")), - ("mnj", _(u"Munji")), - ("mnk", _(u"Mandinka")), - ("mnl", _(u"Tiale")), - ("mnm", _(u"Mapena")), - ("mnn", _(u"Southern Mnong")), - ("mno", _(u"Manobo languages")), - ("mnp", _(u"Min Bei Chinese")), - ("mnq", _(u"Minriq")), - ("mnr", _(u"Mono")), - ("mns", _(u"Mansi")), - ("mnt", _(u"Maykulan")), - ("mnu", _(u"Mer")), - ("mnv", _(u"Rennell-Bellona")), - ("mnw", _(u"Mon")), - ("mnx", _(u"Manikion")), - ("mny", _(u"Manyawa")), - ("mnz", _(u"Moni")), - ("moa", _(u"Mwan")), - ("moc", _(u"Mocoví")), - ("mod", _(u"Mobilian")), - ("moe", _(u"Montagnais")), - ("mof", _(u"Mohegan-Montauk-Narragansett")), - ("mog", _(u"Mongondow")), - ("moh", _(u"Mohawk")), - ("moi", _(u"Mboi")), - ("moj", _(u"Monzombo")), - ("mok", _(u"Morori")), - ("mom", _(u"Mangue")), - ("moo", _(u"Monom")), - ("mop", _(u"Mopán Maya")), - ("moq", _(u"Mor")), - ("mor", _(u"Moro")), - ("mos", _(u"Mossi")), - ("mot", _(u"Barí")), - ("mou", _(u"Mogum")), - ("mov", _(u"Mohave")), - ("mow", _(u"Moi")), - ("mox", _(u"Molima")), - ("moy", _(u"Shekkacho")), - ("moz", _(u"Mukulu")), - ("mpa", _(u"Mpoto")), - ("mpb", _(u"Mullukmulluk")), - ("mpc", _(u"Mangarayi")), - ("mpd", _(u"Machinere")), - ("mpe", _(u"Majang")), - ("mpg", _(u"Marba")), - ("mph", _(u"Maung")), - ("mpi", _(u"Mpade")), - ("mpj", _(u"Martu Wangka")), - ("mpk", _(u"Mbara")), - ("mpl", _(u"Middle Watut")), - ("mpm", _(u"Yosondúa Mixtec")), - ("mpn", _(u"Mindiri")), - ("mpo", _(u"Miu")), - ("mpp", _(u"Migabac")), - ("mpq", _(u"Matís")), - ("mpr", _(u"Vangunu")), - ("mps", _(u"Dadibi")), - ("mpt", _(u"Mian")), - ("mpu", _(u"Makuráp")), - ("mpv", _(u"Mungkip")), - ("mpw", _(u"Mapidian")), - ("mpx", _(u"Misima-Panaeati")), - ("mpy", _(u"Mapia")), - ("mpz", _(u"Mpi")), - ("mqa", _(u"Maba")), - ("mqb", _(u"Mbuko")), - ("mqc", _(u"Mangole")), - ("mqe", _(u"Matepi")), - ("mqf", _(u"Momuna")), - ("mqg", _(u"Kota Bangun Kutai Malay")), - ("mqh", _(u"Tlazoyaltepec Mixtec")), - ("mqi", _(u"Mariri")), - ("mqj", _(u"Mamasa")), - ("mqk", _(u"Rajah Kabunsuwan Manobo")), - ("mql", _(u"Mbelime")), - ("mqm", _(u"South Marquesan")), - ("mqn", _(u"Moronene")), - ("mqo", _(u"Modole")), - ("mqp", _(u"Manipa")), - ("mqq", _(u"Minokok")), - ("mqr", _(u"Mander")), - ("mqs", _(u"West Makian")), - ("mqt", _(u"Mok")), - ("mqu", _(u"Mandari")), - ("mqv", _(u"Mosimo")), - ("mqw", _(u"Murupi")), - ("mqx", _(u"Mamuju")), - ("mqy", _(u"Manggarai")), - ("mqz", _(u"Pano")), - ("mra", _(u"Mlabri")), - ("mrb", _(u"Marino")), - ("mrc", _(u"Maricopa")), - ("mrd", _(u"Western Magar")), - ("mre", _(u"Martha's Vineyard Sign Language")), - ("mrf", _(u"Elseng")), - ("mrg", _(u"Mising")), - ("mrh", _(u"Mara Chin")), - ("mrj", _(u"Western Mari")), - ("mrk", _(u"Hmwaveke")), - ("mrl", _(u"Mortlockese")), - ("mrm", _(u"Merlav")), - ("mrn", _(u"Cheke Holo")), - ("mro", _(u"Mru")), - ("mrp", _(u"Morouas")), - ("mrq", _(u"North Marquesan")), - ("mrr", _(u"Maria")), - ("mrs", _(u"Maragus")), - ("mrt", _(u"Marghi Central")), - ("mru", _(u"Mono")), - ("mrv", _(u"Mangareva")), - ("mrw", _(u"Maranao")), - ("mrx", _(u"Maremgi")), - ("mry", _(u"Mandaya")), - ("mrz", _(u"Marind")), - ("msb", _(u"Masbatenyo")), - ("msc", _(u"Sankaran Maninka")), - ("msd", _(u"Yucatec Maya Sign Language")), - ("mse", _(u"Musey")), - ("msf", _(u"Mekwei")), - ("msg", _(u"Moraid")), - ("msh", _(u"Masikoro Malagasy")), - ("msi", _(u"Sabah Malay")), - ("msj", _(u"Ma")), - ("msk", _(u"Mansaka")), - ("msl", _(u"Molof")), - ("msm", _(u"Agusan Manobo")), - ("msn", _(u"Vurës")), - ("mso", _(u"Mombum")), - ("msp", _(u"Maritsauá")), - ("msq", _(u"Caac")), - ("msr", _(u"Mongolian Sign Language")), - ("mss", _(u"West Masela")), - ("mst", _(u"Cataelano Mandaya")), - ("msu", _(u"Musom")), - ("msv", _(u"Maslam")), - ("msw", _(u"Mansoanka")), - ("msx", _(u"Moresada")), - ("msy", _(u"Aruamu")), - ("msz", _(u"Momare")), - ("mta", _(u"Cotabato Manobo")), - ("mtb", _(u"Anyin Morofo")), - ("mtc", _(u"Munit")), - ("mtd", _(u"Mualang")), - ("mte", _(u"Mono")), - ("mtf", _(u"Murik")), - ("mtg", _(u"Una")), - ("mth", _(u"Munggui")), - ("mti", _(u"Maiwa")), - ("mtj", _(u"Moskona")), - ("mtk", _(u"Mbe'")), - ("mtl", _(u"Montol")), - ("mtm", _(u"Mator")), - ("mtn", _(u"Matagalpa")), - ("mto", _(u"Totontepec Mixe")), - ("mtp", _(u"Wichí Lhamtés Nocten")), - ("mtq", _(u"Muong")), - ("mtr", _(u"Mewari")), - ("mts", _(u"Yora")), - ("mtt", _(u"Mota")), - ("mtu", _(u"Tututepec Mixtec")), - ("mtv", _(u"Asaro'o")), - ("mtw", _(u"Southern Binukidnon")), - ("mtx", _(u"Tidaá Mixtec")), - ("mty", _(u"Nabi")), - ("mua", _(u"Mundang")), - ("mub", _(u"Mubi")), - ("muc", _(u"Ajumbu")), - ("mud", _(u"Mednyj Aleut")), - ("mue", _(u"Media Lengua")), - ("mug", _(u"Musgu")), - ("muh", _(u"Mündü")), - ("mui", _(u"Musi")), - ("muj", _(u"Mabire")), - ("muk", _(u"Mugom")), - ("mul", _(u"Multiple languages")), - ("mum", _(u"Maiwala")), - ("mun", _(u"Munda languages")), - ("muo", _(u"Nyong")), - ("mup", _(u"Malvi")), - ("muq", _(u"Eastern Xiangxi Miao")), - ("mur", _(u"Murle")), - ("mus", _(u"Creek")), - ("mut", _(u"Western Muria")), - ("muu", _(u"Yaaku")), - ("muv", _(u"Muthuvan")), - ("mux", _(u"Bo-Ung")), - ("muy", _(u"Muyang")), - ("muz", _(u"Mursi")), - ("mva", _(u"Manam")), - ("mvb", _(u"Mattole")), - ("mvd", _(u"Mamboru")), - ("mve", _(u"Marwari")), - ("mvf", _(u"Peripheral Mongolian")), - ("mvg", _(u"Yucuañe Mixtec")), - ("mvh", _(u"Mulgi")), - ("mvi", _(u"Miyako")), - ("mvk", _(u"Mekmek")), - ("mvl", _(u"Mbara")), - ("mvm", _(u"Muya")), - ("mvn", _(u"Minaveha")), - ("mvo", _(u"Marovo")), - ("mvp", _(u"Duri")), - ("mvq", _(u"Moere")), - ("mvr", _(u"Marau")), - ("mvs", _(u"Massep")), - ("mvt", _(u"Mpotovoro")), - ("mvu", _(u"Marfa")), - ("mvv", _(u"Tagal Murut")), - ("mvw", _(u"Machinga")), - ("mvx", _(u"Meoswar")), - ("mvy", _(u"Indus Kohistani")), - ("mvz", _(u"Mesqan")), - ("mwa", _(u"Mwatebu")), - ("mwb", _(u"Juwal")), - ("mwc", _(u"Are")), - ("mwd", _(u"Mudbura")), - ("mwe", _(u"Mwera")), - ("mwf", _(u"Murrinh-Patha")), - ("mwg", _(u"Aiklep")), - ("mwh", _(u"Mouk-Aria")), - ("mwi", _(u"Labo")), - ("mwj", _(u"Maligo")), - ("mwk", _(u"Kita Maninkakan")), - ("mwl", _(u"Mirandese")), - ("mwm", _(u"Sar")), - ("mwn", _(u"Nyamwanga")), - ("mwo", _(u"Central Maewo")), - ("mwp", _(u"Kala Lagaw Ya")), - ("mwq", _(u"Mün Chin")), - ("mwr", _(u"Marwari")), - ("mws", _(u"Mwimbi-Muthambi")), - ("mwt", _(u"Moken")), - ("mwu", _(u"Mittu")), - ("mwv", _(u"Mentawai")), - ("mww", _(u"Hmong Daw")), - ("mwx", _(u"Mediak")), - ("mwy", _(u"Mosiro")), - ("mwz", _(u"Moingi")), - ("mxa", _(u"Northwest Oaxaca Mixtec")), - ("mxb", _(u"Tezoatlán Mixtec")), - ("mxc", _(u"Manyika")), - ("mxd", _(u"Modang")), - ("mxe", _(u"Mele-Fila")), - ("mxf", _(u"Malgbe")), - ("mxg", _(u"Mbangala")), - ("mxh", _(u"Mvuba")), - ("mxi", _(u"Mozarabic")), - ("mxj", _(u"Miju-Mishmi")), - ("mxk", _(u"Monumbo")), - ("mxl", _(u"Maxi Gbe")), - ("mxm", _(u"Meramera")), - ("mxn", _(u"Moi")), - ("mxo", _(u"Mbowe")), - ("mxp", _(u"Tlahuitoltepec Mixe")), - ("mxq", _(u"Juquila Mixe")), - ("mxr", _(u"Murik")), - ("mxs", _(u"Huitepec Mixtec")), - ("mxt", _(u"Jamiltepec Mixtec")), - ("mxu", _(u"Mada")), - ("mxv", _(u"Metlatónoc Mixtec")), - ("mxw", _(u"Namo")), - ("mxx", _(u"Mahou")), - ("mxy", _(u"Southeastern Nochixtlán Mixtec")), - ("mxz", _(u"Central Masela")), - ("myb", _(u"Mbay")), - ("myc", _(u"Mayeka")), - ("myd", _(u"Maramba")), - ("mye", _(u"Myene")), - ("myf", _(u"Bambassi")), - ("myg", _(u"Manta")), - ("myh", _(u"Makah")), - ("myi", _(u"Mina")), - ("myj", _(u"Mangayat")), - ("myk", _(u"Mamara Senoufo")), - ("myl", _(u"Moma")), - ("mym", _(u"Me'en")), - ("myn", _(u"Mayan languages")), - ("myo", _(u"Anfillo")), - ("myp", _(u"Pirahã")), - ("myq", _(u"Forest Maninka")), - ("myr", _(u"Muniche")), - ("mys", _(u"Mesmes")), - ("myt", _(u"Sangab Mandaya")), - ("myu", _(u"Mundurukú")), - ("myv", _(u"Erzya")), - ("myw", _(u"Muyuw")), - ("myx", _(u"Masaaba")), - ("myy", _(u"Macuna")), - ("myz", _(u"Classical Mandaic")), - ("mza", _(u"Santa María Zacatepec Mixtec")), - ("mzb", _(u"Tumzabt")), - ("mzc", _(u"Madagascar Sign Language")), - ("mzd", _(u"Malimba")), - ("mze", _(u"Morawa")), - ("mzg", _(u"Monastic Sign Language")), - ("mzh", _(u"Wichí Lhamtés Güisnay")), - ("mzi", _(u"Ixcatlán Mazatec")), - ("mzj", _(u"Manya")), - ("mzk", _(u"Nigeria Mambila")), - ("mzl", _(u"Mazatlán Mixe")), - ("mzm", _(u"Mumuye")), - ("mzn", _(u"Mazanderani")), - ("mzo", _(u"Matipuhy")), - ("mzp", _(u"Movima")), - ("mzq", _(u"Mori Atas")), - ("mzr", _(u"Marúbo")), - ("mzs", _(u"Macanese")), - ("mzt", _(u"Mintil")), - ("mzu", _(u"Inapang")), - ("mzv", _(u"Manza")), - ("mzw", _(u"Deg")), - ("mzx", _(u"Mawayana")), - ("mzy", _(u"Mozambican Sign Language")), - ("mzz", _(u"Maiadomu")), - ("naa", _(u"Namla")), - ("nab", _(u"Southern Nambikuára")), - ("nac", _(u"Narak")), - ("nad", _(u"Nijadali")), - ("nae", _(u"Naka'ela")), - ("naf", _(u"Nabak")), - ("nag", _(u"Naga Pidgin")), - ("nah", _(u"Nahuatl languages")), - ("nai", _(u"North American Indian languages")), - ("naj", _(u"Nalu")), - ("nak", _(u"Nakanai")), - ("nal", _(u"Nalik")), - ("nam", _(u"Ngan'gityemerri")), - ("nan", _(u"Min Nan Chinese")), - ("nao", _(u"Naaba")), - ("nap", _(u"Neapolitan")), - ("naq", _(u"Khoekhoe")), - ("nar", _(u"Iguta")), - ("nas", _(u"Naasioi")), - ("nat", _(u"Ca̱hungwa̱rya̱")), - ("naw", _(u"Nawuri")), - ("nax", _(u"Nakwi")), - ("nay", _(u"Narrinyeri")), - ("naz", _(u"Coatepec Nahuatl")), - ("nba", _(u"Nyemba")), - ("nbb", _(u"Ndoe")), - ("nbc", _(u"Chang Naga")), - ("nbd", _(u"Ngbinda")), - ("nbe", _(u"Konyak Naga")), - ("nbf", _(u"Naxi")), - ("nbg", _(u"Nagarchal")), - ("nbh", _(u"Ngamo")), - ("nbi", _(u"Mao Naga")), - ("nbj", _(u"Ngarinman")), - ("nbk", _(u"Nake")), - ("nbm", _(u"Ngbaka Ma'bo")), - ("nbn", _(u"Kuri")), - ("nbo", _(u"Nkukoli")), - ("nbp", _(u"Nnam")), - ("nbq", _(u"Nggem")), - ("nbr", _(u"Numana-Nunku-Gbantu-Numbu")), - ("nbs", _(u"Namibian Sign Language")), - ("nbt", _(u"Na")), - ("nbu", _(u"Rongmei Naga")), - ("nbv", _(u"Ngamambo")), - ("nbw", _(u"Southern Ngbandi")), - ("nbx", _(u"Ngura")), - ("nby", _(u"Ningera")), - ("nca", _(u"Iyo")), - ("ncb", _(u"Central Nicobarese")), - ("ncc", _(u"Ponam")), - ("ncd", _(u"Nachering")), - ("nce", _(u"Yale")), - ("ncf", _(u"Notsi")), - ("ncg", _(u"Nisga'a")), - ("nch", _(u"Central Huasteca Nahuatl")), - ("nci", _(u"Classical Nahuatl")), - ("ncj", _(u"Northern Puebla Nahuatl")), - ("nck", _(u"Nakara")), - ("ncl", _(u"Michoacán Nahuatl")), - ("ncm", _(u"Nambo")), - ("ncn", _(u"Nauna")), - ("nco", _(u"Sibe")), - ("ncp", _(u"Ndaktup")), - ("ncr", _(u"Ncane")), - ("ncs", _(u"Nicaraguan Sign Language")), - ("nct", _(u"Chothe Naga")), - ("ncu", _(u"Chumburung")), - ("ncx", _(u"Central Puebla Nahuatl")), - ("ncz", _(u"Natchez")), - ("nda", _(u"Ndasa")), - ("ndb", _(u"Kenswei Nsei")), - ("ndc", _(u"Ndau")), - ("ndd", _(u"Nde-Nsele-Nta")), - ("ndf", _(u"Nadruvian")), - ("ndg", _(u"Ndengereko")), - ("ndh", _(u"Ndali")), - ("ndi", _(u"Samba Leko")), - ("ndj", _(u"Ndamba")), - ("ndk", _(u"Ndaka")), - ("ndl", _(u"Ndolo")), - ("ndm", _(u"Ndam")), - ("ndn", _(u"Ngundi")), - ("ndp", _(u"Ndo")), - ("ndq", _(u"Ndombe")), - ("ndr", _(u"Ndoola")), - ("nds", _(u"Low German")), - ("ndt", _(u"Ndunga")), - ("ndu", _(u"Dugun")), - ("ndv", _(u"Ndut")), - ("ndw", _(u"Ndobo")), - ("ndx", _(u"Nduga")), - ("ndy", _(u"Lutos")), - ("ndz", _(u"Ndogo")), - ("nea", _(u"Eastern Ngad'a")), - ("neb", _(u"Toura")), - ("nec", _(u"Nedebang")), - ("ned", _(u"Nde-Gbite")), - ("nee", _(u"Nêlêmwa-Nixumwak")), - ("nef", _(u"Nefamese")), - ("neg", _(u"Negidal")), - ("neh", _(u"Nyenkha")), - ("nei", _(u"Neo-Hittite")), - ("nej", _(u"Neko")), - ("nek", _(u"Neku")), - ("nem", _(u"Nemi")), - ("nen", _(u"Nengone")), - ("neo", _(u"Ná-Meo")), - ("neq", _(u"North Central Mixe")), - ("ner", _(u"Yahadian")), - ("nes", _(u"Bhoti Kinnauri")), - ("net", _(u"Nete")), - ("neu", _(u"Neo")), - ("nev", _(u"Nyaheun")), - ("new", _(u"Newari")), - ("nex", _(u"Neme")), - ("ney", _(u"Neyo")), - ("nez", _(u"Nez Perce")), - ("nfa", _(u"Dhao")), - ("nfd", _(u"Ahwai")), - ("nfl", _(u"Ayiwo")), - ("nfr", _(u"Nafaanra")), - ("nfu", _(u"Mfumte")), - ("nga", _(u"Ngbaka")), - ("ngb", _(u"Northern Ngbandi")), - ("ngc", _(u"Ngombe")), - ("ngd", _(u"Ngando")), - ("nge", _(u"Ngemba")), - ("ngf", _(u"Trans-New Guinea languages")), - ("ngg", _(u"Ngbaka Manza")), - ("ngh", _(u"N/u")), - ("ngi", _(u"Ngizim")), - ("ngj", _(u"Ngie")), - ("ngk", _(u"Dalabon")), - ("ngl", _(u"Lomwe")), - ("ngm", _(u"Ngatik Men's Creole")), - ("ngn", _(u"Ngwo")), - ("ngo", _(u"Ngoni")), - ("ngp", _(u"Ngulu")), - ("ngq", _(u"Ngurimi")), - ("ngr", _(u"Engdewu")), - ("ngs", _(u"Gvoko")), - ("ngt", _(u"Ngeq")), - ("ngu", _(u"Guerrero Nahuatl")), - ("ngv", _(u"Nagumi")), - ("ngw", _(u"Ngwaba")), - ("ngx", _(u"Nggwahyi")), - ("ngy", _(u"Tibea")), - ("ngz", _(u"Ngungwel")), - ("nha", _(u"Nhanda")), - ("nhb", _(u"Beng")), - ("nhc", _(u"Tabasco Nahuatl")), - ("nhd", _(u"Chiripá")), - ("nhe", _(u"Eastern Huasteca Nahuatl")), - ("nhf", _(u"Nhuwala")), - ("nhg", _(u"Tetelcingo Nahuatl")), - ("nhh", _(u"Nahari")), - ("nhi", _(u"Zacatlán-Ahuacatlán-Tepetzintla Nahuatl")), - ("nhk", _(u"Isthmus-Cosoleacaque Nahuatl")), - ("nhm", _(u"Morelos Nahuatl")), - ("nhn", _(u"Central Nahuatl")), - ("nho", _(u"Takuu")), - ("nhp", _(u"Isthmus-Pajapan Nahuatl")), - ("nhq", _(u"Huaxcaleca Nahuatl")), - ("nhr", _(u"Naro")), - ("nht", _(u"Ometepec Nahuatl")), - ("nhu", _(u"Noone")), - ("nhv", _(u"Temascaltepec Nahuatl")), - ("nhw", _(u"Western Huasteca Nahuatl")), - ("nhx", _(u"Isthmus-Mecayapan Nahuatl")), - ("nhy", _(u"Northern Oaxaca Nahuatl")), - ("nhz", _(u"Santa María La Alta Nahuatl")), - ("nia", _(u"Nias")), - ("nib", _(u"Nakame")), - ("nic", _(u"Niger-Kordofanian languages")), - ("nid", _(u"Ngandi")), - ("nie", _(u"Niellim")), - ("nif", _(u"Nek")), - ("nig", _(u"Ngalakan")), - ("nih", _(u"Nyiha")), - ("nii", _(u"Nii")), - ("nij", _(u"Ngaju")), - ("nik", _(u"Southern Nicobarese")), - ("nil", _(u"Nila")), - ("nim", _(u"Nilamba")), - ("nin", _(u"Ninzo")), - ("nio", _(u"Nganasan")), - ("niq", _(u"Nandi")), - ("nir", _(u"Nimboran")), - ("nis", _(u"Nimi")), - ("nit", _(u"Southeastern Kolami")), - ("niu", _(u"Niuean")), - ("niv", _(u"Gilyak")), - ("niw", _(u"Nimo")), - ("nix", _(u"Hema")), - ("niy", _(u"Ngiti")), - ("niz", _(u"Ningil")), - ("nja", _(u"Nzanyi")), - ("njb", _(u"Nocte Naga")), - ("njd", _(u"Ndonde Hamba")), - ("njh", _(u"Lotha Naga")), - ("nji", _(u"Gudanji")), - ("njj", _(u"Njen")), - ("njl", _(u"Njalgulgule")), - ("njm", _(u"Angami Naga")), - ("njn", _(u"Liangmai Naga")), - ("njo", _(u"Ao Naga")), - ("njr", _(u"Njerep")), - ("njs", _(u"Nisa")), - ("njt", _(u"Ndyuka-Trio Pidgin")), - ("nju", _(u"Ngadjunmaya")), - ("njx", _(u"Kunyi")), - ("njy", _(u"Njyem")), - ("njz", _(u"Nyishi")), - ("nka", _(u"Nkoya")), - ("nkb", _(u"Khoibu Naga")), - ("nkc", _(u"Nkongho")), - ("nkd", _(u"Koireng")), - ("nke", _(u"Duke")), - ("nkf", _(u"Inpui Naga")), - ("nkg", _(u"Nekgini")), - ("nkh", _(u"Khezha Naga")), - ("nki", _(u"Thangal Naga")), - ("nkj", _(u"Nakai")), - ("nkk", _(u"Nokuku")), - ("nkm", _(u"Namat")), - ("nkn", _(u"Nkangala")), - ("nko", _(u"Nkonya")), - ("nkp", _(u"Niuatoputapu")), - ("nkq", _(u"Nkami")), - ("nkr", _(u"Nukuoro")), - ("nks", _(u"North Asmat")), - ("nkt", _(u"Nyika")), - ("nku", _(u"Bouna Kulango")), - ("nkv", _(u"Nyika")), - ("nkw", _(u"Nkutu")), - ("nkx", _(u"Nkoroo")), - ("nkz", _(u"Nkari")), - ("nla", _(u"Ngombale")), - ("nlc", _(u"Nalca")), - ("nle", _(u"East Nyala")), - ("nlg", _(u"Gela")), - ("nli", _(u"Grangali")), - ("nlj", _(u"Nyali")), - ("nlk", _(u"Ninia Yali")), - ("nll", _(u"Nihali")), - ("nln", _(u"Durango Nahuatl")), - ("nlo", _(u"Ngul")), - ("nlq", _(u"Lao Naga")), - ("nlr", _(u"Ngarla")), - ("nlu", _(u"Nchumbulu")), - ("nlv", _(u"Orizaba Nahuatl")), - ("nlw", _(u"Walangama")), - ("nlx", _(u"Nahali")), - ("nly", _(u"Nyamal")), - ("nlz", _(u"Nalögo")), - ("nma", _(u"Maram Naga")), - ("nmb", _(u"Big Nambas")), - ("nmc", _(u"Ngam")), - ("nmd", _(u"Ndumu")), - ("nme", _(u"Mzieme Naga")), - ("nmf", _(u"Tangkhul Naga")), - ("nmg", _(u"Kwasio")), - ("nmh", _(u"Monsang Naga")), - ("nmi", _(u"Nyam")), - ("nmj", _(u"Ngombe")), - ("nmk", _(u"Namakura")), - ("nml", _(u"Ndemli")), - ("nmm", _(u"Manangba")), - ("nmn", _(u"!Xóõ")), - ("nmo", _(u"Moyon Naga")), - ("nmp", _(u"Nimanbur")), - ("nmq", _(u"Nambya")), - ("nmr", _(u"Nimbari")), - ("nms", _(u"Letemboi")), - ("nmt", _(u"Namonuito")), - ("nmu", _(u"Northeast Maidu")), - ("nmv", _(u"Ngamini")), - ("nmw", _(u"Nimoa")), - ("nmx", _(u"Nama")), - ("nmy", _(u"Namuyi")), - ("nmz", _(u"Nawdm")), - ("nna", _(u"Nyangumarta")), - ("nnb", _(u"Nande")), - ("nnc", _(u"Nancere")), - ("nnd", _(u"West Ambae")), - ("nne", _(u"Ngandyera")), - ("nnf", _(u"Ngaing")), - ("nng", _(u"Maring Naga")), - ("nnh", _(u"Ngiemboon")), - ("nni", _(u"North Nuaulu")), - ("nnj", _(u"Nyangatom")), - ("nnk", _(u"Nankina")), - ("nnl", _(u"Northern Rengma Naga")), - ("nnm", _(u"Namia")), - ("nnn", _(u"Ngete")), - ("nnp", _(u"Wancho Naga")), - ("nnq", _(u"Ngindo")), - ("nnr", _(u"Narungga")), - ("nns", _(u"Ningye")), - ("nnt", _(u"Nanticoke")), - ("nnu", _(u"Dwang")), - ("nnv", _(u"Nugunu")), - ("nnw", _(u"Southern Nuni")), - ("nnx", _(u"Ngong")), - ("nny", _(u"Nyangga")), - ("nnz", _(u"Nda'nda'")), - ("noa", _(u"Woun Meu")), - ("noc", _(u"Nuk")), - ("nod", _(u"Northern Thai")), - ("noe", _(u"Nimadi")), - ("nof", _(u"Nomane")), - ("nog", _(u"Nogai")), - ("noh", _(u"Nomu")), - ("noi", _(u"Noiri")), - ("noj", _(u"Nonuya")), - ("nok", _(u"Nooksack")), - ("nol", _(u"Nomlaki")), - ("nom", _(u"Nocamán")), - ("non", _(u"Old Norse")), - ("noo", _(u"Nootka")), - ("nop", _(u"Numanggang")), - ("noq", _(u"Ngongo")), - ("nos", _(u"Eastern Nisu")), - ("not", _(u"Nomatsiguenga")), - ("nou", _(u"Ewage-Notu")), - ("nov", _(u"Novial")), - ("now", _(u"Nyambo")), - ("noy", _(u"Noy")), - ("noz", _(u"Nayi")), - ("npa", _(u"Nar Phu")), - ("npb", _(u"Nupbikha")), - ("npg", _(u"Ponyo-Gongwang Naga")), - ("nph", _(u"Phom Naga")), - ("npi", _(u"Nepali")), - ("npl", _(u"Southeastern Puebla Nahuatl")), - ("npn", _(u"Mondropolon")), - ("npo", _(u"Pochuri Naga")), - ("nps", _(u"Nipsan")), - ("npu", _(u"Puimei Naga")), - ("npy", _(u"Napu")), - ("nqg", _(u"Southern Nago")), - ("nqk", _(u"Kura Ede Nago")), - ("nqm", _(u"Ndom")), - ("nqn", _(u"Nen")), - ("nqo", _(u"N'Ko")), - ("nqq", _(u"Kyan-Karyaw Naga")), - ("nqy", _(u"Akyaung Ari Naga")), - ("nra", _(u"Ngom")), - ("nrb", _(u"Nara")), - ("nrc", _(u"Noric")), - ("nre", _(u"Southern Rengma Naga")), - ("nrf", _(u"Jèrriais")), - ("nrg", _(u"Narango")), - ("nri", _(u"Chokri Naga")), - ("nrk", _(u"Ngarla")), - ("nrl", _(u"Ngarluma")), - ("nrm", _(u"Narom")), - ("nrn", _(u"Norn")), - ("nrp", _(u"North Picene")), - ("nrr", _(u"Norra")), - ("nrt", _(u"Northern Kalapuya")), - ("nru", _(u"Narua")), - ("nrx", _(u"Ngurmbur")), - ("nrz", _(u"Lala")), - ("nsa", _(u"Sangtam Naga")), - ("nsc", _(u"Nshi")), - ("nsd", _(u"Southern Nisu")), - ("nse", _(u"Nsenga")), - ("nsf", _(u"Northwestern Nisu")), - ("nsg", _(u"Ngasa")), - ("nsh", _(u"Ngoshie")), - ("nsi", _(u"Nigerian Sign Language")), - ("nsk", _(u"Naskapi")), - ("nsl", _(u"Norwegian Sign Language")), - ("nsm", _(u"Sumi Naga")), - ("nsn", _(u"Nehan")), - ("nso", _(u"Pedi")), - ("nsp", _(u"Nepalese Sign Language")), - ("nsq", _(u"Northern Sierra Miwok")), - ("nsr", _(u"Maritime Sign Language")), - ("nss", _(u"Nali")), - ("nst", _(u"Tase Naga")), - ("nsu", _(u"Sierra Negra Nahuatl")), - ("nsv", _(u"Southwestern Nisu")), - ("nsw", _(u"Navut")), - ("nsx", _(u"Nsongo")), - ("nsy", _(u"Nasal")), - ("nsz", _(u"Nisenan")), - ("ntd", _(u"Northern Tidung")), - ("nte", _(u"Nathembo")), - ("ntg", _(u"Ngantangarra")), - ("nti", _(u"Natioro")), - ("ntj", _(u"Ngaanyatjarra")), - ("ntk", _(u"Ikoma-Nata-Isenye")), - ("ntm", _(u"Nateni")), - ("nto", _(u"Ntomba")), - ("ntp", _(u"Northern Tepehuan")), - ("ntr", _(u"Delo")), - ("nts", _(u"Natagaimas")), - ("ntu", _(u"Natügu")), - ("ntw", _(u"Nottoway")), - ("ntx", _(u"Tangkhul Naga")), - ("nty", _(u"Mantsi")), - ("ntz", _(u"Natanzi")), - ("nua", _(u"Yuanga")), - ("nub", _(u"Nubian languages")), - ("nuc", _(u"Nukuini")), - ("nud", _(u"Ngala")), - ("nue", _(u"Ngundu")), - ("nuf", _(u"Nusu")), - ("nug", _(u"Nungali")), - ("nuh", _(u"Ndunda")), - ("nui", _(u"Ngumbi")), - ("nuj", _(u"Nyole")), - ("nuk", _(u"Nuu-chah-nulth")), - ("nul", _(u"Nusa Laut")), - ("num", _(u"Niuafo'ou")), - ("nun", _(u"Anong")), - ("nuo", _(u"Nguôn")), - ("nup", _(u"Nupe-Nupe-Tako")), - ("nuq", _(u"Nukumanu")), - ("nur", _(u"Nukuria")), - ("nus", _(u"Nuer")), - ("nut", _(u"Nung")), - ("nuu", _(u"Ngbundu")), - ("nuv", _(u"Northern Nuni")), - ("nuw", _(u"Nguluwan")), - ("nux", _(u"Mehek")), - ("nuy", _(u"Nunggubuyu")), - ("nuz", _(u"Tlamacazapa Nahuatl")), - ("nvh", _(u"Nasarian")), - ("nvm", _(u"Namiae")), - ("nvo", _(u"Nyokon")), - ("nwa", _(u"Nawathinehena")), - ("nwb", _(u"Nyabwa")), - ("nwc", _(u"Classical Newari")), - ("nwe", _(u"Ngwe")), - ("nwg", _(u"Ngayawung")), - ("nwi", _(u"Southwest Tanna")), - ("nwm", _(u"Nyamusa-Molo")), - ("nwo", _(u"Nauo")), - ("nwr", _(u"Nawaru")), - ("nwx", _(u"Middle Newar")), - ("nwy", _(u"Nottoway-Meherrin")), - ("nxa", _(u"Nauete")), - ("nxd", _(u"Ngando")), - ("nxe", _(u"Nage")), - ("nxg", _(u"Ngad'a")), - ("nxi", _(u"Nindi")), - ("nxk", _(u"Koki Naga")), - ("nxl", _(u"South Nuaulu")), - ("nxm", _(u"Numidian")), - ("nxn", _(u"Ngawun")), - ("nxo", _(u"Ndambomo")), - ("nxq", _(u"Naxi")), - ("nxr", _(u"Ninggerum")), - ("nxu", _(u"Narau")), - ("nxx", _(u"Nafri")), - ("nyb", _(u"Nyangbo")), - ("nyc", _(u"Nyanga-li")), - ("nyd", _(u"Nyore")), - ("nye", _(u"Nyengo")), - ("nyf", _(u"Giryama")), - ("nyg", _(u"Nyindu")), - ("nyh", _(u"Nyigina")), - ("nyi", _(u"Ama")), - ("nyj", _(u"Nyanga")), - ("nyk", _(u"Nyaneka")), - ("nyl", _(u"Nyeu")), - ("nym", _(u"Nyamwezi")), - ("nyn", _(u"Nyankole")), - ("nyo", _(u"Nyoro")), - ("nyp", _(u"Nyang'i")), - ("nyq", _(u"Nayini")), - ("nyr", _(u"Nyiha")), - ("nys", _(u"Nyunga")), - ("nyt", _(u"Nyawaygi")), - ("nyu", _(u"Nyungwe")), - ("nyv", _(u"Nyulnyul")), - ("nyw", _(u"Nyaw")), - ("nyx", _(u"Nganyaywana")), - ("nyy", _(u"Nyakyusa-Ngonde")), - ("nza", _(u"Tigon Mbembe")), - ("nzb", _(u"Njebi")), - ("nzi", _(u"Nzima")), - ("nzk", _(u"Nzakara")), - ("nzm", _(u"Zeme Naga")), - ("nzs", _(u"New Zealand Sign Language")), - ("nzu", _(u"Teke-Nzikou")), - ("nzy", _(u"Nzakambay")), - ("nzz", _(u"Nanga Dama Dogon")), - ("oaa", _(u"Orok")), - ("oac", _(u"Oroch")), - ("oar", _(u"Old Aramaic")), - ("oav", _(u"Old Avar")), - ("obi", _(u"Obispeño")), - ("obk", _(u"Southern Bontok")), - ("obl", _(u"Oblo")), - ("obm", _(u"Moabite")), - ("obo", _(u"Obo Manobo")), - ("obr", _(u"Old Burmese")), - ("obt", _(u"Old Breton")), - ("obu", _(u"Obulom")), - ("oca", _(u"Ocaina")), - ("och", _(u"Old Chinese")), - ("oco", _(u"Old Cornish")), - ("ocu", _(u"Atzingo Matlatzinca")), - ("oda", _(u"Odut")), - ("odk", _(u"Od")), - ("odt", _(u"Old Dutch")), - ("odu", _(u"Odual")), - ("ofo", _(u"Ofo")), - ("ofs", _(u"Old Frisian")), - ("ofu", _(u"Efutop")), - ("ogb", _(u"Ogbia")), - ("ogc", _(u"Ogbah")), - ("oge", _(u"Old Georgian")), - ("ogg", _(u"Ogbogolo")), - ("ogo", _(u"Khana")), - ("ogu", _(u"Ogbronuagum")), - ("oht", _(u"Old Hittite")), - ("ohu", _(u"Old Hungarian")), - ("oia", _(u"Oirata")), - ("oin", _(u"Inebu One")), - ("ojb", _(u"Northwestern Ojibwa")), - ("ojc", _(u"Central Ojibwa")), - ("ojg", _(u"Eastern Ojibwa")), - ("ojp", _(u"Old Japanese")), - ("ojs", _(u"Severn Ojibwa")), - ("ojv", _(u"Ontong Java")), - ("ojw", _(u"Western Ojibwa")), - ("oka", _(u"Okanagan")), - ("okb", _(u"Okobo")), - ("okd", _(u"Okodia")), - ("oke", _(u"Okpe")), - ("okg", _(u"Koko Babangk")), - ("okh", _(u"Koresh-e Rostam")), - ("oki", _(u"Okiek")), - ("okj", _(u"Oko-Juwoi")), - ("okk", _(u"Kwamtim One")), - ("okl", _(u"Old Kentish Sign Language")), - ("okm", _(u"Middle Korean")), - ("okn", _(u"Oki-No-Erabu")), - ("oko", _(u"Old Korean")), - ("okr", _(u"Kirike")), - ("oks", _(u"Oko-Eni-Osayen")), - ("oku", _(u"Oku")), - ("okv", _(u"Orokaiva")), - ("okx", _(u"Okpe")), - ("ola", _(u"Walungge")), - ("old", _(u"Mochi")), - ("ole", _(u"Olekha")), - ("olk", _(u"Olkol")), - ("olm", _(u"Oloma")), - ("olo", _(u"Livvi")), - ("olr", _(u"Olrat")), - ("olt", _(u"Old Lithuanian")), - ("olu", _(u"Kuvale")), - ("oma", _(u"Omaha-Ponca")), - ("omb", _(u"East Ambae")), - ("omc", _(u"Mochica")), - ("ome", _(u"Omejes")), - ("omg", _(u"Omagua")), - ("omi", _(u"Omi")), - ("omk", _(u"Omok")), - ("oml", _(u"Ombo")), - ("omn", _(u"Minoan")), - ("omo", _(u"Utarmbung")), - ("omp", _(u"Old Manipuri")), - ("omq", _(u"Oto-Manguean languages")), - ("omr", _(u"Old Marathi")), - ("omt", _(u"Omotik")), - ("omu", _(u"Omurano")), - ("omv", _(u"Omotic languages")), - ("omw", _(u"South Tairora")), - ("omx", _(u"Old Mon")), - ("ona", _(u"Ona")), - ("onb", _(u"Lingao")), - ("one", _(u"Oneida")), - ("ong", _(u"Olo")), - ("oni", _(u"Onin")), - ("onj", _(u"Onjob")), - ("onk", _(u"Kabore One")), - ("onn", _(u"Onobasulu")), - ("ono", _(u"Onondaga")), - ("onp", _(u"Sartang")), - ("onr", _(u"Northern One")), - ("ons", _(u"Ono")), - ("ont", _(u"Ontenu")), - ("onu", _(u"Unua")), - ("onw", _(u"Old Nubian")), - ("onx", _(u"Onin Based Pidgin")), - ("ood", _(u"Tohono O'odham")), - ("oog", _(u"Ong")), - ("oon", _(u"Önge")), - ("oor", _(u"Oorlams")), - ("oos", _(u"Old Ossetic")), - ("opa", _(u"Okpamheri")), - ("opk", _(u"Kopkaka")), - ("opm", _(u"Oksapmin")), - ("opo", _(u"Opao")), - ("opt", _(u"Opata")), - ("opy", _(u"Ofayé")), - ("ora", _(u"Oroha")), - ("orc", _(u"Orma")), - ("ore", _(u"Orejón")), - ("org", _(u"Oring")), - ("orh", _(u"Oroqen")), - ("orn", _(u"Orang Kanaq")), - ("oro", _(u"Orokolo")), - ("orr", _(u"Oruma")), - ("ors", _(u"Orang Seletar")), - ("ort", _(u"Adivasi Oriya")), - ("oru", _(u"Ormuri")), - ("orv", _(u"Old Russian")), - ("orw", _(u"Oro Win")), - ("orx", _(u"Oro")), - ("ory", _(u"Odia")), - ("orz", _(u"Ormu")), - ("osa", _(u"Osage")), - ("osc", _(u"Oscan")), - ("osi", _(u"Osing")), - ("oso", _(u"Ososo")), - ("osp", _(u"Old Spanish")), - ("ost", _(u"Osatu")), - ("osu", _(u"Southern One")), - ("osx", _(u"Old Saxon")), - ("ota", _(u"Ottoman Turkish")), - ("otb", _(u"Old Tibetan")), - ("otd", _(u"Ot Danum")), - ("ote", _(u"Mezquital Otomi")), - ("oti", _(u"Oti")), - ("otk", _(u"Old Turkish")), - ("otl", _(u"Tilapa Otomi")), - ("otm", _(u"Eastern Highland Otomi")), - ("otn", _(u"Tenango Otomi")), - ("oto", _(u"Otomian languages")), - ("otq", _(u"Querétaro Otomi")), - ("otr", _(u"Otoro")), - ("ots", _(u"Estado de México Otomi")), - ("ott", _(u"Temoaya Otomi")), - ("otu", _(u"Otuke")), - ("otw", _(u"Ottawa")), - ("otx", _(u"Texcatepec Otomi")), - ("oty", _(u"Old Tamil")), - ("otz", _(u"Ixtenco Otomi")), - ("oua", _(u"Tagargrent")), - ("oub", _(u"Glio-Oubi")), - ("oue", _(u"Oune")), - ("oui", _(u"Old Uighur")), - ("oum", _(u"Ouma")), - ("oun", _(u"!O!ung")), - ("ovd", _(u"Övdalian")), - ("owi", _(u"Owiniga")), - ("owl", _(u"Old Welsh")), - ("oyb", _(u"Oy")), - ("oyd", _(u"Oyda")), - ("oym", _(u"Wayampi")), - ("oyy", _(u"Oya'oya")), - ("ozm", _(u"Koonzime")), - ("paa", _(u"Papuan languages")), - ("pab", _(u"Parecís")), - ("pac", _(u"Pacoh")), - ("pad", _(u"Paumarí")), - ("pae", _(u"Pagibete")), - ("paf", _(u"Paranawát")), - ("pag", _(u"Pangasinan")), - ("pah", _(u"Tenharim")), - ("pai", _(u"Pe")), - ("pak", _(u"Parakanã")), - ("pal", _(u"Pahlavi")), - ("pam", _(u"Pampanga")), - ("pao", _(u"Northern Paiute")), - ("pap", _(u"Papiamento")), - ("paq", _(u"Parya")), - ("par", _(u"Panamint")), - ("pas", _(u"Papasena")), - ("pat", _(u"Papitalai")), - ("pau", _(u"Palauan")), - ("pav", _(u"Pakaásnovos")), - ("paw", _(u"Pawnee")), - ("pax", _(u"Pankararé")), - ("pay", _(u"Pech")), - ("paz", _(u"Pankararú")), - ("pbb", _(u"Páez")), - ("pbc", _(u"Patamona")), - ("pbe", _(u"Mezontla Popoloca")), - ("pbf", _(u"Coyotepec Popoloca")), - ("pbg", _(u"Paraujano")), - ("pbh", _(u"E'ñapa Woromaipu")), - ("pbi", _(u"Parkwa")), - ("pbl", _(u"Mak")), - ("pbn", _(u"Kpasam")), - ("pbo", _(u"Papel")), - ("pbp", _(u"Badyara")), - ("pbr", _(u"Pangwa")), - ("pbs", _(u"Central Pame")), - ("pbt", _(u"Southern Pashto")), - ("pbu", _(u"Northern Pashto")), - ("pbv", _(u"Pnar")), - ("pby", _(u"Pyu")), - ("pbz", _(u"Palu")), - ("pca", _(u"Santa Inés Ahuatempan Popoloca")), - ("pcb", _(u"Pear")), - ("pcc", _(u"Bouyei")), - ("pcd", _(u"Picard")), - ("pce", _(u"Ruching Palaung")), - ("pcf", _(u"Paliyan")), - ("pcg", _(u"Paniya")), - ("pch", _(u"Pardhan")), - ("pci", _(u"Duruwa")), - ("pcj", _(u"Parenga")), - ("pck", _(u"Paite Chin")), - ("pcl", _(u"Pardhi")), - ("pcm", _(u"Nigerian Pidgin")), - ("pcn", _(u"Piti")), - ("pcp", _(u"Pacahuara")), - ("pcr", _(u"Panang")), - ("pcw", _(u"Pyapun")), - ("pda", _(u"Anam")), - ("pdc", _(u"Pennsylvania German")), - ("pdi", _(u"Pa Di")), - ("pdn", _(u"Podena")), - ("pdo", _(u"Padoe")), - ("pdt", _(u"Plautdietsch")), - ("pdu", _(u"Kayan")), - ("pea", _(u"Peranakan Indonesian")), - ("peb", _(u"Eastern Pomo")), - ("ped", _(u"Mala")), - ("pee", _(u"Taje")), - ("pef", _(u"Northeastern Pomo")), - ("peg", _(u"Pengo")), - ("peh", _(u"Bonan")), - ("pei", _(u"Chichimeca-Jonaz")), - ("pej", _(u"Northern Pomo")), - ("pek", _(u"Penchal")), - ("pel", _(u"Pekal")), - ("pem", _(u"Phende")), - ("peo", _(u"Old Persian")), - ("pep", _(u"Kunja")), - ("peq", _(u"Southern Pomo")), - ("pes", _(u"Iranian Persian")), - ("pev", _(u"Pémono")), - ("pex", _(u"Petats")), - ("pey", _(u"Petjo")), - ("pez", _(u"Eastern Penan")), - ("pfa", _(u"Pááfang")), - ("pfe", _(u"Peere")), - ("pfl", _(u"Pfaelzisch")), - ("pga", _(u"Sudanese Creole Arabic")), - ("pgd", _(u"Gāndhārī")), - ("pgg", _(u"Pangwali")), - ("pgi", _(u"Pagi")), - ("pgk", _(u"Rerep")), - ("pgl", _(u"Primitive Irish")), - ("pgn", _(u"Paelignian")), - ("pgs", _(u"Pangseng")), - ("pgu", _(u"Pagu")), - ("pgy", _(u"Pongyong")), - ("pgz", _(u"Papua New Guinean Sign Language")), - ("pha", _(u"Pa-Hng")), - ("phd", _(u"Phudagi")), - ("phg", _(u"Phuong")), - ("phh", _(u"Phukha")), - ("phi", _(u"Philippine languages")), - ("phk", _(u"Phake")), - ("phl", _(u"Phalura")), - ("phm", _(u"Phimbi")), - ("phn", _(u"Phoenician")), - ("pho", _(u"Phunoi")), - ("phq", _(u"Phana'")), - ("phr", _(u"Pahari-Potwari")), - ("pht", _(u"Phu Thai")), - ("phu", _(u"Phuan")), - ("phv", _(u"Pahlavani")), - ("phw", _(u"Phangduwali")), - ("pia", _(u"Pima Bajo")), - ("pib", _(u"Yine")), - ("pic", _(u"Pinji")), - ("pid", _(u"Piaroa")), - ("pie", _(u"Piro")), - ("pif", _(u"Pingelapese")), - ("pig", _(u"Pisabo")), - ("pih", _(u"Pitcairn-Norfolk")), - ("pii", _(u"Pini")), - ("pij", _(u"Pijao")), - ("pil", _(u"Yom")), - ("pim", _(u"Powhatan")), - ("pin", _(u"Piame")), - ("pio", _(u"Piapoco")), - ("pip", _(u"Pero")), - ("pir", _(u"Piratapuyo")), - ("pis", _(u"Pijin")), - ("pit", _(u"Pitta Pitta")), - ("piu", _(u"Pintupi-Luritja")), - ("piv", _(u"Pileni")), - ("piw", _(u"Pimbwe")), - ("pix", _(u"Piu")), - ("piy", _(u"Piya-Kwonci")), - ("piz", _(u"Pije")), - ("pjt", _(u"Pitjantjatjara")), - ("pka", _(u"Ardhamāgadhī Prākrit")), - ("pkb", _(u"Pokomo")), - ("pkc", _(u"Paekche")), - ("pkg", _(u"Pak-Tong")), - ("pkh", _(u"Pankhu")), - ("pkn", _(u"Pakanha")), - ("pko", _(u"Pökoot")), - ("pkp", _(u"Pukapuka")), - ("pkr", _(u"Attapady Kurumba")), - ("pks", _(u"Pakistan Sign Language")), - ("pkt", _(u"Maleng")), - ("pku", _(u"Paku")), - ("pla", _(u"Miani")), - ("plb", _(u"Polonombauk")), - ("plc", _(u"Central Palawano")), - ("pld", _(u"Polari")), - ("ple", _(u"Palu'e")), - ("plf", _(u"Central Malayo-Polynesian languages")), - ("plg", _(u"Pilagá")), - ("plh", _(u"Paulohi")), - ("plj", _(u"Polci")), - ("plk", _(u"Kohistani Shina")), - ("pll", _(u"Shwe Palaung")), - ("pln", _(u"Palenquero")), - ("plo", _(u"Oluta Popoluca")), - ("plp", _(u"Palpa")), - ("plq", _(u"Palaic")), - ("plr", _(u"Palaka Senoufo")), - ("pls", _(u"San Marcos Tlacoyalco Popoloca")), - ("plt", _(u"Plateau Malagasy")), - ("plu", _(u"Palikúr")), - ("plv", _(u"Southwest Palawano")), - ("plw", _(u"Brooke's Point Palawano")), - ("ply", _(u"Bolyu")), - ("plz", _(u"Paluan")), - ("pma", _(u"Paama")), - ("pmb", _(u"Pambia")), - ("pmc", _(u"Palumata")), - ("pmd", _(u"Pallanganmiddang")), - ("pme", _(u"Pwaamei")), - ("pmf", _(u"Pamona")), - ("pmh", _(u"Māhārāṣṭri Prākrit")), - ("pmi", _(u"Northern Pumi")), - ("pmj", _(u"Southern Pumi")), - ("pmk", _(u"Pamlico")), - ("pml", _(u"Lingua Franca")), - ("pmm", _(u"Pomo")), - ("pmn", _(u"Pam")), - ("pmo", _(u"Pom")), - ("pmq", _(u"Northern Pame")), - ("pmr", _(u"Paynamar")), - ("pms", _(u"Piemontese")), - ("pmt", _(u"Tuamotuan")), - ("pmu", _(u"Mirpur Panjabi")), - ("pmw", _(u"Plains Miwok")), - ("pmx", _(u"Poumei Naga")), - ("pmy", _(u"Papuan Malay")), - ("pmz", _(u"Southern Pame")), - ("pna", _(u"Punan Bah-Biau")), - ("pnb", _(u"Western Panjabi")), - ("pnc", _(u"Pannei")), - ("pne", _(u"Western Penan")), - ("png", _(u"Pongu")), - ("pnh", _(u"Penrhyn")), - ("pni", _(u"Aoheng")), - ("pnj", _(u"Pinjarup")), - ("pnk", _(u"Paunaka")), - ("pnl", _(u"Paleni")), - ("pnm", _(u"Punan Batu 1")), - ("pnn", _(u"Pinai-Hagahai")), - ("pno", _(u"Panobo")), - ("pnp", _(u"Pancana")), - ("pnq", _(u"Pana")), - ("pnr", _(u"Panim")), - ("pns", _(u"Ponosakan")), - ("pnt", _(u"Pontic")), - ("pnu", _(u"Jiongnai Bunu")), - ("pnv", _(u"Pinigura")), - ("pnw", _(u"Panytyima")), - ("pnx", _(u"Phong-Kniang")), - ("pny", _(u"Pinyin")), - ("pnz", _(u"Pana")), - ("poc", _(u"Poqomam")), - ("pod", _(u"Ponares")), - ("poe", _(u"San Juan Atzingo Popoloca")), - ("pof", _(u"Poke")), - ("pog", _(u"Potiguára")), - ("poh", _(u"Poqomchi'")), - ("poi", _(u"Highland Popoluca")), - ("pok", _(u"Pokangá")), - ("pom", _(u"Southeastern Pomo")), - ("pon", _(u"Pohnpeian")), - ("poo", _(u"Central Pomo")), - ("pop", _(u"Pwapwâ")), - ("poq", _(u"Texistepec Popoluca")), - ("pos", _(u"Sayula Popoluca")), - ("pot", _(u"Potawatomi")), - ("pov", _(u"Upper Guinea Crioulo")), - ("pow", _(u"San Felipe Otlaltepec Popoloca")), - ("pox", _(u"Polabian")), - ("poy", _(u"Pogolo")), - ("poz", _(u"Malayo-Polynesian languages")), - ("ppa", _(u"Pao")), - ("ppe", _(u"Papi")), - ("ppi", _(u"Paipai")), - ("ppk", _(u"Uma")), - ("ppl", _(u"Pipil")), - ("ppm", _(u"Papuma")), - ("ppn", _(u"Papapana")), - ("ppo", _(u"Folopa")), - ("ppp", _(u"Pelende")), - ("ppq", _(u"Pei")), - ("ppr", _(u"Piru")), - ("pps", _(u"San Luís Temalacayuca Popoloca")), - ("ppt", _(u"Pare")), - ("ppu", _(u"Papora")), - ("pqa", _(u"Pa'a")), - ("pqe", _(u"Eastern Malayo-Polynesian languages")), - ("pqm", _(u"Malecite-Passamaquoddy")), - ("pqw", _(u"Western Malayo-Polynesian languages")), - ("pra", _(u"Prakrit languages")), - ("prb", _(u"Lua'")), - ("prc", _(u"Parachi")), - ("prd", _(u"Parsi-Dari")), - ("pre", _(u"Principense")), - ("prf", _(u"Paranan")), - ("prg", _(u"Prussian")), - ("prh", _(u"Porohanon")), - ("pri", _(u"Paicî")), - ("prk", _(u"Parauk")), - ("prl", _(u"Peruvian Sign Language")), - ("prm", _(u"Kibiri")), - ("prn", _(u"Prasuni")), - ("pro", _(u"Old Provençal")), - ("prp", _(u"Parsi")), - ("prq", _(u"Ashéninka Perené")), - ("prr", _(u"Puri")), - ("prs", _(u"Dari")), - ("prt", _(u"Phai")), - ("pru", _(u"Puragi")), - ("prw", _(u"Parawen")), - ("prx", _(u"Purik")), - ("pry", _(u"Pray 3")), - ("prz", _(u"Providencia Sign Language")), - ("psa", _(u"Asue Awyu")), - ("psc", _(u"Persian Sign Language")), - ("psd", _(u"Plains Indian Sign Language")), - ("pse", _(u"Central Malay")), - ("psg", _(u"Penang Sign Language")), - ("psh", _(u"Southwest Pashai")), - ("psi", _(u"Southeast Pashai")), - ("psl", _(u"Puerto Rican Sign Language")), - ("psm", _(u"Pauserna")), - ("psn", _(u"Panasuan")), - ("pso", _(u"Polish Sign Language")), - ("psp", _(u"Philippine Sign Language")), - ("psq", _(u"Pasi")), - ("psr", _(u"Portuguese Sign Language")), - ("pss", _(u"Kaulong")), - ("pst", _(u"Central Pashto")), - ("psu", _(u"Sauraseni Prākrit")), - ("psw", _(u"Port Sandwich")), - ("psy", _(u"Piscataway")), - ("pta", _(u"Pai Tavytera")), - ("pth", _(u"Pataxó Hã-Ha-Hãe")), - ("pti", _(u"Pintiini")), - ("ptn", _(u"Patani")), - ("pto", _(u"Zo'é")), - ("ptp", _(u"Patep")), - ("ptq", _(u"Pattapu")), - ("ptr", _(u"Piamatsina")), - ("ptt", _(u"Enrekang")), - ("ptu", _(u"Bambam")), - ("ptv", _(u"Port Vato")), - ("ptw", _(u"Pentlatch")), - ("pty", _(u"Pathiya")), - ("pua", _(u"Western Highland Purepecha")), - ("pub", _(u"Purum")), - ("puc", _(u"Punan Merap")), - ("pud", _(u"Punan Aput")), - ("pue", _(u"Puelche")), - ("puf", _(u"Punan Merah")), - ("pug", _(u"Phuie")), - ("pui", _(u"Puinave")), - ("puj", _(u"Punan Tubu")), - ("puk", _(u"Pu Ko")), - ("pum", _(u"Puma")), - ("puo", _(u"Puoc")), - ("pup", _(u"Pulabu")), - ("puq", _(u"Puquina")), - ("pur", _(u"Puruborá")), - ("put", _(u"Putoh")), - ("puu", _(u"Punu")), - ("puw", _(u"Puluwatese")), - ("pux", _(u"Puare")), - ("puy", _(u"Purisimeño")), - ("puz", _(u"Purum Naga")), - ("pwa", _(u"Pawaia")), - ("pwb", _(u"Panawa")), - ("pwg", _(u"Gapapaiwa")), - ("pwi", _(u"Patwin")), - ("pwm", _(u"Molbog")), - ("pwn", _(u"Paiwan")), - ("pwo", _(u"Pwo Western Karen")), - ("pwr", _(u"Powari")), - ("pww", _(u"Pwo Northern Karen")), - ("pxm", _(u"Quetzaltepec Mixe")), - ("pye", _(u"Pye Krumen")), - ("pym", _(u"Fyam")), - ("pyn", _(u"Poyanáwa")), - ("pys", _(u"Paraguayan Sign Language")), - ("pyu", _(u"Puyuma")), - ("pyx", _(u"Pyu")), - ("pyy", _(u"Pyen")), - ("pzn", _(u"Para Naga")), - ("qaa..qtz", _(u"Private use")), - ("qua", _(u"Quapaw")), - ("qub", _(u"Huallaga Huánuco Quechua")), - ("quc", _(u"K'iche'")), - ("qud", _(u"Calderón Highland Quichua")), - ("quf", _(u"Lambayeque Quechua")), - ("qug", _(u"Chimborazo Highland Quichua")), - ("quh", _(u"South Bolivian Quechua")), - ("qui", _(u"Quileute")), - ("quk", _(u"Chachapoyas Quechua")), - ("qul", _(u"North Bolivian Quechua")), - ("qum", _(u"Sipacapense")), - ("qun", _(u"Quinault")), - ("qup", _(u"Southern Pastaza Quechua")), - ("quq", _(u"Quinqui")), - ("qur", _(u"Yanahuanca Pasco Quechua")), - ("qus", _(u"Santiago del Estero Quichua")), - ("quv", _(u"Sacapulteco")), - ("quw", _(u"Tena Lowland Quichua")), - ("qux", _(u"Yauyos Quechua")), - ("quy", _(u"Ayacucho Quechua")), - ("quz", _(u"Cusco Quechua")), - ("qva", _(u"Ambo-Pasco Quechua")), - ("qvc", _(u"Cajamarca Quechua")), - ("qve", _(u"Eastern Apurímac Quechua")), - ("qvh", _(u"Huamalíes-Dos de Mayo Huánuco Quechua")), - ("qvi", _(u"Imbabura Highland Quichua")), - ("qvj", _(u"Loja Highland Quichua")), - ("qvl", _(u"Cajatambo North Lima Quechua")), - ("qvm", _(u"Margos-Yarowilca-Lauricocha Quechua")), - ("qvn", _(u"North Junín Quechua")), - ("qvo", _(u"Napo Lowland Quechua")), - ("qvp", _(u"Pacaraos Quechua")), - ("qvs", _(u"San Martín Quechua")), - ("qvw", _(u"Huaylla Wanca Quechua")), - ("qvy", _(u"Queyu")), - ("qvz", _(u"Northern Pastaza Quichua")), - ("qwa", _(u"Corongo Ancash Quechua")), - ("qwc", _(u"Classical Quechua")), - ("qwe", _(u"Quechuan")), - ("qwh", _(u"Huaylas Ancash Quechua")), - ("qwm", _(u"Kuman")), - ("qws", _(u"Sihuas Ancash Quechua")), - ("qwt", _(u"Kwalhioqua-Tlatskanai")), - ("qxa", _(u"Chiquián Ancash Quechua")), - ("qxc", _(u"Chincha Quechua")), - ("qxh", _(u"Panao Huánuco Quechua")), - ("qxl", _(u"Salasaca Highland Quichua")), - ("qxn", _(u"Northern Conchucos Ancash Quechua")), - ("qxo", _(u"Southern Conchucos Ancash Quechua")), - ("qxp", _(u"Puno Quechua")), - ("qxq", _(u"Qashqa'i")), - ("qxr", _(u"Cañar Highland Quichua")), - ("qxs", _(u"Southern Qiang")), - ("qxt", _(u"Santa Ana de Tusi Pasco Quechua")), - ("qxu", _(u"Arequipa-La Unión Quechua")), - ("qxw", _(u"Jauja Wanca Quechua")), - ("qya", _(u"Quenya")), - ("qyp", _(u"Quiripi")), - ("raa", _(u"Dungmali")), - ("rab", _(u"Camling")), - ("rac", _(u"Rasawa")), - ("rad", _(u"Rade")), - ("raf", _(u"Western Meohang")), - ("rag", _(u"Logooli")), - ("rah", _(u"Rabha")), - ("rai", _(u"Ramoaaina")), - ("raj", _(u"Rajasthani")), - ("rak", _(u"Tulu-Bohuai")), - ("ral", _(u"Ralte")), - ("ram", _(u"Canela")), - ("ran", _(u"Riantana")), - ("rao", _(u"Rao")), - ("rap", _(u"Rapanui")), - ("raq", _(u"Saam")), - ("rar", _(u"Rarotongan")), - ("ras", _(u"Tegali")), - ("rat", _(u"Razajerdi")), - ("rau", _(u"Raute")), - ("rav", _(u"Sampang")), - ("raw", _(u"Rawang")), - ("rax", _(u"Rang")), - ("ray", _(u"Rapa")), - ("raz", _(u"Rahambuu")), - ("rbb", _(u"Rumai Palaung")), - ("rbk", _(u"Northern Bontok")), - ("rbl", _(u"Miraya Bikol")), - ("rbp", _(u"Barababaraba")), - ("rcf", _(u"Réunion Creole French")), - ("rdb", _(u"Rudbari")), - ("rea", _(u"Rerau")), - ("reb", _(u"Rembong")), - ("ree", _(u"Rejang Kayan")), - ("reg", _(u"Kara")), - ("rei", _(u"Reli")), - ("rej", _(u"Rejang")), - ("rel", _(u"Rendille")), - ("rem", _(u"Remo")), - ("ren", _(u"Rengao")), - ("rer", _(u"Rer Bare")), - ("res", _(u"Reshe")), - ("ret", _(u"Retta")), - ("rey", _(u"Reyesano")), - ("rga", _(u"Roria")), - ("rge", _(u"Romano-Greek")), - ("rgk", _(u"Rangkas")), - ("rgn", _(u"Romagnol")), - ("rgr", _(u"Resígaro")), - ("rgs", _(u"Southern Roglai")), - ("rgu", _(u"Ringgou")), - ("rhg", _(u"Rohingya")), - ("rhp", _(u"Yahang")), - ("ria", _(u"Riang")), - ("rie", _(u"Rien")), - ("rif", _(u"Tarifit")), - ("ril", _(u"Riang")), - ("rim", _(u"Nyaturu")), - ("rin", _(u"Nungu")), - ("rir", _(u"Ribun")), - ("rit", _(u"Ritarungo")), - ("riu", _(u"Riung")), - ("rjg", _(u"Rajong")), - ("rji", _(u"Raji")), - ("rjs", _(u"Rajbanshi")), - ("rka", _(u"Kraol")), - ("rkb", _(u"Rikbaktsa")), - ("rkh", _(u"Rakahanga-Manihiki")), - ("rki", _(u"Rakhine")), - ("rkm", _(u"Marka")), - ("rkt", _(u"Rangpuri")), - ("rkw", _(u"Arakwal")), - ("rma", _(u"Rama")), - ("rmb", _(u"Rembarunga")), - ("rmc", _(u"Carpathian Romani")), - ("rmd", _(u"Traveller Danish")), - ("rme", _(u"Angloromani")), - ("rmf", _(u"Kalo Finnish Romani")), - ("rmg", _(u"Traveller Norwegian")), - ("rmh", _(u"Murkim")), - ("rmi", _(u"Lomavren")), - ("rmk", _(u"Romkun")), - ("rml", _(u"Baltic Romani")), - ("rmm", _(u"Roma")), - ("rmn", _(u"Balkan Romani")), - ("rmo", _(u"Sinte Romani")), - ("rmp", _(u"Rempi")), - ("rmq", _(u"Caló")), - ("rmr", _(u"Caló")), - ("rms", _(u"Romanian Sign Language")), - ("rmt", _(u"Domari")), - ("rmu", _(u"Tavringer Romani")), - ("rmv", _(u"Romanova")), - ("rmw", _(u"Welsh Romani")), - ("rmx", _(u"Romam")), - ("rmy", _(u"Vlax Romani")), - ("rmz", _(u"Marma")), - ("rna", _(u"Runa")), - ("rnd", _(u"Ruund")), - ("rng", _(u"Ronga")), - ("rnl", _(u"Ranglong")), - ("rnn", _(u"Roon")), - ("rnp", _(u"Rongpo")), - ("rnr", _(u"Nari Nari")), - ("rnw", _(u"Rungwa")), - ("roa", _(u"Romance languages")), - ("rob", _(u"Tae'")), - ("roc", _(u"Cacgia Roglai")), - ("rod", _(u"Rogo")), - ("roe", _(u"Ronji")), - ("rof", _(u"Rombo")), - ("rog", _(u"Northern Roglai")), - ("rol", _(u"Romblomanon")), - ("rom", _(u"Romany")), - ("roo", _(u"Rotokas")), - ("rop", _(u"Kriol")), - ("ror", _(u"Rongga")), - ("rou", _(u"Runga")), - ("row", _(u"Dela-Oenale")), - ("rpn", _(u"Repanbitip")), - ("rpt", _(u"Rapting")), - ("rri", _(u"Ririo")), - ("rro", _(u"Waima")), - ("rrt", _(u"Arritinngithigh")), - ("rsb", _(u"Romano-Serbian")), - ("rsi", _(u"Rennellese Sign Language")), - ("rsl", _(u"Russian Sign Language")), - ("rsm", _(u"Miriwoong Sign Language")), - ("rtc", _(u"Rungtu Chin")), - ("rth", _(u"Ratahan")), - ("rtm", _(u"Rotuman")), - ("rts", _(u"Yurats")), - ("rtw", _(u"Rathawi")), - ("rub", _(u"Gungu")), - ("ruc", _(u"Ruuli")), - ("rue", _(u"Rusyn")), - ("ruf", _(u"Luguru")), - ("rug", _(u"Roviana")), - ("ruh", _(u"Ruga")), - ("rui", _(u"Rufiji")), - ("ruk", _(u"Che")), - ("ruo", _(u"Istro Romanian")), - ("rup", _(u"Macedo-Romanian")), - ("ruq", _(u"Megleno Romanian")), - ("rut", _(u"Rutul")), - ("ruu", _(u"Lanas Lobu")), - ("ruy", _(u"Mala")), - ("ruz", _(u"Ruma")), - ("rwa", _(u"Rawo")), - ("rwk", _(u"Rwa")), - ("rwm", _(u"Amba")), - ("rwo", _(u"Rawa")), - ("rwr", _(u"Marwari")), - ("rxd", _(u"Ngardi")), - ("rxw", _(u"Karuwali")), - ("ryn", _(u"Northern Amami-Oshima")), - ("rys", _(u"Yaeyama")), - ("ryu", _(u"Central Okinawan")), - ("rzh", _(u"Rāziḥī")), - ("saa", _(u"Saba")), - ("sab", _(u"Buglere")), - ("sac", _(u"Meskwaki")), - ("sad", _(u"Sandawe")), - ("sae", _(u"Sabanê")), - ("saf", _(u"Safaliba")), - ("sah", _(u"Yakut")), - ("sai", _(u"South American Indian languages")), - ("saj", _(u"Sahu")), - ("sak", _(u"Sake")), - ("sal", _(u"Salishan languages")), - ("sam", _(u"Samaritan Aramaic")), - ("sao", _(u"Sause")), - ("sap", _(u"Sanapaná")), - ("saq", _(u"Samburu")), - ("sar", _(u"Saraveca")), - ("sas", _(u"Sasak")), - ("sat", _(u"Santali")), - ("sau", _(u"Saleman")), - ("sav", _(u"Saafi-Saafi")), - ("saw", _(u"Sawi")), - ("sax", _(u"Sa")), - ("say", _(u"Saya")), - ("saz", _(u"Saurashtra")), - ("sba", _(u"Ngambay")), - ("sbb", _(u"Simbo")), - ("sbc", _(u"Kele")), - ("sbd", _(u"Southern Samo")), - ("sbe", _(u"Saliba")), - ("sbf", _(u"Chabu")), - ("sbg", _(u"Seget")), - ("sbh", _(u"Sori-Harengan")), - ("sbi", _(u"Seti")), - ("sbj", _(u"Surbakhal")), - ("sbk", _(u"Safwa")), - ("sbl", _(u"Botolan Sambal")), - ("sbm", _(u"Sagala")), - ("sbn", _(u"Sindhi Bhil")), - ("sbo", _(u"Sabüm")), - ("sbp", _(u"Sangu")), - ("sbq", _(u"Sileibi")), - ("sbr", _(u"Sembakung Murut")), - ("sbs", _(u"Subiya")), - ("sbt", _(u"Kimki")), - ("sbu", _(u"Stod Bhoti")), - ("sbv", _(u"Sabine")), - ("sbw", _(u"Simba")), - ("sbx", _(u"Seberuang")), - ("sby", _(u"Soli")), - ("sbz", _(u"Sara Kaba")), - ("sca", _(u"Sansu")), - ("scb", _(u"Chut")), - ("sce", _(u"Dongxiang")), - ("scf", _(u"San Miguel Creole French")), - ("scg", _(u"Sanggau")), - ("sch", _(u"Sakachep")), - ("sci", _(u"Sri Lankan Creole Malay")), - ("sck", _(u"Sadri")), - ("scl", _(u"Shina")), - ("scn", _(u"Sicilian")), - ("sco", _(u"Scots")), - ("scp", _(u"Helambu Sherpa")), - ("scq", _(u"Sa'och")), - ("scs", _(u"North Slavey")), - ("scu", _(u"Shumcho")), - ("scv", _(u"Sheni")), - ("scw", _(u"Sha")), - ("scx", _(u"Sicel")), - ("sda", _(u"Toraja-Sa'dan")), - ("sdb", _(u"Shabak")), - ("sdc", _(u"Sassarese Sardinian")), - ("sde", _(u"Surubu")), - ("sdf", _(u"Sarli")), - ("sdg", _(u"Savi")), - ("sdh", _(u"Southern Kurdish")), - ("sdj", _(u"Suundi")), - ("sdk", _(u"Sos Kundi")), - ("sdl", _(u"Saudi Arabian Sign Language")), - ("sdm", _(u"Semandang")), - ("sdn", _(u"Gallurese Sardinian")), - ("sdo", _(u"Bukar-Sadung Bidayuh")), - ("sdp", _(u"Sherdukpen")), - ("sdr", _(u"Oraon Sadri")), - ("sds", _(u"Sened")), - ("sdt", _(u"Shuadit")), - ("sdu", _(u"Sarudu")), - ("sdv", _(u"Eastern Sudanic languages")), - ("sdx", _(u"Sibu Melanau")), - ("sdz", _(u"Sallands")), - ("sea", _(u"Semai")), - ("seb", _(u"Shempire Senoufo")), - ("sec", _(u"Sechelt")), - ("sed", _(u"Sedang")), - ("see", _(u"Seneca")), - ("sef", _(u"Cebaara Senoufo")), - ("seg", _(u"Segeju")), - ("seh", _(u"Sena")), - ("sei", _(u"Seri")), - ("sej", _(u"Sene")), - ("sek", _(u"Sekani")), - ("sel", _(u"Selkup")), - ("sem", _(u"Semitic languages")), - ("sen", _(u"Nanerigé Sénoufo")), - ("seo", _(u"Suarmin")), - ("sep", _(u"Sìcìté Sénoufo")), - ("seq", _(u"Senara Sénoufo")), - ("ser", _(u"Serrano")), - ("ses", _(u"Koyraboro Senni Songhai")), - ("set", _(u"Sentani")), - ("seu", _(u"Serui-Laut")), - ("sev", _(u"Nyarafolo Senoufo")), - ("sew", _(u"Sewa Bay")), - ("sey", _(u"Secoya")), - ("sez", _(u"Senthang Chin")), - ("sfb", _(u"Langue des signes de Belgique Francophone")), - ("sfe", _(u"Eastern Subanen")), - ("sfm", _(u"Small Flowery Miao")), - ("sfs", _(u"South African Sign Language")), - ("sfw", _(u"Sehwi")), - ("sga", _(u"Old Irish")), - ("sgb", _(u"Mag-antsi Ayta")), - ("sgc", _(u"Kipsigis")), - ("sgd", _(u"Surigaonon")), - ("sge", _(u"Segai")), - ("sgg", _(u"Swiss-German Sign Language")), - ("sgh", _(u"Shughni")), - ("sgi", _(u"Suga")), - ("sgj", _(u"Surgujia")), - ("sgk", _(u"Sangkong")), - ("sgl", _(u"Sanglechi-Ishkashimi")), - ("sgm", _(u"Singa")), - ("sgn", _(u"Sign languages")), - ("sgo", _(u"Songa")), - ("sgp", _(u"Singpho")), - ("sgr", _(u"Sangisari")), - ("sgs", _(u"Samogitian")), - ("sgt", _(u"Brokpake")), - ("sgu", _(u"Salas")), - ("sgw", _(u"Sebat Bet Gurage")), - ("sgx", _(u"Sierra Leone Sign Language")), - ("sgy", _(u"Sanglechi")), - ("sgz", _(u"Sursurunga")), - ("sha", _(u"Shall-Zwall")), - ("shb", _(u"Ninam")), - ("shc", _(u"Sonde")), - ("shd", _(u"Kundal Shahi")), - ("she", _(u"Sheko")), - ("shg", _(u"Shua")), - ("shh", _(u"Shoshoni")), - ("shi", _(u"Tachelhit")), - ("shj", _(u"Shatt")), - ("shk", _(u"Shilluk")), - ("shl", _(u"Shendu")), - ("shm", _(u"Shahrudi")), - ("shn", _(u"Shan")), - ("sho", _(u"Shanga")), - ("shp", _(u"Shipibo-Conibo")), - ("shq", _(u"Sala")), - ("shr", _(u"Shi")), - ("shs", _(u"Shuswap")), - ("sht", _(u"Shasta")), - ("shu", _(u"Chadian Arabic")), - ("shv", _(u"Shehri")), - ("shw", _(u"Shwai")), - ("shx", _(u"She")), - ("shy", _(u"Tachawit")), - ("shz", _(u"Syenara Senoufo")), - ("sia", _(u"Akkala Sami")), - ("sib", _(u"Sebop")), - ("sid", _(u"Sidamo")), - ("sie", _(u"Simaa")), - ("sif", _(u"Siamou")), - ("sig", _(u"Paasaal")), - ("sih", _(u"Zire")), - ("sii", _(u"Shom Peng")), - ("sij", _(u"Numbami")), - ("sik", _(u"Sikiana")), - ("sil", _(u"Tumulung Sisaala")), - ("sim", _(u"Mende")), - ("sio", _(u"Siouan languages")), - ("sip", _(u"Sikkimese")), - ("siq", _(u"Sonia")), - ("sir", _(u"Siri")), - ("sis", _(u"Siuslaw")), - ("sit", _(u"Sino-Tibetan languages")), - ("siu", _(u"Sinagen")), - ("siv", _(u"Sumariup")), - ("siw", _(u"Siwai")), - ("six", _(u"Sumau")), - ("siy", _(u"Sivandi")), - ("siz", _(u"Siwi")), - ("sja", _(u"Epena")), - ("sjb", _(u"Sajau Basap")), - ("sjd", _(u"Kildin Sami")), - ("sje", _(u"Pite Sami")), - ("sjg", _(u"Assangori")), - ("sjk", _(u"Kemi Sami")), - ("sjl", _(u"Sajalong")), - ("sjm", _(u"Mapun")), - ("sjn", _(u"Sindarin")), - ("sjo", _(u"Xibe")), - ("sjp", _(u"Surjapuri")), - ("sjr", _(u"Siar-Lak")), - ("sjs", _(u"Senhaja De Srair")), - ("sjt", _(u"Ter Sami")), - ("sju", _(u"Ume Sami")), - ("sjw", _(u"Shawnee")), - ("ska", _(u"Skagit")), - ("skb", _(u"Saek")), - ("skc", _(u"Ma Manda")), - ("skd", _(u"Southern Sierra Miwok")), - ("ske", _(u"Seke")), - ("skf", _(u"Sakirabiá")), - ("skg", _(u"Sakalava Malagasy")), - ("skh", _(u"Sikule")), - ("ski", _(u"Sika")), - ("skj", _(u"Seke")), - ("skk", _(u"Sok")), - ("skm", _(u"Kutong")), - ("skn", _(u"Kolibugan Subanon")), - ("sko", _(u"Seko Tengah")), - ("skp", _(u"Sekapan")), - ("skq", _(u"Sininkere")), - ("skr", _(u"Saraiki")), - ("sks", _(u"Maia")), - ("skt", _(u"Sakata")), - ("sku", _(u"Sakao")), - ("skv", _(u"Skou")), - ("skw", _(u"Skepi Creole Dutch")), - ("skx", _(u"Seko Padang")), - ("sky", _(u"Sikaiana")), - ("skz", _(u"Sekar")), - ("sla", _(u"Slavic languages")), - ("slc", _(u"Sáliba")), - ("sld", _(u"Sissala")), - ("sle", _(u"Sholaga")), - ("slf", _(u"Swiss-Italian Sign Language")), - ("slg", _(u"Selungai Murut")), - ("slh", _(u"Southern Puget Sound Salish")), - ("sli", _(u"Lower Silesian")), - ("slj", _(u"Salumá")), - ("sll", _(u"Salt-Yui")), - ("slm", _(u"Pangutaran Sama")), - ("sln", _(u"Salinan")), - ("slp", _(u"Lamaholot")), - ("slq", _(u"Salchuq")), - ("slr", _(u"Salar")), - ("sls", _(u"Singapore Sign Language")), - ("slt", _(u"Sila")), - ("slu", _(u"Selaru")), - ("slw", _(u"Sialum")), - ("slx", _(u"Salampasu")), - ("sly", _(u"Selayar")), - ("slz", _(u"Ma'ya")), - ("sma", _(u"Southern Sami")), - ("smb", _(u"Simbari")), - ("smc", _(u"Som")), - ("smd", _(u"Sama")), - ("smf", _(u"Auwe")), - ("smg", _(u"Simbali")), - ("smh", _(u"Samei")), - ("smi", _(u"Sami languages")), - ("smj", _(u"Lule Sami")), - ("smk", _(u"Bolinao")), - ("sml", _(u"Central Sama")), - ("smm", _(u"Musasa")), - ("smn", _(u"Inari Sami")), - ("smp", _(u"Samaritan")), - ("smq", _(u"Samo")), - ("smr", _(u"Simeulue")), - ("sms", _(u"Skolt Sami")), - ("smt", _(u"Simte")), - ("smu", _(u"Somray")), - ("smv", _(u"Samvedi")), - ("smw", _(u"Sumbawa")), - ("smx", _(u"Samba")), - ("smy", _(u"Semnani")), - ("smz", _(u"Simeku")), - ("snb", _(u"Sebuyau")), - ("snc", _(u"Sinaugoro")), - ("sne", _(u"Bau Bidayuh")), - ("snf", _(u"Noon")), - ("sng", _(u"Sanga")), - ("snh", _(u"Shinabo")), - ("sni", _(u"Sensi")), - ("snj", _(u"Riverain Sango")), - ("snk", _(u"Soninke")), - ("snl", _(u"Sangil")), - ("snm", _(u"Southern Ma'di")), - ("snn", _(u"Siona")), - ("sno", _(u"Snohomish")), - ("snp", _(u"Siane")), - ("snq", _(u"Sangu")), - ("snr", _(u"Sihan")), - ("sns", _(u"South West Bay")), - ("snu", _(u"Senggi")), - ("snv", _(u"Sa'ban")), - ("snw", _(u"Selee")), - ("snx", _(u"Sam")), - ("sny", _(u"Saniyo-Hiyewe")), - ("snz", _(u"Sinsauru")), - ("soa", _(u"Thai Song")), - ("sob", _(u"Sobei")), - ("soc", _(u"So")), - ("sod", _(u"Songoora")), - ("soe", _(u"Songomeno")), - ("sog", _(u"Sogdian")), - ("soh", _(u"Aka")), - ("soi", _(u"Sonha")), - ("soj", _(u"Soi")), - ("sok", _(u"Sokoro")), - ("sol", _(u"Solos")), - ("son", _(u"Songhai languages")), - ("soo", _(u"Songo")), - ("sop", _(u"Songe")), - ("soq", _(u"Kanasi")), - ("sor", _(u"Somrai")), - ("sos", _(u"Seeku")), - ("sou", _(u"Southern Thai")), - ("sov", _(u"Sonsorol")), - ("sow", _(u"Sowanda")), - ("sox", _(u"Swo")), - ("soy", _(u"Miyobe")), - ("soz", _(u"Temi")), - ("spb", _(u"Sepa")), - ("spc", _(u"Sapé")), - ("spd", _(u"Saep")), - ("spe", _(u"Sepa")), - ("spg", _(u"Sian")), - ("spi", _(u"Saponi")), - ("spk", _(u"Sengo")), - ("spl", _(u"Selepet")), - ("spm", _(u"Akukem")), - ("spn", _(u"Sanapaná")), - ("spo", _(u"Spokane")), - ("spp", _(u"Supyire Senoufo")), - ("spq", _(u"Loreto-Ucayali Spanish")), - ("spr", _(u"Saparua")), - ("sps", _(u"Saposa")), - ("spt", _(u"Spiti Bhoti")), - ("spu", _(u"Sapuan")), - ("spv", _(u"Sambalpuri")), - ("spx", _(u"South Picene")), - ("spy", _(u"Sabaot")), - ("sqa", _(u"Shama-Sambuga")), - ("sqh", _(u"Shau")), - ("sqj", _(u"Albanian languages")), - ("sqk", _(u"Albanian Sign Language")), - ("sqm", _(u"Suma")), - ("sqn", _(u"Susquehannock")), - ("sqo", _(u"Sorkhei")), - ("sqq", _(u"Sou")), - ("sqr", _(u"Siculo Arabic")), - ("sqs", _(u"Sri Lankan Sign Language")), - ("sqt", _(u"Soqotri")), - ("squ", _(u"Squamish")), - ("sra", _(u"Saruga")), - ("srb", _(u"Sora")), - ("src", _(u"Logudorese Sardinian")), - ("sre", _(u"Sara")), - ("srf", _(u"Nafi")), - ("srg", _(u"Sulod")), - ("srh", _(u"Sarikoli")), - ("sri", _(u"Siriano")), - ("srk", _(u"Serudung Murut")), - ("srl", _(u"Isirawa")), - ("srm", _(u"Saramaccan")), - ("srn", _(u"Sranan Tongo")), - ("sro", _(u"Campidanese Sardinian")), - ("srq", _(u"Sirionó")), - ("srr", _(u"Serer")), - ("srs", _(u"Sarsi")), - ("srt", _(u"Sauri")), - ("sru", _(u"Suruí")), - ("srv", _(u"Southern Sorsoganon")), - ("srw", _(u"Serua")), - ("srx", _(u"Sirmauri")), - ("sry", _(u"Sera")), - ("srz", _(u"Shahmirzadi")), - ("ssa", _(u"Nilo-Saharan languages")), - ("ssb", _(u"Southern Sama")), - ("ssc", _(u"Suba-Simbiti")), - ("ssd", _(u"Siroi")), - ("sse", _(u"Balangingi")), - ("ssf", _(u"Thao")), - ("ssg", _(u"Seimat")), - ("ssh", _(u"Shihhi Arabic")), - ("ssi", _(u"Sansi")), - ("ssj", _(u"Sausi")), - ("ssk", _(u"Sunam")), - ("ssl", _(u"Western Sisaala")), - ("ssm", _(u"Semnam")), - ("ssn", _(u"Waata")), - ("sso", _(u"Sissano")), - ("ssp", _(u"Spanish Sign Language")), - ("ssq", _(u"So'a")), - ("ssr", _(u"Swiss-French Sign Language")), - ("sss", _(u"Sô")), - ("sst", _(u"Sinasina")), - ("ssu", _(u"Susuami")), - ("ssv", _(u"Shark Bay")), - ("ssx", _(u"Samberigi")), - ("ssy", _(u"Saho")), - ("ssz", _(u"Sengseng")), - ("sta", _(u"Settla")), - ("stb", _(u"Northern Subanen")), - ("std", _(u"Sentinel")), - ("ste", _(u"Liana-Seti")), - ("stf", _(u"Seta")), - ("stg", _(u"Trieng")), - ("sth", _(u"Shelta")), - ("sti", _(u"Bulo Stieng")), - ("stj", _(u"Matya Samo")), - ("stk", _(u"Arammba")), - ("stl", _(u"Stellingwerfs")), - ("stm", _(u"Setaman")), - ("stn", _(u"Owa")), - ("sto", _(u"Stoney")), - ("stp", _(u"Southeastern Tepehuan")), - ("stq", _(u"Saterfriesisch")), - ("str", _(u"Straits Salish")), - ("sts", _(u"Shumashti")), - ("stt", _(u"Budeh Stieng")), - ("stu", _(u"Samtao")), - ("stv", _(u"Silt'e")), - ("stw", _(u"Satawalese")), - ("sty", _(u"Siberian Tatar")), - ("sua", _(u"Sulka")), - ("sub", _(u"Suku")), - ("suc", _(u"Western Subanon")), - ("sue", _(u"Suena")), - ("sug", _(u"Suganga")), - ("sui", _(u"Suki")), - ("suj", _(u"Shubi")), - ("suk", _(u"Sukuma")), - ("sul", _(u"Surigaonon")), - ("sum", _(u"Sumo-Mayangna")), - ("suq", _(u"Suri")), - ("sur", _(u"Mwaghavul")), - ("sus", _(u"Susu")), - ("sut", _(u"Subtiaba")), - ("suv", _(u"Puroik")), - ("suw", _(u"Sumbwa")), - ("sux", _(u"Sumerian")), - ("suy", _(u"Suyá")), - ("suz", _(u"Sunwar")), - ("sva", _(u"Svan")), - ("svb", _(u"Ulau-Suain")), - ("svc", _(u"Vincentian Creole English")), - ("sve", _(u"Serili")), - ("svk", _(u"Slovakian Sign Language")), - ("svm", _(u"Slavomolisano")), - ("svr", _(u"Savara")), - ("svs", _(u"Savosavo")), - ("svx", _(u"Skalvian")), - ("swb", _(u"Maore Comorian")), - ("swc", _(u"Congo Swahili")), - ("swf", _(u"Sere")), - ("swg", _(u"Swabian")), - ("swh", _(u"Swahili")), - ("swi", _(u"Sui")), - ("swj", _(u"Sira")), - ("swk", _(u"Malawi Sena")), - ("swl", _(u"Swedish Sign Language")), - ("swm", _(u"Samosa")), - ("swn", _(u"Sawknah")), - ("swo", _(u"Shanenawa")), - ("swp", _(u"Suau")), - ("swq", _(u"Sharwa")), - ("swr", _(u"Saweru")), - ("sws", _(u"Seluwasan")), - ("swt", _(u"Sawila")), - ("swu", _(u"Suwawa")), - ("swv", _(u"Shekhawati")), - ("sww", _(u"Sowa")), - ("swx", _(u"Suruahá")), - ("swy", _(u"Sarua")), - ("sxb", _(u"Suba")), - ("sxc", _(u"Sicanian")), - ("sxe", _(u"Sighu")), - ("sxg", _(u"Shixing")), - ("sxk", _(u"Southern Kalapuya")), - ("sxl", _(u"Selian")), - ("sxm", _(u"Samre")), - ("sxn", _(u"Sangir")), - ("sxo", _(u"Sorothaptic")), - ("sxr", _(u"Saaroa")), - ("sxs", _(u"Sasaru")), - ("sxu", _(u"Upper Saxon")), - ("sxw", _(u"Saxwe Gbe")), - ("sya", _(u"Siang")), - ("syb", _(u"Central Subanen")), - ("syc", _(u"Classical Syriac")), - ("syd", _(u"Samoyedic languages")), - ("syi", _(u"Seki")), - ("syk", _(u"Sukur")), - ("syl", _(u"Sylheti")), - ("sym", _(u"Maya Samo")), - ("syn", _(u"Senaya")), - ("syo", _(u"Suoy")), - ("syr", _(u"Syriac")), - ("sys", _(u"Sinyar")), - ("syw", _(u"Kagate")), - ("syx", _(u"Samay")), - ("syy", _(u"Al-Sayyid Bedouin Sign Language")), - ("sza", _(u"Semelai")), - ("szb", _(u"Ngalum")), - ("szc", _(u"Semaq Beri")), - ("szd", _(u"Seru")), - ("sze", _(u"Seze")), - ("szg", _(u"Sengele")), - ("szl", _(u"Silesian")), - ("szn", _(u"Sula")), - ("szp", _(u"Suabo")), - ("szv", _(u"Isu")), - ("szw", _(u"Sawai")), - ("taa", _(u"Lower Tanana")), - ("tab", _(u"Tabassaran")), - ("tac", _(u"Lowland Tarahumara")), - ("tad", _(u"Tause")), - ("tae", _(u"Tariana")), - ("taf", _(u"Tapirapé")), - ("tag", _(u"Tagoi")), - ("tai", _(u"Tai languages")), - ("taj", _(u"Eastern Tamang")), - ("tak", _(u"Tala")), - ("tal", _(u"Tal")), - ("tan", _(u"Tangale")), - ("tao", _(u"Yami")), - ("tap", _(u"Taabwa")), - ("taq", _(u"Tamasheq")), - ("tar", _(u"Central Tarahumara")), - ("tas", _(u"Tay Boi")), - ("tau", _(u"Upper Tanana")), - ("tav", _(u"Tatuyo")), - ("taw", _(u"Tai")), - ("tax", _(u"Tamki")), - ("tay", _(u"Atayal")), - ("taz", _(u"Tocho")), - ("tba", _(u"Aikanã")), - ("tbb", _(u"Tapeba")), - ("tbc", _(u"Takia")), - ("tbd", _(u"Kaki Ae")), - ("tbe", _(u"Tanimbili")), - ("tbf", _(u"Mandara")), - ("tbg", _(u"North Tairora")), - ("tbh", _(u"Thurawal")), - ("tbi", _(u"Gaam")), - ("tbj", _(u"Tiang")), - ("tbk", _(u"Calamian Tagbanwa")), - ("tbl", _(u"Tboli")), - ("tbm", _(u"Tagbu")), - ("tbn", _(u"Barro Negro Tunebo")), - ("tbo", _(u"Tawala")), - ("tbp", _(u"Taworta")), - ("tbq", _(u"Tibeto-Burman languages")), - ("tbr", _(u"Tumtum")), - ("tbs", _(u"Tanguat")), - ("tbt", _(u"Tembo")), - ("tbu", _(u"Tubar")), - ("tbv", _(u"Tobo")), - ("tbw", _(u"Tagbanwa")), - ("tbx", _(u"Kapin")), - ("tby", _(u"Tabaru")), - ("tbz", _(u"Ditammari")), - ("tca", _(u"Ticuna")), - ("tcb", _(u"Tanacross")), - ("tcc", _(u"Datooga")), - ("tcd", _(u"Tafi")), - ("tce", _(u"Southern Tutchone")), - ("tcf", _(u"Malinaltepec Me'phaa")), - ("tcg", _(u"Tamagario")), - ("tch", _(u"Turks And Caicos Creole English")), - ("tci", _(u"Wára")), - ("tck", _(u"Tchitchege")), - ("tcl", _(u"Taman")), - ("tcm", _(u"Tanahmerah")), - ("tcn", _(u"Tichurong")), - ("tco", _(u"Taungyo")), - ("tcp", _(u"Tawr Chin")), - ("tcq", _(u"Kaiy")), - ("tcs", _(u"Torres Strait Creole")), - ("tct", _(u"T'en")), - ("tcu", _(u"Southeastern Tarahumara")), - ("tcw", _(u"Tecpatlán Totonac")), - ("tcx", _(u"Toda")), - ("tcy", _(u"Tulu")), - ("tcz", _(u"Thado Chin")), - ("tda", _(u"Tagdal")), - ("tdb", _(u"Panchpargania")), - ("tdc", _(u"Emberá-Tadó")), - ("tdd", _(u"Tai Nüa")), - ("tde", _(u"Tiranige Diga Dogon")), - ("tdf", _(u"Talieng")), - ("tdg", _(u"Western Tamang")), - ("tdh", _(u"Thulung")), - ("tdi", _(u"Tomadino")), - ("tdj", _(u"Tajio")), - ("tdk", _(u"Tambas")), - ("tdl", _(u"Sur")), - ("tdm", _(u"Taruma")), - ("tdn", _(u"Tondano")), - ("tdo", _(u"Teme")), - ("tdq", _(u"Tita")), - ("tdr", _(u"Todrah")), - ("tds", _(u"Doutai")), - ("tdt", _(u"Tetun Dili")), - ("tdu", _(u"Tempasuk Dusun")), - ("tdv", _(u"Toro")), - ("tdx", _(u"Tandroy-Mahafaly Malagasy")), - ("tdy", _(u"Tadyawan")), - ("tea", _(u"Temiar")), - ("teb", _(u"Tetete")), - ("tec", _(u"Terik")), - ("ted", _(u"Tepo Krumen")), - ("tee", _(u"Huehuetla Tepehua")), - ("tef", _(u"Teressa")), - ("teg", _(u"Teke-Tege")), - ("teh", _(u"Tehuelche")), - ("tei", _(u"Torricelli")), - ("tek", _(u"Ibali Teke")), - ("tem", _(u"Timne")), - ("ten", _(u"Tama")), - ("teo", _(u"Teso")), - ("tep", _(u"Tepecano")), - ("teq", _(u"Temein")), - ("ter", _(u"Tereno")), - ("tes", _(u"Tengger")), - ("tet", _(u"Tetum")), - ("teu", _(u"Soo")), - ("tev", _(u"Teor")), - ("tew", _(u"Tewa")), - ("tex", _(u"Tennet")), - ("tey", _(u"Tulishi")), - ("tfi", _(u"Tofin Gbe")), - ("tfn", _(u"Tanaina")), - ("tfo", _(u"Tefaro")), - ("tfr", _(u"Teribe")), - ("tft", _(u"Ternate")), - ("tga", _(u"Sagalla")), - ("tgb", _(u"Tobilung")), - ("tgc", _(u"Tigak")), - ("tgd", _(u"Ciwogai")), - ("tge", _(u"Eastern Gorkha Tamang")), - ("tgf", _(u"Chalikha")), - ("tgg", _(u"Tangga")), - ("tgh", _(u"Tobagonian Creole English")), - ("tgi", _(u"Lawunuia")), - ("tgj", _(u"Tagin")), - ("tgn", _(u"Tandaganon")), - ("tgo", _(u"Sudest")), - ("tgp", _(u"Tangoa")), - ("tgq", _(u"Tring")), - ("tgr", _(u"Tareng")), - ("tgs", _(u"Nume")), - ("tgt", _(u"Central Tagbanwa")), - ("tgu", _(u"Tanggu")), - ("tgv", _(u"Tingui-Boto")), - ("tgw", _(u"Tagwana Senoufo")), - ("tgx", _(u"Tagish")), - ("tgy", _(u"Togoyo")), - ("tgz", _(u"Tagalaka")), - ("thc", _(u"Tai Hang Tong")), - ("thd", _(u"Thayore")), - ("the", _(u"Chitwania Tharu")), - ("thf", _(u"Thangmi")), - ("thh", _(u"Northern Tarahumara")), - ("thi", _(u"Tai Long")), - ("thk", _(u"Tharaka")), - ("thl", _(u"Dangaura Tharu")), - ("thm", _(u"Aheu")), - ("thn", _(u"Thachanadan")), - ("thp", _(u"Thompson")), - ("thq", _(u"Kochila Tharu")), - ("thr", _(u"Rana Tharu")), - ("ths", _(u"Thakali")), - ("tht", _(u"Tahltan")), - ("thu", _(u"Thuri")), - ("thv", _(u"Tahaggart Tamahaq")), - ("thw", _(u"Thudam")), - ("thx", _(u"The")), - ("thy", _(u"Tha")), - ("thz", _(u"Tayart Tamajeq")), - ("tia", _(u"Tidikelt Tamazight")), - ("tic", _(u"Tira")), - ("tid", _(u"Tidong")), - ("tie", _(u"Tingal")), - ("tif", _(u"Tifal")), - ("tig", _(u"Tigre")), - ("tih", _(u"Timugon Murut")), - ("tii", _(u"Tiene")), - ("tij", _(u"Tilung")), - ("tik", _(u"Tikar")), - ("til", _(u"Tillamook")), - ("tim", _(u"Timbe")), - ("tin", _(u"Tindi")), - ("tio", _(u"Teop")), - ("tip", _(u"Trimuris")), - ("tiq", _(u"Tiéfo")), - ("tis", _(u"Masadiit Itneg")), - ("tit", _(u"Tinigua")), - ("tiu", _(u"Adasen")), - ("tiv", _(u"Tiv")), - ("tiw", _(u"Tiwi")), - ("tix", _(u"Southern Tiwa")), - ("tiy", _(u"Tiruray")), - ("tiz", _(u"Tai Hongjin")), - ("tja", _(u"Tajuasohn")), - ("tjg", _(u"Tunjung")), - ("tji", _(u"Northern Tujia")), - ("tjl", _(u"Tai Laing")), - ("tjm", _(u"Timucua")), - ("tjn", _(u"Tonjon")), - ("tjo", _(u"Temacine Tamazight")), - ("tjs", _(u"Southern Tujia")), - ("tju", _(u"Tjurruru")), - ("tjw", _(u"Djabwurrung")), - ("tka", _(u"Truká")), - ("tkb", _(u"Buksa")), - ("tkd", _(u"Tukudede")), - ("tke", _(u"Takwane")), - ("tkf", _(u"Tukumanféd")), - ("tkg", _(u"Tesaka Malagasy")), - ("tkk", _(u"Takpa")), - ("tkl", _(u"Tokelau")), - ("tkm", _(u"Takelma")), - ("tkn", _(u"Toku-No-Shima")), - ("tkp", _(u"Tikopia")), - ("tkq", _(u"Tee")), - ("tkr", _(u"Tsakhur")), - ("tks", _(u"Takestani")), - ("tkt", _(u"Kathoriya Tharu")), - ("tku", _(u"Upper Necaxa Totonac")), - ("tkv", _(u"Mur Pano")), - ("tkw", _(u"Teanu")), - ("tkx", _(u"Tangko")), - ("tkz", _(u"Takua")), - ("tla", _(u"Southwestern Tepehuan")), - ("tlb", _(u"Tobelo")), - ("tlc", _(u"Yecuatla Totonac")), - ("tld", _(u"Talaud")), - ("tlf", _(u"Telefol")), - ("tlg", _(u"Tofanma")), - ("tlh", _(u"Klingon")), - ("tli", _(u"Tlingit")), - ("tlj", _(u"Talinga-Bwisi")), - ("tlk", _(u"Taloki")), - ("tll", _(u"Tetela")), - ("tlm", _(u"Tolomako")), - ("tln", _(u"Talondo'")), - ("tlo", _(u"Talodi")), - ("tlp", _(u"Filomena Mata-Coahuitlán Totonac")), - ("tlq", _(u"Tai Loi")), - ("tlr", _(u"Talise")), - ("tls", _(u"Tambotalo")), - ("tlt", _(u"Sou Nama")), - ("tlu", _(u"Tulehu")), - ("tlv", _(u"Taliabu")), - ("tlw", _(u"South Wemale")), - ("tlx", _(u"Khehek")), - ("tly", _(u"Talysh")), - ("tma", _(u"Tama")), - ("tmb", _(u"Katbol")), - ("tmc", _(u"Tumak")), - ("tmd", _(u"Haruai")), - ("tme", _(u"Tremembé")), - ("tmf", _(u"Toba-Maskoy")), - ("tmg", _(u"Ternateño")), - ("tmh", _(u"Tamashek")), - ("tmi", _(u"Tutuba")), - ("tmj", _(u"Samarokena")), - ("tmk", _(u"Northwestern Tamang")), - ("tml", _(u"Tamnim Citak")), - ("tmm", _(u"Tai Thanh")), - ("tmn", _(u"Taman")), - ("tmo", _(u"Temoq")), - ("tmp", _(u"Tai Mène")), - ("tmq", _(u"Tumleo")), - ("tmr", _(u"Jewish Babylonian Aramaic")), - ("tms", _(u"Tima")), - ("tmt", _(u"Tasmate")), - ("tmu", _(u"Iau")), - ("tmv", _(u"Tembo")), - ("tmw", _(u"Temuan")), - ("tmy", _(u"Tami")), - ("tmz", _(u"Tamanaku")), - ("tna", _(u"Tacana")), - ("tnb", _(u"Western Tunebo")), - ("tnc", _(u"Tanimuca-Retuarã")), - ("tnd", _(u"Angosturas Tunebo")), - ("tne", _(u"Tinoc Kallahan")), - ("tnf", _(u"Tangshewi")), - ("tng", _(u"Tobanga")), - ("tnh", _(u"Maiani")), - ("tni", _(u"Tandia")), - ("tnk", _(u"Kwamera")), - ("tnl", _(u"Lenakel")), - ("tnm", _(u"Tabla")), - ("tnn", _(u"North Tanna")), - ("tno", _(u"Toromono")), - ("tnp", _(u"Whitesands")), - ("tnq", _(u"Taino")), - ("tnr", _(u"Ménik")), - ("tns", _(u"Tenis")), - ("tnt", _(u"Tontemboan")), - ("tnu", _(u"Tay Khang")), - ("tnv", _(u"Tangchangya")), - ("tnw", _(u"Tonsawang")), - ("tnx", _(u"Tanema")), - ("tny", _(u"Tongwe")), - ("tnz", _(u"Ten'edn")), - ("tob", _(u"Toba")), - ("toc", _(u"Coyutla Totonac")), - ("tod", _(u"Toma")), - ("toe", _(u"Tomedes")), - ("tof", _(u"Gizrra")), - ("tog", _(u"Tonga")), - ("toh", _(u"Gitonga")), - ("toi", _(u"Tonga")), - ("toj", _(u"Tojolabal")), - ("tol", _(u"Tolowa")), - ("tom", _(u"Tombulu")), - ("too", _(u"Xicotepec De Juárez Totonac")), - ("top", _(u"Papantla Totonac")), - ("toq", _(u"Toposa")), - ("tor", _(u"Togbo-Vara Banda")), - ("tos", _(u"Highland Totonac")), - ("tou", _(u"Tho")), - ("tov", _(u"Upper Taromi")), - ("tow", _(u"Jemez")), - ("tox", _(u"Tobian")), - ("toy", _(u"Topoiyo")), - ("toz", _(u"To")), - ("tpa", _(u"Taupota")), - ("tpc", _(u"Azoyú Me'phaa")), - ("tpe", _(u"Tippera")), - ("tpf", _(u"Tarpia")), - ("tpg", _(u"Kula")), - ("tpi", _(u"Tok Pisin")), - ("tpj", _(u"Tapieté")), - ("tpk", _(u"Tupinikin")), - ("tpl", _(u"Tlacoapa Me'phaa")), - ("tpm", _(u"Tampulma")), - ("tpn", _(u"Tupinambá")), - ("tpo", _(u"Tai Pao")), - ("tpp", _(u"Pisaflores Tepehua")), - ("tpq", _(u"Tukpa")), - ("tpr", _(u"Tuparí")), - ("tpt", _(u"Tlachichilco Tepehua")), - ("tpu", _(u"Tampuan")), - ("tpv", _(u"Tanapag")), - ("tpw", _(u"Tupí")), - ("tpx", _(u"Acatepec Me'phaa")), - ("tpy", _(u"Trumai")), - ("tpz", _(u"Tinputz")), - ("tqb", _(u"Tembé")), - ("tql", _(u"Lehali")), - ("tqm", _(u"Turumsa")), - ("tqn", _(u"Tenino")), - ("tqo", _(u"Toaripi")), - ("tqp", _(u"Tomoip")), - ("tqq", _(u"Tunni")), - ("tqr", _(u"Torona")), - ("tqt", _(u"Western Totonac")), - ("tqu", _(u"Touo")), - ("tqw", _(u"Tonkawa")), - ("tra", _(u"Tirahi")), - ("trb", _(u"Terebu")), - ("trc", _(u"Copala Triqui")), - ("trd", _(u"Turi")), - ("tre", _(u"East Tarangan")), - ("trf", _(u"Trinidadian Creole English")), - ("trg", _(u"Lishán Didán")), - ("trh", _(u"Turaka")), - ("tri", _(u"Trió")), - ("trj", _(u"Toram")), - ("trk", _(u"Turkic languages")), - ("trl", _(u"Traveller Scottish")), - ("trm", _(u"Tregami")), - ("trn", _(u"Trinitario")), - ("tro", _(u"Tarao Naga")), - ("trp", _(u"Kok Borok")), - ("trq", _(u"San Martín Itunyoso Triqui")), - ("trr", _(u"Taushiro")), - ("trs", _(u"Chicahuaxtla Triqui")), - ("trt", _(u"Tunggare")), - ("tru", _(u"Turoyo")), - ("trv", _(u"Taroko")), - ("trw", _(u"Torwali")), - ("trx", _(u"Tringgus-Sembaan Bidayuh")), - ("try", _(u"Turung")), - ("trz", _(u"Torá")), - ("tsa", _(u"Tsaangi")), - ("tsb", _(u"Tsamai")), - ("tsc", _(u"Tswa")), - ("tsd", _(u"Tsakonian")), - ("tse", _(u"Tunisian Sign Language")), - ("tsf", _(u"Southwestern Tamang")), - ("tsg", _(u"Tausug")), - ("tsh", _(u"Tsuvan")), - ("tsi", _(u"Tsimshian")), - ("tsj", _(u"Tshangla")), - ("tsk", _(u"Tseku")), - ("tsl", _(u"Ts'ün-Lao")), - ("tsm", _(u"Turkish Sign Language")), - ("tsp", _(u"Northern Toussian")), - ("tsq", _(u"Thai Sign Language")), - ("tsr", _(u"Akei")), - ("tss", _(u"Taiwan Sign Language")), - ("tst", _(u"Tondi Songway Kiini")), - ("tsu", _(u"Tsou")), - ("tsv", _(u"Tsogo")), - ("tsw", _(u"Tsishingini")), - ("tsx", _(u"Mubami")), - ("tsy", _(u"Tebul Sign Language")), - ("tsz", _(u"Purepecha")), - ("tta", _(u"Tutelo")), - ("ttb", _(u"Gaa")), - ("ttc", _(u"Tektiteko")), - ("ttd", _(u"Tauade")), - ("tte", _(u"Bwanabwana")), - ("ttf", _(u"Tuotomb")), - ("ttg", _(u"Tutong")), - ("tth", _(u"Upper Ta'oih")), - ("tti", _(u"Tobati")), - ("ttj", _(u"Tooro")), - ("ttk", _(u"Totoro")), - ("ttl", _(u"Totela")), - ("ttm", _(u"Northern Tutchone")), - ("ttn", _(u"Towei")), - ("tto", _(u"Lower Ta'oih")), - ("ttp", _(u"Tombelala")), - ("ttq", _(u"Tawallammat Tamajaq")), - ("ttr", _(u"Tera")), - ("tts", _(u"Northeastern Thai")), - ("ttt", _(u"Muslim Tat")), - ("ttu", _(u"Torau")), - ("ttv", _(u"Titan")), - ("ttw", _(u"Long Wat")), - ("tty", _(u"Sikaritai")), - ("ttz", _(u"Tsum")), - ("tua", _(u"Wiarumus")), - ("tub", _(u"Tübatulabal")), - ("tuc", _(u"Mutu")), - ("tud", _(u"Tuxá")), - ("tue", _(u"Tuyuca")), - ("tuf", _(u"Central Tunebo")), - ("tug", _(u"Tunia")), - ("tuh", _(u"Taulil")), - ("tui", _(u"Tupuri")), - ("tuj", _(u"Tugutil")), - ("tul", _(u"Tula")), - ("tum", _(u"Tumbuka")), - ("tun", _(u"Tunica")), - ("tuo", _(u"Tucano")), - ("tup", _(u"Tupi languages")), - ("tuq", _(u"Tedaga")), - ("tus", _(u"Tuscarora")), - ("tut", _(u"Altaic languages")), - ("tuu", _(u"Tututni")), - ("tuv", _(u"Turkana")), - ("tuw", _(u"Tungus languages")), - ("tux", _(u"Tuxináwa")), - ("tuy", _(u"Tugen")), - ("tuz", _(u"Turka")), - ("tva", _(u"Vaghua")), - ("tvd", _(u"Tsuvadi")), - ("tve", _(u"Te'un")), - ("tvk", _(u"Southeast Ambrym")), - ("tvl", _(u"Tuvalu")), - ("tvm", _(u"Tela-Masbuar")), - ("tvn", _(u"Tavoyan")), - ("tvo", _(u"Tidore")), - ("tvs", _(u"Taveta")), - ("tvt", _(u"Tutsa Naga")), - ("tvu", _(u"Tunen")), - ("tvw", _(u"Sedoa")), - ("tvy", _(u"Timor Pidgin")), - ("twa", _(u"Twana")), - ("twb", _(u"Western Tawbuid")), - ("twc", _(u"Teshenawa")), - ("twd", _(u"Twents")), - ("twe", _(u"Tewa")), - ("twf", _(u"Northern Tiwa")), - ("twg", _(u"Tereweng")), - ("twh", _(u"Tai Dón")), - ("twl", _(u"Tawara")), - ("twm", _(u"Tawang Monpa")), - ("twn", _(u"Twendi")), - ("two", _(u"Tswapong")), - ("twp", _(u"Ere")), - ("twq", _(u"Tasawaq")), - ("twr", _(u"Southwestern Tarahumara")), - ("twt", _(u"Turiwára")), - ("twu", _(u"Termanu")), - ("tww", _(u"Tuwari")), - ("twx", _(u"Tewe")), - ("twy", _(u"Tawoyan")), - ("txa", _(u"Tombonuo")), - ("txb", _(u"Tokharian B")), - ("txc", _(u"Tsetsaut")), - ("txe", _(u"Totoli")), - ("txg", _(u"Tangut")), - ("txh", _(u"Thracian")), - ("txi", _(u"Ikpeng")), - ("txj", _(u"Tarjumo")), - ("txm", _(u"Tomini")), - ("txn", _(u"West Tarangan")), - ("txo", _(u"Toto")), - ("txq", _(u"Tii")), - ("txr", _(u"Tartessian")), - ("txs", _(u"Tonsea")), - ("txt", _(u"Citak")), - ("txu", _(u"Kayapó")), - ("txx", _(u"Tatana")), - ("txy", _(u"Tanosy Malagasy")), - ("tya", _(u"Tauya")), - ("tye", _(u"Kyanga")), - ("tyh", _(u"O'du")), - ("tyi", _(u"Teke-Tsaayi")), - ("tyj", _(u"Tai Do")), - ("tyl", _(u"Thu Lao")), - ("tyn", _(u"Kombai")), - ("typ", _(u"Thaypan")), - ("tyr", _(u"Tai Daeng")), - ("tys", _(u"Tày Sa Pa")), - ("tyt", _(u"Tày Tac")), - ("tyu", _(u"Kua")), - ("tyv", _(u"Tuvinian")), - ("tyx", _(u"Teke-Tyee")), - ("tyz", _(u"Tày")), - ("tza", _(u"Tanzanian Sign Language")), - ("tzh", _(u"Tzeltal")), - ("tzj", _(u"Tz'utujil")), - ("tzl", _(u"Talossan")), - ("tzm", _(u"Central Atlas Tamazight")), - ("tzn", _(u"Tugun")), - ("tzo", _(u"Tzotzil")), - ("tzx", _(u"Tabriak")), - ("uam", _(u"Uamué")), - ("uan", _(u"Kuan")), - ("uar", _(u"Tairuma")), - ("uba", _(u"Ubang")), - ("ubi", _(u"Ubi")), - ("ubl", _(u"Buhi'non Bikol")), - ("ubr", _(u"Ubir")), - ("ubu", _(u"Umbu-Ungu")), - ("uby", _(u"Ubykh")), - ("uda", _(u"Uda")), - ("ude", _(u"Udihe")), - ("udg", _(u"Muduga")), - ("udi", _(u"Udi")), - ("udj", _(u"Ujir")), - ("udl", _(u"Wuzlam")), - ("udm", _(u"Udmurt")), - ("udu", _(u"Uduk")), - ("ues", _(u"Kioko")), - ("ufi", _(u"Ufim")), - ("uga", _(u"Ugaritic")), - ("ugb", _(u"Kuku-Ugbanh")), - ("uge", _(u"Ughele")), - ("ugn", _(u"Ugandan Sign Language")), - ("ugo", _(u"Ugong")), - ("ugy", _(u"Uruguayan Sign Language")), - ("uha", _(u"Uhami")), - ("uhn", _(u"Damal")), - ("uis", _(u"Uisai")), - ("uiv", _(u"Iyive")), - ("uji", _(u"Tanjijili")), - ("uka", _(u"Kaburi")), - ("ukg", _(u"Ukuriguma")), - ("ukh", _(u"Ukhwejo")), - ("ukl", _(u"Ukrainian Sign Language")), - ("ukp", _(u"Ukpe-Bayobiri")), - ("ukq", _(u"Ukwa")), - ("uks", _(u"Urubú-Kaapor Sign Language")), - ("uku", _(u"Ukue")), - ("ukw", _(u"Ukwuani-Aboh-Ndoni")), - ("uky", _(u"Kuuk-Yak")), - ("ula", _(u"Fungwa")), - ("ulb", _(u"Ulukwumi")), - ("ulc", _(u"Ulch")), - ("ule", _(u"Lule")), - ("ulf", _(u"Usku")), - ("uli", _(u"Ulithian")), - ("ulk", _(u"Meriam")), - ("ull", _(u"Ullatan")), - ("ulm", _(u"Ulumanda'")), - ("uln", _(u"Unserdeutsch")), - ("ulu", _(u"Uma' Lung")), - ("ulw", _(u"Ulwa")), - ("uma", _(u"Umatilla")), - ("umb", _(u"Umbundu")), - ("umc", _(u"Marrucinian")), - ("umd", _(u"Umbindhamu")), - ("umg", _(u"Umbuygamu")), - ("umi", _(u"Ukit")), - ("umm", _(u"Umon")), - ("umn", _(u"Makyan Naga")), - ("umo", _(u"Umotína")), - ("ump", _(u"Umpila")), - ("umr", _(u"Umbugarla")), - ("ums", _(u"Pendau")), - ("umu", _(u"Munsee")), - ("una", _(u"North Watut")), - ("und", _(u"Undetermined")), - ("une", _(u"Uneme")), - ("ung", _(u"Ngarinyin")), - ("unk", _(u"Enawené-Nawé")), - ("unm", _(u"Unami")), - ("unn", _(u"Kurnai")), - ("unp", _(u"Worora")), - ("unr", _(u"Mundari")), - ("unu", _(u"Unubahe")), - ("unx", _(u"Munda")), - ("unz", _(u"Unde Kaili")), - ("uok", _(u"Uokha")), - ("upi", _(u"Umeda")), - ("upv", _(u"Uripiv-Wala-Rano-Atchin")), - ("ura", _(u"Urarina")), - ("urb", _(u"Urubú-Kaapor")), - ("urc", _(u"Urningangg")), - ("ure", _(u"Uru")), - ("urf", _(u"Uradhi")), - ("urg", _(u"Urigina")), - ("urh", _(u"Urhobo")), - ("uri", _(u"Urim")), - ("urj", _(u"Uralic languages")), - ("urk", _(u"Urak Lawoi'")), - ("url", _(u"Urali")), - ("urm", _(u"Urapmin")), - ("urn", _(u"Uruangnirin")), - ("uro", _(u"Ura")), - ("urp", _(u"Uru-Pa-In")), - ("urr", _(u"Lehalurup")), - ("urt", _(u"Urat")), - ("uru", _(u"Urumi")), - ("urv", _(u"Uruava")), - ("urw", _(u"Sop")), - ("urx", _(u"Urimo")), - ("ury", _(u"Orya")), - ("urz", _(u"Uru-Eu-Wau-Wau")), - ("usa", _(u"Usarufa")), - ("ush", _(u"Ushojo")), - ("usi", _(u"Usui")), - ("usk", _(u"Usaghade")), - ("usp", _(u"Uspanteco")), - ("usu", _(u"Uya")), - ("uta", _(u"Otank")), - ("ute", _(u"Ute-Southern Paiute")), - ("utp", _(u"Amba")), - ("utr", _(u"Etulo")), - ("utu", _(u"Utu")), - ("uum", _(u"Urum")), - ("uun", _(u"Kulon-Pazeh")), - ("uur", _(u"Ura")), - ("uuu", _(u"U")), - ("uve", _(u"West Uvean")), - ("uvh", _(u"Uri")), - ("uvl", _(u"Lote")), - ("uwa", _(u"Kuku-Uwanh")), - ("uya", _(u"Doko-Uyanga")), - ("uzn", _(u"Northern Uzbek")), - ("uzs", _(u"Southern Uzbek")), - ("vaa", _(u"Vaagri Booli")), - ("vae", _(u"Vale")), - ("vaf", _(u"Vafsi")), - ("vag", _(u"Vagla")), - ("vah", _(u"Varhadi-Nagpuri")), - ("vai", _(u"Vai")), - ("vaj", _(u"Sekele")), - ("val", _(u"Vehes")), - ("vam", _(u"Vanimo")), - ("van", _(u"Valman")), - ("vao", _(u"Vao")), - ("vap", _(u"Vaiphei")), - ("var", _(u"Huarijio")), - ("vas", _(u"Vasavi")), - ("vau", _(u"Vanuma")), - ("vav", _(u"Varli")), - ("vay", _(u"Wayu")), - ("vbb", _(u"Southeast Babar")), - ("vbk", _(u"Southwestern Bontok")), - ("vec", _(u"Venetian")), - ("ved", _(u"Veddah")), - ("vel", _(u"Veluws")), - ("vem", _(u"Vemgo-Mabas")), - ("veo", _(u"Ventureño")), - ("vep", _(u"Veps")), - ("ver", _(u"Mom Jango")), - ("vgr", _(u"Vaghri")), - ("vgt", _(u"Vlaamse Gebarentaal")), - ("vic", _(u"Virgin Islands Creole English")), - ("vid", _(u"Vidunda")), - ("vif", _(u"Vili")), - ("vig", _(u"Viemo")), - ("vil", _(u"Vilela")), - ("vin", _(u"Vinza")), - ("vis", _(u"Vishavan")), - ("vit", _(u"Viti")), - ("viv", _(u"Iduna")), - ("vka", _(u"Kariyarra")), - ("vki", _(u"Ija-Zuba")), - ("vkj", _(u"Kujarge")), - ("vkk", _(u"Kaur")), - ("vkl", _(u"Kulisusu")), - ("vkm", _(u"Kamakan")), - ("vko", _(u"Kodeoha")), - ("vkp", _(u"Korlai Creole Portuguese")), - ("vkt", _(u"Tenggarong Kutai Malay")), - ("vku", _(u"Kurrama")), - ("vlp", _(u"Valpei")), - ("vls", _(u"Vlaams")), - ("vma", _(u"Martuyhunira")), - ("vmb", _(u"Barbaram")), - ("vmc", _(u"Juxtlahuaca Mixtec")), - ("vmd", _(u"Mudu Koraga")), - ("vme", _(u"East Masela")), - ("vmf", _(u"Mainfränkisch")), - ("vmg", _(u"Lungalunga")), - ("vmh", _(u"Maraghei")), - ("vmi", _(u"Miwa")), - ("vmj", _(u"Ixtayutla Mixtec")), - ("vmk", _(u"Makhuwa-Shirima")), - ("vml", _(u"Malgana")), - ("vmm", _(u"Mitlatongo Mixtec")), - ("vmp", _(u"Soyaltepec Mazatec")), - ("vmq", _(u"Soyaltepec Mixtec")), - ("vmr", _(u"Marenje")), - ("vms", _(u"Moksela")), - ("vmu", _(u"Muluridyi")), - ("vmv", _(u"Valley Maidu")), - ("vmw", _(u"Makhuwa")), - ("vmx", _(u"Tamazola Mixtec")), - ("vmy", _(u"Ayautla Mazatec")), - ("vmz", _(u"Mazatlán Mazatec")), - ("vnk", _(u"Vano")), - ("vnm", _(u"Vinmavis")), - ("vnp", _(u"Vunapu")), - ("vor", _(u"Voro")), - ("vot", _(u"Votic")), - ("vra", _(u"Vera'a")), - ("vro", _(u"Võro")), - ("vrs", _(u"Varisi")), - ("vrt", _(u"Burmbar")), - ("vsi", _(u"Moldova Sign Language")), - ("vsl", _(u"Venezuelan Sign Language")), - ("vsv", _(u"Valencian Sign Language")), - ("vto", _(u"Vitou")), - ("vum", _(u"Vumbu")), - ("vun", _(u"Vunjo")), - ("vut", _(u"Vute")), - ("vwa", _(u"Awa")), - ("waa", _(u"Walla Walla")), - ("wab", _(u"Wab")), - ("wac", _(u"Wasco-Wishram")), - ("wad", _(u"Wandamen")), - ("wae", _(u"Walser")), - ("waf", _(u"Wakoná")), - ("wag", _(u"Wa'ema")), - ("wah", _(u"Watubela")), - ("wai", _(u"Wares")), - ("waj", _(u"Waffa")), - ("wak", _(u"Wakashan languages")), - ("wal", _(u"Wolaytta")), - ("wam", _(u"Wampanoag")), - ("wan", _(u"Wan")), - ("wao", _(u"Wappo")), - ("wap", _(u"Wapishana")), - ("waq", _(u"Wageman")), - ("war", _(u"Waray")), - ("was", _(u"Washo")), - ("wat", _(u"Kaninuwa")), - ("wau", _(u"Waurá")), - ("wav", _(u"Waka")), - ("waw", _(u"Waiwai")), - ("wax", _(u"Watam")), - ("way", _(u"Wayana")), - ("waz", _(u"Wampur")), - ("wba", _(u"Warao")), - ("wbb", _(u"Wabo")), - ("wbe", _(u"Waritai")), - ("wbf", _(u"Wara")), - ("wbh", _(u"Wanda")), - ("wbi", _(u"Vwanji")), - ("wbj", _(u"Alagwa")), - ("wbk", _(u"Waigali")), - ("wbl", _(u"Wakhi")), - ("wbm", _(u"Wa")), - ("wbp", _(u"Warlpiri")), - ("wbq", _(u"Waddar")), - ("wbr", _(u"Wagdi")), - ("wbt", _(u"Wanman")), - ("wbv", _(u"Wajarri")), - ("wbw", _(u"Woi")), - ("wca", _(u"Yanomámi")), - ("wci", _(u"Waci Gbe")), - ("wdd", _(u"Wandji")), - ("wdg", _(u"Wadaginam")), - ("wdj", _(u"Wadjiginy")), - ("wdk", _(u"Wadikali")), - ("wdu", _(u"Wadjigu")), - ("wdy", _(u"Wadjabangayi")), - ("wea", _(u"Wewaw")), - ("wec", _(u"Wè Western")), - ("wed", _(u"Wedau")), - ("weg", _(u"Wergaia")), - ("weh", _(u"Weh")), - ("wei", _(u"Kiunum")), - ("wem", _(u"Weme Gbe")), - ("wen", _(u"Sorbian languages")), - ("weo", _(u"Wemale")), - ("wep", _(u"Westphalien")), - ("wer", _(u"Weri")), - ("wes", _(u"Cameroon Pidgin")), - ("wet", _(u"Perai")), - ("weu", _(u"Rawngtu Chin")), - ("wew", _(u"Wejewa")), - ("wfg", _(u"Yafi")), - ("wga", _(u"Wagaya")), - ("wgb", _(u"Wagawaga")), - ("wgg", _(u"Wangganguru")), - ("wgi", _(u"Wahgi")), - ("wgo", _(u"Waigeo")), - ("wgu", _(u"Wirangu")), - ("wgw", _(u"Wagawaga")), - ("wgy", _(u"Warrgamay")), - ("wha", _(u"Sou Upaa")), - ("whg", _(u"North Wahgi")), - ("whk", _(u"Wahau Kenyah")), - ("whu", _(u"Wahau Kayan")), - ("wib", _(u"Southern Toussian")), - ("wic", _(u"Wichita")), - ("wie", _(u"Wik-Epa")), - ("wif", _(u"Wik-Keyangan")), - ("wig", _(u"Wik-Ngathana")), - ("wih", _(u"Wik-Me'anha")), - ("wii", _(u"Minidien")), - ("wij", _(u"Wik-Iiyanh")), - ("wik", _(u"Wikalkan")), - ("wil", _(u"Wilawila")), - ("wim", _(u"Wik-Mungkan")), - ("win", _(u"Ho-Chunk")), - ("wir", _(u"Wiraféd")), - ("wit", _(u"Wintu")), - ("wiu", _(u"Wiru")), - ("wiv", _(u"Vitu")), - ("wiw", _(u"Wirangu")), - ("wiy", _(u"Wiyot")), - ("wja", _(u"Waja")), - ("wji", _(u"Warji")), - ("wka", _(u"Kw'adza")), - ("wkb", _(u"Kumbaran")), - ("wkd", _(u"Wakde")), - ("wkl", _(u"Kalanadi")), - ("wku", _(u"Kunduvadi")), - ("wkw", _(u"Wakawaka")), - ("wky", _(u"Wangkayutyuru")), - ("wla", _(u"Walio")), - ("wlc", _(u"Mwali Comorian")), - ("wle", _(u"Wolane")), - ("wlg", _(u"Kunbarlang")), - ("wli", _(u"Waioli")), - ("wlk", _(u"Wailaki")), - ("wll", _(u"Wali")), - ("wlm", _(u"Middle Welsh")), - ("wlo", _(u"Wolio")), - ("wlr", _(u"Wailapa")), - ("wls", _(u"Wallisian")), - ("wlu", _(u"Wuliwuli")), - ("wlv", _(u"Wichí Lhamtés Vejoz")), - ("wlw", _(u"Walak")), - ("wlx", _(u"Wali")), - ("wly", _(u"Waling")), - ("wma", _(u"Mawa")), - ("wmb", _(u"Wambaya")), - ("wmc", _(u"Wamas")), - ("wmd", _(u"Mamaindé")), - ("wme", _(u"Wambule")), - ("wmh", _(u"Waima'a")), - ("wmi", _(u"Wamin")), - ("wmm", _(u"Maiwa")), - ("wmn", _(u"Waamwang")), - ("wmo", _(u"Wom")), - ("wms", _(u"Wambon")), - ("wmt", _(u"Walmajarri")), - ("wmw", _(u"Mwani")), - ("wmx", _(u"Womo")), - ("wnb", _(u"Wanambre")), - ("wnc", _(u"Wantoat")), - ("wnd", _(u"Wandarang")), - ("wne", _(u"Waneci")), - ("wng", _(u"Wanggom")), - ("wni", _(u"Ndzwani Comorian")), - ("wnk", _(u"Wanukaka")), - ("wnm", _(u"Wanggamala")), - ("wnn", _(u"Wunumara")), - ("wno", _(u"Wano")), - ("wnp", _(u"Wanap")), - ("wnu", _(u"Usan")), - ("wnw", _(u"Wintu")), - ("wny", _(u"Wanyi")), - ("woa", _(u"Tyaraity")), - ("wob", _(u"Wè Northern")), - ("woc", _(u"Wogeo")), - ("wod", _(u"Wolani")), - ("woe", _(u"Woleaian")), - ("wof", _(u"Gambian Wolof")), - ("wog", _(u"Wogamusin")), - ("woi", _(u"Kamang")), - ("wok", _(u"Longto")), - ("wom", _(u"Wom")), - ("won", _(u"Wongo")), - ("woo", _(u"Manombai")), - ("wor", _(u"Woria")), - ("wos", _(u"Hanga Hundi")), - ("wow", _(u"Wawonii")), - ("woy", _(u"Weyto")), - ("wpc", _(u"Maco")), - ("wra", _(u"Warapu")), - ("wrb", _(u"Warluwara")), - ("wrd", _(u"Warduji")), - ("wrg", _(u"Warungu")), - ("wrh", _(u"Wiradhuri")), - ("wri", _(u"Wariyangga")), - ("wrk", _(u"Garrwa")), - ("wrl", _(u"Warlmanpa")), - ("wrm", _(u"Warumungu")), - ("wrn", _(u"Warnang")), - ("wro", _(u"Worrorra")), - ("wrp", _(u"Waropen")), - ("wrr", _(u"Wardaman")), - ("wrs", _(u"Waris")), - ("wru", _(u"Waru")), - ("wrv", _(u"Waruna")), - ("wrw", _(u"Gugu Warra")), - ("wrx", _(u"Wae Rana")), - ("wry", _(u"Merwari")), - ("wrz", _(u"Waray")), - ("wsa", _(u"Warembori")), - ("wsg", _(u"Adilabad Gondi")), - ("wsi", _(u"Wusi")), - ("wsk", _(u"Waskia")), - ("wsr", _(u"Owenia")), - ("wss", _(u"Wasa")), - ("wsu", _(u"Wasu")), - ("wsv", _(u"Wotapuri-Katarqalai")), - ("wtf", _(u"Watiwa")), - ("wth", _(u"Wathawurrung")), - ("wti", _(u"Berta")), - ("wtk", _(u"Watakataui")), - ("wtm", _(u"Mewati")), - ("wtw", _(u"Wotu")), - ("wua", _(u"Wikngenchera")), - ("wub", _(u"Wunambal")), - ("wud", _(u"Wudu")), - ("wuh", _(u"Wutunhua")), - ("wul", _(u"Silimo")), - ("wum", _(u"Wumbvu")), - ("wun", _(u"Bungu")), - ("wur", _(u"Wurrugu")), - ("wut", _(u"Wutung")), - ("wuu", _(u"Wu Chinese")), - ("wuv", _(u"Wuvulu-Aua")), - ("wux", _(u"Wulna")), - ("wuy", _(u"Wauyai")), - ("wwa", _(u"Waama")), - ("wwb", _(u"Wakabunga")), - ("wwo", _(u"Wetamut")), - ("wwr", _(u"Warrwa")), - ("www", _(u"Wawa")), - ("wxa", _(u"Waxianghua")), - ("wxw", _(u"Wardandi")), - ("wya", _(u"Wyandot")), - ("wyb", _(u"Wangaaybuwan-Ngiyambaa")), - ("wyi", _(u"Woiwurrung")), - ("wym", _(u"Wymysorys")), - ("wyr", _(u"Wayoró")), - ("wyy", _(u"Western Fijian")), - ("xaa", _(u"Andalusian Arabic")), - ("xab", _(u"Sambe")), - ("xac", _(u"Kachari")), - ("xad", _(u"Adai")), - ("xae", _(u"Aequian")), - ("xag", _(u"Aghwan")), - ("xai", _(u"Kaimbé")), - ("xaj", _(u"Ararandewára")), - ("xak", _(u"Máku")), - ("xal", _(u"Kalmyk")), - ("xam", _(u"/Xam")), - ("xan", _(u"Xamtanga")), - ("xao", _(u"Khao")), - ("xap", _(u"Apalachee")), - ("xaq", _(u"Aquitanian")), - ("xar", _(u"Karami")), - ("xas", _(u"Kamas")), - ("xat", _(u"Katawixi")), - ("xau", _(u"Kauwera")), - ("xav", _(u"Xavánte")), - ("xaw", _(u"Kawaiisu")), - ("xay", _(u"Kayan Mahakam")), - ("xba", _(u"Kamba")), - ("xbb", _(u"Lower Burdekin")), - ("xbc", _(u"Bactrian")), - ("xbd", _(u"Bindal")), - ("xbe", _(u"Bigambal")), - ("xbg", _(u"Bunganditj")), - ("xbi", _(u"Kombio")), - ("xbj", _(u"Birrpayi")), - ("xbm", _(u"Middle Breton")), - ("xbn", _(u"Kenaboi")), - ("xbo", _(u"Bolgarian")), - ("xbp", _(u"Bibbulman")), - ("xbr", _(u"Kambera")), - ("xbw", _(u"Kambiwá")), - ("xbx", _(u"Kabixí")), - ("xby", _(u"Batyala")), - ("xcb", _(u"Cumbric")), - ("xcc", _(u"Camunic")), - ("xce", _(u"Celtiberian")), - ("xcg", _(u"Cisalpine Gaulish")), - ("xch", _(u"Chemakum")), - ("xcl", _(u"Classical Armenian")), - ("xcm", _(u"Comecrudo")), - ("xcn", _(u"Cotoname")), - ("xco", _(u"Chorasmian")), - ("xcr", _(u"Carian")), - ("xct", _(u"Classical Tibetan")), - ("xcu", _(u"Curonian")), - ("xcv", _(u"Chuvantsy")), - ("xcw", _(u"Coahuilteco")), - ("xcy", _(u"Cayuse")), - ("xda", _(u"Darkinyung")), - ("xdc", _(u"Dacian")), - ("xdk", _(u"Dharuk")), - ("xdm", _(u"Edomite")), - ("xdy", _(u"Malayic Dayak")), - ("xeb", _(u"Eblan")), - ("xed", _(u"Hdi")), - ("xeg", _(u"//Xegwi")), - ("xel", _(u"Kelo")), - ("xem", _(u"Kembayan")), - ("xep", _(u"Epi-Olmec")), - ("xer", _(u"Xerénte")), - ("xes", _(u"Kesawai")), - ("xet", _(u"Xetá")), - ("xeu", _(u"Keoru-Ahia")), - ("xfa", _(u"Faliscan")), - ("xga", _(u"Galatian")), - ("xgb", _(u"Gbin")), - ("xgd", _(u"Gudang")), - ("xgf", _(u"Gabrielino-Fernandeño")), - ("xgg", _(u"Goreng")), - ("xgi", _(u"Garingbal")), - ("xgl", _(u"Galindan")), - ("xgm", _(u"Dharumbal")), - ("xgn", _(u"Mongolian languages")), - ("xgr", _(u"Garza")), - ("xgu", _(u"Unggumi")), - ("xgw", _(u"Guwa")), - ("xha", _(u"Harami")), - ("xhc", _(u"Hunnic")), - ("xhd", _(u"Hadrami")), - ("xhe", _(u"Khetrani")), - ("xhr", _(u"Hernican")), - ("xht", _(u"Hattic")), - ("xhu", _(u"Hurrian")), - ("xhv", _(u"Khua")), - ("xia", _(u"Xiandao")), - ("xib", _(u"Iberian")), - ("xii", _(u"Xiri")), - ("xil", _(u"Illyrian")), - ("xin", _(u"Xinca")), - ("xip", _(u"Xipináwa")), - ("xir", _(u"Xiriâna")), - ("xis", _(u"Kisan")), - ("xiv", _(u"Indus Valley Language")), - ("xiy", _(u"Xipaya")), - ("xjb", _(u"Minjungbal")), - ("xjt", _(u"Jaitmatang")), - ("xka", _(u"Kalkoti")), - ("xkb", _(u"Northern Nago")), - ("xkc", _(u"Kho'ini")), - ("xkd", _(u"Mendalam Kayan")), - ("xke", _(u"Kereho")), - ("xkf", _(u"Khengkha")), - ("xkg", _(u"Kagoro")), - ("xkh", _(u"Karahawyana")), - ("xki", _(u"Kenyan Sign Language")), - ("xkj", _(u"Kajali")), - ("xkk", _(u"Kaco'")), - ("xkl", _(u"Mainstream Kenyah")), - ("xkn", _(u"Kayan River Kayan")), - ("xko", _(u"Kiorr")), - ("xkp", _(u"Kabatei")), - ("xkq", _(u"Koroni")), - ("xkr", _(u"Xakriabá")), - ("xks", _(u"Kumbewaha")), - ("xkt", _(u"Kantosi")), - ("xku", _(u"Kaamba")), - ("xkv", _(u"Kgalagadi")), - ("xkw", _(u"Kembra")), - ("xkx", _(u"Karore")), - ("xky", _(u"Uma' Lasan")), - ("xkz", _(u"Kurtokha")), - ("xla", _(u"Kamula")), - ("xlb", _(u"Loup B")), - ("xlc", _(u"Lycian")), - ("xld", _(u"Lydian")), - ("xle", _(u"Lemnian")), - ("xlg", _(u"Ligurian")), - ("xli", _(u"Liburnian")), - ("xln", _(u"Alanic")), - ("xlo", _(u"Loup A")), - ("xlp", _(u"Lepontic")), - ("xls", _(u"Lusitanian")), - ("xlu", _(u"Cuneiform Luwian")), - ("xly", _(u"Elymian")), - ("xma", _(u"Mushungulu")), - ("xmb", _(u"Mbonga")), - ("xmc", _(u"Makhuwa-Marrevone")), - ("xmd", _(u"Mbudum")), - ("xme", _(u"Median")), - ("xmf", _(u"Mingrelian")), - ("xmg", _(u"Mengaka")), - ("xmh", _(u"Kuku-Muminh")), - ("xmj", _(u"Majera")), - ("xmk", _(u"Ancient Macedonian")), - ("xml", _(u"Malaysian Sign Language")), - ("xmm", _(u"Manado Malay")), - ("xmn", _(u"Manichaean Middle Persian")), - ("xmo", _(u"Morerebi")), - ("xmp", _(u"Kuku-Mu'inh")), - ("xmq", _(u"Kuku-Mangk")), - ("xmr", _(u"Meroitic")), - ("xms", _(u"Moroccan Sign Language")), - ("xmt", _(u"Matbat")), - ("xmu", _(u"Kamu")), - ("xmv", _(u"Antankarana Malagasy")), - ("xmw", _(u"Tsimihety Malagasy")), - ("xmx", _(u"Maden")), - ("xmy", _(u"Mayaguduna")), - ("xmz", _(u"Mori Bawah")), - ("xna", _(u"Ancient North Arabian")), - ("xnb", _(u"Kanakanabu")), - ("xnd", _(u"Na-Dene languages")), - ("xng", _(u"Middle Mongolian")), - ("xnh", _(u"Kuanhua")), - ("xni", _(u"Ngarigu")), - ("xnk", _(u"Nganakarti")), - ("xnn", _(u"Northern Kankanay")), - ("xno", _(u"Anglo-Norman")), - ("xnr", _(u"Kangri")), - ("xns", _(u"Kanashi")), - ("xnt", _(u"Narragansett")), - ("xnu", _(u"Nukunul")), - ("xny", _(u"Nyiyaparli")), - ("xnz", _(u"Kenzi")), - ("xoc", _(u"O'chi'chi'")), - ("xod", _(u"Kokoda")), - ("xog", _(u"Soga")), - ("xoi", _(u"Kominimung")), - ("xok", _(u"Xokleng")), - ("xom", _(u"Komo")), - ("xon", _(u"Konkomba")), - ("xoo", _(u"Xukurú")), - ("xop", _(u"Kopar")), - ("xor", _(u"Korubo")), - ("xow", _(u"Kowaki")), - ("xpa", _(u"Pirriya")), - ("xpc", _(u"Pecheneg")), - ("xpe", _(u"Liberia Kpelle")), - ("xpg", _(u"Phrygian")), - ("xpi", _(u"Pictish")), - ("xpj", _(u"Mpalitjanh")), - ("xpk", _(u"Kulina Pano")), - ("xpm", _(u"Pumpokol")), - ("xpn", _(u"Kapinawá")), - ("xpo", _(u"Pochutec")), - ("xpp", _(u"Puyo-Paekche")), - ("xpq", _(u"Mohegan-Pequot")), - ("xpr", _(u"Parthian")), - ("xps", _(u"Pisidian")), - ("xpt", _(u"Punthamara")), - ("xpu", _(u"Punic")), - ("xpy", _(u"Puyo")), - ("xqa", _(u"Karakhanid")), - ("xqt", _(u"Qatabanian")), - ("xra", _(u"Krahô")), - ("xrb", _(u"Eastern Karaboro")), - ("xrd", _(u"Gundungurra")), - ("xre", _(u"Kreye")), - ("xrg", _(u"Minang")), - ("xri", _(u"Krikati-Timbira")), - ("xrm", _(u"Armazic")), - ("xrn", _(u"Arin")), - ("xrq", _(u"Karranga")), - ("xrr", _(u"Raetic")), - ("xrt", _(u"Aranama-Tamique")), - ("xru", _(u"Marriammu")), - ("xrw", _(u"Karawa")), - ("xsa", _(u"Sabaean")), - ("xsb", _(u"Sambal")), - ("xsc", _(u"Scythian")), - ("xsd", _(u"Sidetic")), - ("xse", _(u"Sempan")), - ("xsh", _(u"Shamang")), - ("xsi", _(u"Sio")), - ("xsj", _(u"Subi")), - ("xsl", _(u"South Slavey")), - ("xsm", _(u"Kasem")), - ("xsn", _(u"Sanga")), - ("xso", _(u"Solano")), - ("xsp", _(u"Silopi")), - ("xsq", _(u"Makhuwa-Saka")), - ("xsr", _(u"Sherpa")), - ("xss", _(u"Assan")), - ("xsu", _(u"Sanumá")), - ("xsv", _(u"Sudovian")), - ("xsy", _(u"Saisiyat")), - ("xta", _(u"Alcozauca Mixtec")), - ("xtb", _(u"Chazumba Mixtec")), - ("xtc", _(u"Katcha-Kadugli-Miri")), - ("xtd", _(u"Diuxi-Tilantongo Mixtec")), - ("xte", _(u"Ketengban")), - ("xtg", _(u"Transalpine Gaulish")), - ("xth", _(u"Yitha Yitha")), - ("xti", _(u"Sinicahua Mixtec")), - ("xtj", _(u"San Juan Teita Mixtec")), - ("xtl", _(u"Tijaltepec Mixtec")), - ("xtm", _(u"Magdalena Peñasco Mixtec")), - ("xtn", _(u"Northern Tlaxiaco Mixtec")), - ("xto", _(u"Tokharian A")), - ("xtp", _(u"San Miguel Piedras Mixtec")), - ("xtq", _(u"Tumshuqese")), - ("xtr", _(u"Early Tripuri")), - ("xts", _(u"Sindihui Mixtec")), - ("xtt", _(u"Tacahua Mixtec")), - ("xtu", _(u"Cuyamecalco Mixtec")), - ("xtv", _(u"Thawa")), - ("xtw", _(u"Tawandê")), - ("xty", _(u"Yoloxochitl Mixtec")), - ("xtz", _(u"Tasmanian")), - ("xua", _(u"Alu Kurumba")), - ("xub", _(u"Betta Kurumba")), - ("xud", _(u"Umiida")), - ("xug", _(u"Kunigami")), - ("xuj", _(u"Jennu Kurumba")), - ("xul", _(u"Ngunawal")), - ("xum", _(u"Umbrian")), - ("xun", _(u"Unggaranggu")), - ("xuo", _(u"Kuo")), - ("xup", _(u"Upper Umpqua")), - ("xur", _(u"Urartian")), - ("xut", _(u"Kuthant")), - ("xuu", _(u"Kxoe")), - ("xve", _(u"Venetic")), - ("xvi", _(u"Kamviri")), - ("xvn", _(u"Vandalic")), - ("xvo", _(u"Volscian")), - ("xvs", _(u"Vestinian")), - ("xwa", _(u"Kwaza")), - ("xwc", _(u"Woccon")), - ("xwd", _(u"Wadi Wadi")), - ("xwe", _(u"Xwela Gbe")), - ("xwg", _(u"Kwegu")), - ("xwj", _(u"Wajuk")), - ("xwk", _(u"Wangkumara")), - ("xwl", _(u"Western Xwla Gbe")), - ("xwo", _(u"Written Oirat")), - ("xwr", _(u"Kwerba Mamberamo")), - ("xwt", _(u"Wotjobaluk")), - ("xww", _(u"Wemba Wemba")), - ("xxb", _(u"Boro")), - ("xxk", _(u"Ke'o")), - ("xxm", _(u"Minkin")), - ("xxr", _(u"Koropó")), - ("xxt", _(u"Tambora")), - ("xya", _(u"Yaygir")), - ("xyb", _(u"Yandjibara")), - ("xyj", _(u"Mayi-Yapi")), - ("xyk", _(u"Mayi-Kulan")), - ("xyl", _(u"Yalakalore")), - ("xyt", _(u"Mayi-Thakurti")), - ("xyy", _(u"Yorta Yorta")), - ("xzh", _(u"Zhang-Zhung")), - ("xzm", _(u"Zemgalian")), - ("xzp", _(u"Ancient Zapotec")), - ("yaa", _(u"Yaminahua")), - ("yab", _(u"Yuhup")), - ("yac", _(u"Pass Valley Yali")), - ("yad", _(u"Yagua")), - ("yae", _(u"Pumé")), - ("yaf", _(u"Yaka")), - ("yag", _(u"Yámana")), - ("yah", _(u"Yazgulyam")), - ("yai", _(u"Yagnobi")), - ("yaj", _(u"Banda-Yangere")), - ("yak", _(u"Yakama")), - ("yal", _(u"Yalunka")), - ("yam", _(u"Yamba")), - ("yan", _(u"Mayangna")), - ("yao", _(u"Yao")), - ("yap", _(u"Yapese")), - ("yaq", _(u"Yaqui")), - ("yar", _(u"Yabarana")), - ("yas", _(u"Nugunu")), - ("yat", _(u"Yambeta")), - ("yau", _(u"Yuwana")), - ("yav", _(u"Yangben")), - ("yaw", _(u"Yawalapití")), - ("yax", _(u"Yauma")), - ("yay", _(u"Agwagwune")), - ("yaz", _(u"Lokaa")), - ("yba", _(u"Yala")), - ("ybb", _(u"Yemba")), - ("ybd", _(u"Yangbye")), - ("ybe", _(u"West Yugur")), - ("ybh", _(u"Yakha")), - ("ybi", _(u"Yamphu")), - ("ybj", _(u"Hasha")), - ("ybk", _(u"Bokha")), - ("ybl", _(u"Yukuben")), - ("ybm", _(u"Yaben")), - ("ybn", _(u"Yabaâna")), - ("ybo", _(u"Yabong")), - ("ybx", _(u"Yawiyo")), - ("yby", _(u"Yaweyuha")), - ("ych", _(u"Chesu")), - ("ycl", _(u"Lolopo")), - ("ycn", _(u"Yucuna")), - ("ycp", _(u"Chepya")), - ("yda", _(u"Yanda")), - ("ydd", _(u"Eastern Yiddish")), - ("yde", _(u"Yangum Dey")), - ("ydg", _(u"Yidgha")), - ("ydk", _(u"Yoidik")), - ("yds", _(u"Yiddish Sign Language")), - ("yea", _(u"Ravula")), - ("yec", _(u"Yeniche")), - ("yee", _(u"Yimas")), - ("yei", _(u"Yeni")), - ("yej", _(u"Yevanic")), - ("yel", _(u"Yela")), - ("yen", _(u"Yendang")), - ("yer", _(u"Tarok")), - ("yes", _(u"Nyankpa")), - ("yet", _(u"Yetfa")), - ("yeu", _(u"Yerukula")), - ("yev", _(u"Yapunda")), - ("yey", _(u"Yeyi")), - ("yga", _(u"Malyangapa")), - ("ygi", _(u"Yiningayi")), - ("ygl", _(u"Yangum Gel")), - ("ygm", _(u"Yagomi")), - ("ygp", _(u"Gepo")), - ("ygr", _(u"Yagaria")), - ("ygs", _(u"Yolŋu Sign Language")), - ("ygu", _(u"Yugul")), - ("ygw", _(u"Yagwoia")), - ("yha", _(u"Baha Buyang")), - ("yhd", _(u"Judeo-Iraqi Arabic")), - ("yhl", _(u"Hlepho Phowa")), - ("yhs", _(u"Yan-nhaŋu Sign Language")), - ("yia", _(u"Yinggarda")), - ("yif", _(u"Ache")), - ("yig", _(u"Wusa Nasu")), - ("yih", _(u"Western Yiddish")), - ("yii", _(u"Yidiny")), - ("yij", _(u"Yindjibarndi")), - ("yik", _(u"Dongshanba Lalo")), - ("yil", _(u"Yindjilandji")), - ("yim", _(u"Yimchungru Naga")), - ("yin", _(u"Yinchia")), - ("yip", _(u"Pholo")), - ("yiq", _(u"Miqie")), - ("yir", _(u"North Awyu")), - ("yis", _(u"Yis")), - ("yit", _(u"Eastern Lalu")), - ("yiu", _(u"Awu")), - ("yiv", _(u"Northern Nisu")), - ("yix", _(u"Axi Yi")), - ("yiy", _(u"Yir Yoront")), - ("yiz", _(u"Azhe")), - ("yka", _(u"Yakan")), - ("ykg", _(u"Northern Yukaghir")), - ("yki", _(u"Yoke")), - ("ykk", _(u"Yakaikeke")), - ("ykl", _(u"Khlula")), - ("ykm", _(u"Kap")), - ("ykn", _(u"Kua-nsi")), - ("yko", _(u"Yasa")), - ("ykr", _(u"Yekora")), - ("ykt", _(u"Kathu")), - ("yku", _(u"Kuamasi")), - ("yky", _(u"Yakoma")), - ("yla", _(u"Yaul")), - ("ylb", _(u"Yaleba")), - ("yle", _(u"Yele")), - ("ylg", _(u"Yelogu")), - ("yli", _(u"Angguruk Yali")), - ("yll", _(u"Yil")), - ("ylm", _(u"Limi")), - ("yln", _(u"Langnian Buyang")), - ("ylo", _(u"Naluo Yi")), - ("ylr", _(u"Yalarnnga")), - ("ylu", _(u"Aribwaung")), - ("yly", _(u"Nyâlayu")), - ("yma", _(u"Yamphe")), - ("ymb", _(u"Yambes")), - ("ymc", _(u"Southern Muji")), - ("ymd", _(u"Muda")), - ("yme", _(u"Yameo")), - ("ymg", _(u"Yamongeri")), - ("ymh", _(u"Mili")), - ("ymi", _(u"Moji")), - ("ymk", _(u"Makwe")), - ("yml", _(u"Iamalele")), - ("ymm", _(u"Maay")), - ("ymn", _(u"Yamna")), - ("ymo", _(u"Yangum Mon")), - ("ymp", _(u"Yamap")), - ("ymq", _(u"Qila Muji")), - ("ymr", _(u"Malasar")), - ("yms", _(u"Mysian")), - ("ymt", _(u"Mator-Taygi-Karagas")), - ("ymx", _(u"Northern Muji")), - ("ymz", _(u"Muzi")), - ("yna", _(u"Aluo")), - ("ynd", _(u"Yandruwandha")), - ("yne", _(u"Lang'e")), - ("yng", _(u"Yango")), - ("ynh", _(u"Yangho")), - ("ynk", _(u"Naukan Yupik")), - ("ynl", _(u"Yangulam")), - ("ynn", _(u"Yana")), - ("yno", _(u"Yong")), - ("ynq", _(u"Yendang")), - ("yns", _(u"Yansi")), - ("ynu", _(u"Yahuna")), - ("yob", _(u"Yoba")), - ("yog", _(u"Yogad")), - ("yoi", _(u"Yonaguni")), - ("yok", _(u"Yokuts")), - ("yol", _(u"Yola")), - ("yom", _(u"Yombe")), - ("yon", _(u"Yongkom")), - ("yos", _(u"Yos")), - ("yot", _(u"Yotti")), - ("yox", _(u"Yoron")), - ("yoy", _(u"Yoy")), - ("ypa", _(u"Phala")), - ("ypb", _(u"Labo Phowa")), - ("ypg", _(u"Phola")), - ("yph", _(u"Phupha")), - ("ypk", _(u"Yupik languages")), - ("ypm", _(u"Phuma")), - ("ypn", _(u"Ani Phowa")), - ("ypo", _(u"Alo Phola")), - ("ypp", _(u"Phupa")), - ("ypz", _(u"Phuza")), - ("yra", _(u"Yerakai")), - ("yrb", _(u"Yareba")), - ("yre", _(u"Yaouré")), - ("yri", _(u"Yarí")), - ("yrk", _(u"Nenets")), - ("yrl", _(u"Nhengatu")), - ("yrm", _(u"Yirrk-Mel")), - ("yrn", _(u"Yerong")), - ("yro", _(u"Yaroamë")), - ("yrs", _(u"Yarsun")), - ("yrw", _(u"Yarawata")), - ("yry", _(u"Yarluyandi")), - ("ysc", _(u"Yassic")), - ("ysd", _(u"Samatao")), - ("ysg", _(u"Sonaga")), - ("ysl", _(u"Yugoslavian Sign Language")), - ("ysn", _(u"Sani")), - ("yso", _(u"Nisi")), - ("ysp", _(u"Southern Lolopo")), - ("ysr", _(u"Sirenik Yupik")), - ("yss", _(u"Yessan-Mayo")), - ("ysy", _(u"Sanie")), - ("yta", _(u"Talu")), - ("ytl", _(u"Tanglang")), - ("ytp", _(u"Thopho")), - ("ytw", _(u"Yout Wam")), - ("yty", _(u"Yatay")), - ("yua", _(u"Yucateco")), - ("yub", _(u"Yugambal")), - ("yuc", _(u"Yuchi")), - ("yud", _(u"Judeo-Tripolitanian Arabic")), - ("yue", _(u"Yue Chinese")), - ("yuf", _(u"Havasupai-Walapai-Yavapai")), - ("yug", _(u"Yug")), - ("yui", _(u"Yurutí")), - ("yuj", _(u"Karkar-Yuri")), - ("yuk", _(u"Yuki")), - ("yul", _(u"Yulu")), - ("yum", _(u"Quechan")), - ("yun", _(u"Bena")), - ("yup", _(u"Yukpa")), - ("yuq", _(u"Yuqui")), - ("yur", _(u"Yurok")), - ("yut", _(u"Yopno")), - ("yuu", _(u"Yugh")), - ("yuw", _(u"Yau")), - ("yux", _(u"Southern Yukaghir")), - ("yuy", _(u"East Yugur")), - ("yuz", _(u"Yuracare")), - ("yva", _(u"Yawa")), - ("yvt", _(u"Yavitero")), - ("ywa", _(u"Kalou")), - ("ywg", _(u"Yinhawangka")), - ("ywl", _(u"Western Lalu")), - ("ywn", _(u"Yawanawa")), - ("ywq", _(u"Wuding-Luquan Yi")), - ("ywr", _(u"Yawuru")), - ("ywt", _(u"Xishanba Lalo")), - ("ywu", _(u"Wumeng Nasu")), - ("yww", _(u"Yawarawarga")), - ("yxa", _(u"Mayawali")), - ("yxg", _(u"Yagara")), - ("yxl", _(u"Yardliyawarra")), - ("yxm", _(u"Yinwum")), - ("yxu", _(u"Yuyu")), - ("yxy", _(u"Yabula Yabula")), - ("yyr", _(u"Yir Yoront")), - ("yyu", _(u"Yau")), - ("yyz", _(u"Ayizi")), - ("yzg", _(u"E'ma Buyang")), - ("yzk", _(u"Zokhuo")), - ("zaa", _(u"Sierra de Juárez Zapotec")), - ("zab", _(u"Western Tlacolula Valley Zapotec")), - ("zac", _(u"Ocotlán Zapotec")), - ("zad", _(u"Cajonos Zapotec")), - ("zae", _(u"Yareni Zapotec")), - ("zaf", _(u"Ayoquesco Zapotec")), - ("zag", _(u"Zaghawa")), - ("zah", _(u"Zangwal")), - ("zai", _(u"Isthmus Zapotec")), - ("zaj", _(u"Zaramo")), - ("zak", _(u"Zanaki")), - ("zal", _(u"Zauzou")), - ("zam", _(u"Miahuatlán Zapotec")), - ("zao", _(u"Ozolotepec Zapotec")), - ("zap", _(u"Zapotec")), - ("zaq", _(u"Aloápam Zapotec")), - ("zar", _(u"Rincón Zapotec")), - ("zas", _(u"Santo Domingo Albarradas Zapotec")), - ("zat", _(u"Tabaa Zapotec")), - ("zau", _(u"Zangskari")), - ("zav", _(u"Yatzachi Zapotec")), - ("zaw", _(u"Mitla Zapotec")), - ("zax", _(u"Xadani Zapotec")), - ("zay", _(u"Zayse-Zergulla")), - ("zaz", _(u"Zari")), - ("zbc", _(u"Central Berawan")), - ("zbe", _(u"East Berawan")), - ("zbl", _(u"Blissymbols")), - ("zbt", _(u"Batui")), - ("zbw", _(u"West Berawan")), - ("zca", _(u"Coatecas Altas Zapotec")), - ("zch", _(u"Central Hongshuihe Zhuang")), - ("zdj", _(u"Ngazidja Comorian")), - ("zea", _(u"Zeeuws")), - ("zeg", _(u"Zenag")), - ("zeh", _(u"Eastern Hongshuihe Zhuang")), - ("zen", _(u"Zenaga")), - ("zga", _(u"Kinga")), - ("zgb", _(u"Guibei Zhuang")), - ("zgh", _(u"Standard Moroccan Tamazight")), - ("zgm", _(u"Minz Zhuang")), - ("zgn", _(u"Guibian Zhuang")), - ("zgr", _(u"Magori")), - ("zhb", _(u"Zhaba")), - ("zhd", _(u"Dai Zhuang")), - ("zhi", _(u"Zhire")), - ("zhn", _(u"Nong Zhuang")), - ("zhw", _(u"Zhoa")), - ("zhx", _(u"Chinese")), - ("zia", _(u"Zia")), - ("zib", _(u"Zimbabwe Sign Language")), - ("zik", _(u"Zimakani")), - ("zil", _(u"Zialo")), - ("zim", _(u"Mesme")), - ("zin", _(u"Zinza")), - ("zir", _(u"Ziriya")), - ("ziw", _(u"Zigula")), - ("ziz", _(u"Zizilivakan")), - ("zka", _(u"Kaimbulawa")), - ("zkb", _(u"Koibal")), - ("zkd", _(u"Kadu")), - ("zkg", _(u"Koguryo")), - ("zkh", _(u"Khorezmian")), - ("zkk", _(u"Karankawa")), - ("zkn", _(u"Kanan")), - ("zko", _(u"Kott")), - ("zkp", _(u"São Paulo Kaingáng")), - ("zkr", _(u"Zakhring")), - ("zkt", _(u"Kitan")), - ("zku", _(u"Kaurna")), - ("zkv", _(u"Krevinian")), - ("zkz", _(u"Khazar")), - ("zle", _(u"East Slavic languages")), - ("zlj", _(u"Liujiang Zhuang")), - ("zlm", _(u"Malay")), - ("zln", _(u"Lianshan Zhuang")), - ("zlq", _(u"Liuqian Zhuang")), - ("zls", _(u"South Slavic languages")), - ("zlw", _(u"West Slavic languages")), - ("zma", _(u"Manda")), - ("zmb", _(u"Zimba")), - ("zmc", _(u"Margany")), - ("zmd", _(u"Maridan")), - ("zme", _(u"Mangerr")), - ("zmf", _(u"Mfinu")), - ("zmg", _(u"Marti Ke")), - ("zmh", _(u"Makolkol")), - ("zmi", _(u"Negeri Sembilan Malay")), - ("zmj", _(u"Maridjabin")), - ("zmk", _(u"Mandandanyi")), - ("zml", _(u"Madngele")), - ("zmm", _(u"Marimanindji")), - ("zmn", _(u"Mbangwe")), - ("zmo", _(u"Molo")), - ("zmp", _(u"Mpuono")), - ("zmq", _(u"Mituku")), - ("zmr", _(u"Maranunggu")), - ("zms", _(u"Mbesa")), - ("zmt", _(u"Maringarr")), - ("zmu", _(u"Muruwari")), - ("zmv", _(u"Mbariman-Gudhinma")), - ("zmw", _(u"Mbo")), - ("zmx", _(u"Bomitaba")), - ("zmy", _(u"Mariyedi")), - ("zmz", _(u"Mbandja")), - ("zna", _(u"Zan Gula")), - ("znd", _(u"Zande languages")), - ("zne", _(u"Zande")), - ("zng", _(u"Mang")), - ("znk", _(u"Manangkari")), - ("zns", _(u"Mangas")), - ("zoc", _(u"Copainalá Zoque")), - ("zoh", _(u"Chimalapa Zoque")), - ("zom", _(u"Zou")), - ("zoo", _(u"Asunción Mixtepec Zapotec")), - ("zoq", _(u"Tabasco Zoque")), - ("zor", _(u"Rayón Zoque")), - ("zos", _(u"Francisco León Zoque")), - ("zpa", _(u"Lachiguiri Zapotec")), - ("zpb", _(u"Yautepec Zapotec")), - ("zpc", _(u"Choapan Zapotec")), - ("zpd", _(u"Southeastern Ixtlán Zapotec")), - ("zpe", _(u"Petapa Zapotec")), - ("zpf", _(u"San Pedro Quiatoni Zapotec")), - ("zpg", _(u"Guevea De Humboldt Zapotec")), - ("zph", _(u"Totomachapan Zapotec")), - ("zpi", _(u"Santa María Quiegolani Zapotec")), - ("zpj", _(u"Quiavicuzas Zapotec")), - ("zpk", _(u"Tlacolulita Zapotec")), - ("zpl", _(u"Lachixío Zapotec")), - ("zpm", _(u"Mixtepec Zapotec")), - ("zpn", _(u"Santa Inés Yatzechi Zapotec")), - ("zpo", _(u"Amatlán Zapotec")), - ("zpp", _(u"El Alto Zapotec")), - ("zpq", _(u"Zoogocho Zapotec")), - ("zpr", _(u"Santiago Xanica Zapotec")), - ("zps", _(u"Coatlán Zapotec")), - ("zpt", _(u"San Vicente Coatlán Zapotec")), - ("zpu", _(u"Yalálag Zapotec")), - ("zpv", _(u"Chichicapan Zapotec")), - ("zpw", _(u"Zaniza Zapotec")), - ("zpx", _(u"San Baltazar Loxicha Zapotec")), - ("zpy", _(u"Mazaltepec Zapotec")), - ("zpz", _(u"Texmelucan Zapotec")), - ("zqe", _(u"Qiubei Zhuang")), - ("zra", _(u"Kara")), - ("zrg", _(u"Mirgan")), - ("zrn", _(u"Zerenkel")), - ("zro", _(u"Záparo")), - ("zrp", _(u"Zarphatic")), - ("zrs", _(u"Mairasi")), - ("zsa", _(u"Sarasira")), - ("zsk", _(u"Kaskean")), - ("zsl", _(u"Zambian Sign Language")), - ("zsm", _(u"Standard Malay")), - ("zsr", _(u"Southern Rincon Zapotec")), - ("zsu", _(u"Sukurum")), - ("zte", _(u"Elotepec Zapotec")), - ("ztg", _(u"Xanaguía Zapotec")), - ("ztl", _(u"Lapaguía-Guivini Zapotec")), - ("ztm", _(u"San Agustín Mixtepec Zapotec")), - ("ztn", _(u"Santa Catarina Albarradas Zapotec")), - ("ztp", _(u"Loxicha Zapotec")), - ("ztq", _(u"Quioquitani-Quierí Zapotec")), - ("zts", _(u"Tilquiapan Zapotec")), - ("ztt", _(u"Tejalapan Zapotec")), - ("ztu", _(u"Güilá Zapotec")), - ("ztx", _(u"Zaachila Zapotec")), - ("zty", _(u"Yatee Zapotec")), - ("zua", _(u"Zeem")), - ("zuh", _(u"Tokano")), - ("zum", _(u"Kumzari")), - ("zun", _(u"Zuni")), - ("zuy", _(u"Zumaya")), - ("zwa", _(u"Zay")), - ("zxx", _(u"No linguistic content")), - ("zyb", _(u"Yongbei Zhuang")), - ("zyg", _(u"Yang Zhuang")), - ("zyj", _(u"Youjiang Zhuang")), - ("zyn", _(u"Yongnan Zhuang")), - ("zyp", _(u"Zyphe Chin")), - ("zza", _(u"Zaza")), - ("zzj", _(u"Zuojiang Zhuang")), - ) + LANGUAGES = [(code, label,) for label, code in languages.items()] From d43f9d570a8d5f918f389b6fa9627ea86189040a Mon Sep 17 00:00:00 2001 From: Jay Varner Date: Mon, 21 Mar 2022 08:49:09 -0400 Subject: [PATCH 009/172] Add bcp47.py to requirements --- requirements/base.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index a2f4a11f0..70e0cbec7 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -44,8 +44,8 @@ pylint-django==2.4.4 # Wagtail wagtail==2.13.4 # wagtailmenus==2.13 -git+git://github.com/jayvarner/wagtailmenus.git@master -git+git://github.com/jcmundy/wagtail-autocomplete.git@master#egg=wagtail-autocomplete +git+https://github.com/jayvarner/wagtailmenus.git@master +git+https://github.com/jcmundy/wagtail-autocomplete.git@master#egg=wagtail-autocomplete #wagtail-autocomplete==0.3.1 wagtail-cache==1.0.2 @@ -62,3 +62,6 @@ stream-unzip>=0.0.58 # jekyll theme for zipfile used in export functionality -e git+https://github.com/emory-libraries-ecds/digitaledition-jekylltheme.git@readux_2#egg=digitaledition-jekylltheme + +# List of BCP 47 language codes +bcp47==0.0.4 # https://github.com/highfestiva/bcp47.py \ No newline at end of file From 5ed572b48683d5c8bfd9e9b45655eadc87417612 Mon Sep 17 00:00:00 2001 From: Jay Varner Date: Mon, 21 Mar 2022 08:49:40 -0400 Subject: [PATCH 010/172] Fix manifest factory --- apps/iiif/manifests/tests/factories.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/iiif/manifests/tests/factories.py b/apps/iiif/manifests/tests/factories.py index e93ed5975..4e395c839 100644 --- a/apps/iiif/manifests/tests/factories.py +++ b/apps/iiif/manifests/tests/factories.py @@ -22,6 +22,7 @@ class ManifestFactory(DjangoModelFactory): canvase = RelatedFactory(CanvasFactory, 'manifest') logo = ImageField(from_path='apps/iiif/canvases/tests/ecds.png') image_server = SubFactory(ImageServerFactory) + summary = Faker('sentence') class Meta: # pylint: disable=too-few-public-methods, missing-class-docstring model = Manifest From 36ac8e4456c7a65ec478af6a84c30b405dc895c6 Mon Sep 17 00:00:00 2001 From: Jay Varner Date: Mon, 21 Mar 2022 12:55:28 -0400 Subject: [PATCH 011/172] Update to Django 3.2 --- requirements/base.txt | 11 ++++++----- requirements/local.txt | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index 6c85a0c49..8416caa54 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -9,18 +9,19 @@ progress python-memcached==1.59 pyld==1.0.5 hocr-spec==0.2.0 -edtf +# edtf +git+https://github.com/ecds/python-edtf@214972b # Django # ------------------------------------------------------------------------------ # TODO: To upgrade to Django 3, we have to redo the full text search on the manifest model. # TODO: When we get to update, check this re: summernote https://github.com/summernote/django-summernote/issues/449 -Django==2.2.24 # https://www.djangoproject.com/ +Django>=3.2.0 # https://www.djangoproject.com/ #django-environ==0.4.5 # https://github.com/joke2k/django-environ git+https://github.com/joke2k/django-environ@develop django-model-utils==4.2.0 # https://github.com/jazzband/django-model-utils django-dirtyfields>=1.7.0 # https://github.com/romgar/django-dirtyfields -django-allauth>=0.45.0 # https://github.com/pennersr/django-allauth +django-allauth>=0.49.0 # https://github.com/pennersr/django-allauth django-crispy-forms==1.13.0 # https://github.com/django-crispy-forms/django-crispy-forms django-redis==5.0.0 # https://github.com/niwinz/django-redis # beta version required for Django 2.x @@ -42,7 +43,7 @@ django-sass-processor pylint-django==2.4.4 # Wagtail -wagtail==2.13.4 +wagtail==2.15 # wagtailmenus==2.13 git+https://github.com/jayvarner/wagtailmenus.git@master git+https://github.com/jcmundy/wagtail-autocomplete.git@master#egg=wagtail-autocomplete @@ -54,7 +55,7 @@ django-import-export==2.6.1 gitpython==3.1.24 # S3 Uploads -boto3==1.20.7 +boto3==1.21.22 django-storages==1.12.3 # https://github.com/jschneier/django-storages # Python function to stream unzip all the files in a ZIP archive, without loading the entire ZIP file into memory or any of its uncompressed files. diff --git a/requirements/local.txt b/requirements/local.txt index dd7d08b65..9fd731ca4 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -18,7 +18,7 @@ httpretty==1.1.4 # https://pypi.org/project/httpretty/ #mock==4.0.2 cssutils==2.3.0 # https://pypi.org/project/cssutils/ pytest-django==4.5.2 # https://github.com/pytest-dev/pytest-django -moto==2.2.15 # https://github.com/spulec/moto +moto==3.1.1 # https://github.com/spulec/moto # Code quality # ------------------------------------------------------------------------------ From d27ec81d137df624bc35a803c6de7de3f03710f2 Mon Sep 17 00:00:00 2001 From: Jay Varner Date: Mon, 21 Mar 2022 12:55:55 -0400 Subject: [PATCH 012/172] Remove Postgres search --- apps/iiif/manifests/models.py | 12 +- apps/iiif/manifests/tests/test_views.py | 12 +- apps/iiif/manifests/tests/tests.py | 10 +- apps/readux/search.py | 111 --------- apps/readux/tests/test_search.py | 145 ------------ apps/readux/urls.py | 6 +- apps/readux/views.py | 300 ++++++++++++------------ 7 files changed, 170 insertions(+), 426 deletions(-) delete mode 100644 apps/readux/search.py delete mode 100755 apps/readux/tests/test_search.py diff --git a/apps/iiif/manifests/models.py b/apps/iiif/manifests/models.py index fc32a723e..77c557062 100644 --- a/apps/iiif/manifests/models.py +++ b/apps/iiif/manifests/models.py @@ -138,7 +138,7 @@ class Manifest(IiifBase): # TODO: This has to be removed/redone before we upgrade to Django 3 search_vector = SearchVectorField(null=True, editable=False) image_server = models.ForeignKey(ImageServer, on_delete=models.DO_NOTHING, null=True) - objects = ManifestManager() + # objects = ManifestManager() start_canvas = models.ForeignKey( 'canvases.Canvas', on_delete=models.SET_NULL, @@ -165,7 +165,7 @@ def get_volume_url(self): class Meta: # pylint: disable = too-few-public-methods, missing-class-docstring ordering = ['published_date'] - indexes = [GinIndex(fields=['search_vector'])] + # indexes = [GinIndex(fields=['search_vector'])] @property def publisher_bib(self): @@ -238,10 +238,10 @@ def save(self, *args, **kwargs): # pylint: disable = arguments-differ except Canvas.DoesNotExist: self.start_canvas = None - if 'update_fields' not in kwargs or 'search_vector' not in kwargs['update_fields']: - instance = self._meta.default_manager.with_documents().get(pk=self.pk) - instance.search_vector = instance.document - instance.save(update_fields=['search_vector']) + # if 'update_fields' not in kwargs or 'search_vector' not in kwargs['update_fields']: + # instance = self._meta.default_manager.with_documents().get(pk=self.pk) + # instance.search_vector = instance.document + # instance.save(update_fields=['search_vector']) def delete(self, *args, **kwargs): diff --git a/apps/iiif/manifests/tests/test_views.py b/apps/iiif/manifests/tests/test_views.py index ae3c71f4f..7924bacee 100644 --- a/apps/iiif/manifests/tests/test_views.py +++ b/apps/iiif/manifests/tests/test_views.py @@ -89,12 +89,12 @@ def test_autocomplete_label(self): def test_absolute_url(self): assert Manifest.objects.all().first().get_absolute_url() == "%s/volume/%s" % (settings.HOSTNAME, Manifest.objects.all().first().pid) - def test_manifest_search_vector_exists(self): - volume = ManifestFactory.create() - assert not self.volume.search_vector - volume.save() - volume.refresh_from_db() - assert volume.search_vector is not None + # def test_manifest_search_vector_exists(self): + # volume = ManifestFactory.create() + # assert not self.volume.search_vector + # volume.save() + # volume.refresh_from_db() + # assert volume.search_vector is not None def test_multiple_starting_canvases(self): volume = EmptyManifestFactory.create(canvas=None) diff --git a/apps/iiif/manifests/tests/tests.py b/apps/iiif/manifests/tests/tests.py index 3a3dcc515..d2831a303 100644 --- a/apps/iiif/manifests/tests/tests.py +++ b/apps/iiif/manifests/tests/tests.py @@ -122,11 +122,11 @@ def test_autocomplete_label(self): def test_absolute_url(self): assert Manifest.objects.all().first().get_absolute_url() == "%s/volume/%s" % (settings.HOSTNAME, Manifest.objects.all().first().pid) - def test_manifest_search_vector_exists(self): - assert self.volume.search_vector is None - self.volume.save() - self.volume.refresh_from_db() - assert self.volume.search_vector is not None + # def test_manifest_search_vector_exists(self): + # assert self.volume.search_vector is None + # self.volume.save() + # self.volume.refresh_from_db() + # assert self.volume.search_vector is not None def test_multiple_starting_canvases(self): volume = ManifestFactory.create() diff --git a/apps/readux/search.py b/apps/readux/search.py deleted file mode 100644 index 5156e6922..000000000 --- a/apps/readux/search.py +++ /dev/null @@ -1,111 +0,0 @@ -"""Search Endpoint(s)""" -import json -from urllib.parse import urlencode -from django.http import JsonResponse -from django.views import View -from django.views.generic import ListView -from django.db.models import Count, Q -from django.utils.datastructures import MultiValueDictKeyError -from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank -from ..iiif.annotations.models import Annotation -from ..iiif.canvases.models import Canvas -from ..iiif.kollections.models import Collection -from ..iiif.manifests.models import Manifest -from .models import UserAnnotation - -class SearchManifestCanvas(View): - """ - Endpoint for text search of manifest - :rtype json - """ - def get_queryresults(self): - """ - Build query results. - - :return: [description] - :rtype: JSON - """ - manifest = Manifest.objects.get(pid=self.request.GET['volume']) - annotations = Annotation.objects.filter( - canvas__manifest__label=manifest.label - ) - user_annotations = UserAnnotation.objects.filter( - owner_id=self.request.user.id - ).filter( - canvas__manifest__label=manifest.label - ) - fuzzy_search = Q() - query = SearchQuery('') - vector = SearchVector('content') - search_type = self.request.GET['type'] - search_strings = self.request.GET['query'].split() - results = { - 'search_terms': search_strings, - 'ocr_annotations': [], - 'user_annotations': [] - } - - if search_strings: - if search_type == 'partial': - for search_string in search_strings: - query = query | SearchQuery(search_string) - fuzzy_search |= Q(content__icontains=search_string) ## - annotations = annotations.filter(fuzzy_search) - user_annotations = user_annotations.filter(fuzzy_search) - else: - for search_string in search_strings: - query = query | SearchQuery(search_string) - # fuzzy_search |= Q(content__contains=search_string) - - annotations = annotations.annotate( - search=vector - ).filter( - search=query - ) - - user_annotations = user_annotations.annotate( - search=vector - ).filter( - search=query - ) - - annotation_results = annotations.values( - 'canvas__position', - 'canvas__manifest__pid', - 'canvas__pid' - ).annotate( - Count('canvas__position') - ).order_by( - 'canvas__position' - ).exclude( - resource_type='dctypes:Text' - ).distinct() - - for annotation in annotation_results: - results['ocr_annotations'].append(json.dumps(annotation)) - - user_annotation_results = user_annotations.values( - 'canvas__position', - 'canvas__manifest__pid', - 'canvas__pid' - ).annotate( - rank=SearchRank(vector, query) - ).order_by( - '-rank' - ).distinct() - - for ua_annotation in user_annotation_results: - results['user_annotations'].append(json.dumps(ua_annotation)) - - return results - - def get(self, request, *args, **kwargs): # pylint: disable = unused-argument - """ - Respond to GET requests for search queries. - - :rtype: JsonResponse - """ - return JsonResponse( - status=200, - data=self.get_queryresults() - ) diff --git a/apps/readux/tests/test_search.py b/apps/readux/tests/test_search.py deleted file mode 100755 index a831dced5..000000000 --- a/apps/readux/tests/test_search.py +++ /dev/null @@ -1,145 +0,0 @@ -"""Test searching volume content.""" -from itertools import repeat -from random import randrange -import json -from django.test import TestCase, Client -from django.test import RequestFactory -from django.urls import reverse -from apps.users.tests.factories import UserFactory -from ...iiif.manifests.tests.factories import ManifestFactory -from ...iiif.canvases.tests.factories import CanvasFactory -from ...iiif.annotations.tests.factories import AnnotationFactory -from ..search import SearchManifestCanvas -from .factories import UserAnnotationFactory -from ..models import UserAnnotation - -class TestReaduxPageDetailSearch(TestCase): - """ - Test page search. - """ - def setUp(self): - self.search_manifest_view = SearchManifestCanvas.as_view() - self.request = RequestFactory() - self.volume = ManifestFactory.create() - original_canvas = self.volume.canvas_set.first() - self.user = UserFactory.create() - self.ocr_user = UserFactory.create(username='ocr', name='OCR') - canvas_position = 1 - for _ in repeat(None, randrange(5, 10)): - CanvasFactory.create(manifest=self.volume, position=canvas_position) - canvas_position += 1 - self.volume.start_canvas = self.volume.canvas_set.all()[1] - self.volume.save() - # # Delete the canvas created by the ManifestFactory to ensure a clean set. - original_canvas.delete() - for _ in [1, 2]: - self.add_annotations(self.volume.canvas_set.get(position=1)) - for _ in [1, 2, 3]: - self.add_annotations(self.volume.canvas_set.get(position=2)) - - # pylint: enable = unused-variable - - self.client = Client() - self.url = reverse('search_pages') - - def add_annotations(self, canvas): - """Add OCR and User annotations to a canvas.""" - AnnotationFactory.create( - canvas=canvas, - content='stankonia', - owner=self.ocr_user - ) - UserAnnotationFactory.create( - canvas=canvas, - content='Aquemini', - owner=self.user - ) - - def load_results(self, response): - """Decode the json response - - :param response: search results - :type response: client response - :return: Dict of results - :rtype: dict - """ - return json.loads(response.content.decode('UTF-8-sig')) - - def test_manifest_canvas_ocr_partial_search(self): - query_params = {'volume': self.volume.pid, 'type': 'partial', 'query': 'stank'} - request = self.request.get( - self.url, query_params - ) - request.user = UserFactory.create() - response = self.search_manifest_view(request) - search_results = self.load_results(response) - assert len(search_results['ocr_annotations']) == 2 - assert len(search_results['user_annotations']) == 0 - assert search_results['search_terms'] == 'stank'.split() - assert json.loads(search_results['ocr_annotations'][0])['canvas__position'] == 1 - assert json.loads(search_results['ocr_annotations'][1])['canvas__position'] == 2 - assert json.loads(search_results['ocr_annotations'][0])['canvas__position__count'] == 2 - assert json.loads(search_results['ocr_annotations'][1])['canvas__position__count'] == 3 - - def test_manifest_canvas_ocr_exact_search(self): - query_params = {'volume': self.volume.pid, 'type': 'exact', 'query': 'stankonia'} - request = self.request.get( - self.url, query_params - ) - request.user = UserFactory.create() - response = self.search_manifest_view(request) - search_results = self.load_results(response) - assert len(search_results['ocr_annotations']) == 2 - assert len(search_results['user_annotations']) == 0 - assert json.loads(search_results['ocr_annotations'][0])['canvas__position'] == 1 - assert json.loads(search_results['ocr_annotations'][1])['canvas__position'] == 2 - assert json.loads(search_results['ocr_annotations'][0])['canvas__position__count'] == 2 - assert json.loads(search_results['ocr_annotations'][1])['canvas__position__count'] == 3 - - def test_manifest_canvas_ocr_exact_search_no_results(self): - query_params = {'volume': self.volume.pid, 'type': 'exact', 'query': 'Idlewild'} - request = self.request.get( - self.url, query_params - ) - request.user = UserFactory.create() - response = self.search_manifest_view(request) - search_results = self.load_results(response) - assert len(search_results['ocr_annotations']) == 0 - assert len(search_results['user_annotations']) == 0 - - def test_manifest_canvas_user_annotation_partial_search(self): - query_params = {'volume': self.volume.pid, 'type': 'partial', 'query': 'Aqu'} - request = self.request.get( - self.url, query_params - ) - request.user = self.user - response = self.search_manifest_view(request) - search_results = self.load_results(response) - assert len(search_results['ocr_annotations']) == 0 - assert len(search_results['user_annotations']) == 2 - assert json.loads(search_results['user_annotations'][0])['canvas__position'] == 1 - assert json.loads(search_results['user_annotations'][1])['canvas__position'] == 2 - - def test_manifest_canvas_user_annotation_exact_search(self): - query_params = {'volume': self.volume.pid, 'type': 'exact', 'query': 'Aquemini'} - request = self.request.get( - self.url, query_params - ) - request.user = self.user - response = self.search_manifest_view(request) - search_results = self.load_results(response) - assert len(search_results['ocr_annotations']) == 0 - assert len(search_results['user_annotations']) == 2 - assert json.loads(search_results['user_annotations'][0])['canvas__position'] == 1 - assert json.loads(search_results['user_annotations'][1])['canvas__position'] == 2 - - def test_manifest_canvas_user_annotation_exact_search_no_results(self): - query_params = {'volume': self.volume.pid, 'type': 'exact', 'query': 'Idlewild'} - request = self.request.get( - self.url, query_params - ) - request.user = self.user - response = self.search_manifest_view(request) - search_results = self.load_results(response) - assert len(search_results['ocr_annotations']) == 0 - assert len(search_results['user_annotations']) == 0 diff --git a/apps/readux/urls.py b/apps/readux/urls.py index 794e73711..139be3466 100644 --- a/apps/readux/urls.py +++ b/apps/readux/urls.py @@ -1,7 +1,7 @@ """URL patterns for the Readux app""" from django.urls import path from . import views, annotations -from .search import SearchManifestCanvas +# from .search import SearchManifestCanvas urlpatterns = [ path('collection/', views.CollectionsList.as_view(), name='collections list'), @@ -30,7 +30,7 @@ name='user_annotations' ), path('annotations-crud/', annotations.AnnotationCrud.as_view(), name='crud_user_annotation'), - path('search/', views.VolumeSearch.as_view(), name='search'), + # path('search/', views.VolumeSearch.as_view(), name='search'), path('_anno_count//', views.AnnotationsCount.as_view(), name='_anno_count'), - path('search/volume/pages', SearchManifestCanvas.as_view(), name='search_pages'), + # path('search/volume/pages', SearchManifestCanvas.as_view(), name='search_pages'), ] diff --git a/apps/readux/views.py b/apps/readux/views.py index 12651c097..595d28fed 100644 --- a/apps/readux/views.py +++ b/apps/readux/views.py @@ -315,156 +315,156 @@ def get(self, request, *args, **kwargs): return resp # TODO: Replace with Elasticsearch -class VolumeSearch(ListView): - '''Search across all volumes.''' - template_name = 'search_results.html' - - def get_queryset(self): - return Manifest.objects.all() - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - collection = self.request.GET.get('collection', None) - # pylint: disable = invalid-name - COLSET = Collection.objects.values_list('pid', flat=True) - COL_OPTIONS = list(COLSET) - COL_LIST = Collection.objects.values('pid', 'label').order_by('label').distinct('label') - # pylint: enable = invalid-name - collection_url_params = self.request.GET.copy() - - qs = self.get_queryset() - try: - search_string = self.request.GET['q'] - search_type = self.request.GET['type'] - search_strings = self.request.GET['q'].split() - if search_strings: - if search_type == 'partial': - qq = Q() - qqq = Q() - query = SearchQuery('') - for search_string in search_strings: - query = query | SearchQuery(search_string) - qq |= Q(canvas__annotation__content__icontains=search_string) - qqq |= Q(label__icontains=search_string) |Q(author__icontains=search_string) | Q(summary__icontains=search_string) # pylint: disable = line-too-long - qs1 = qs.filter(qq) - qs1 = qs1.values( - 'pid', 'label', 'author', - 'published_date', 'created_at' - ).annotate( - pidcount=Count('pid') - ).order_by('-pidcount') - - vector2 = SearchVector( - 'label', weight='A' - ) + SearchVector( - 'author', weight='B' - ) + SearchVector( - 'summary', weight='C' - ) - - qs3 = qs.filter(qqq) - qs2 = qs.values( - 'label', 'author', 'published_date', 'created_at', 'canvas__pid', 'pid', - 'canvas__manifest__image_server__server_base' - ).order_by( - 'pid' - ).distinct( - 'pid' - ) - - if collection not in COL_OPTIONS: - collection = None - - if collection is not None: - qs1 = qs1.filter(collections__pid = collection) - qs3 = qs3.filter(collections__pid = collection) - - if 'collection' in collection_url_params: - del collection_url_params['collection'] - elif search_type == 'exact': - qq = Q() - query = SearchQuery('') - for search_string in search_strings: - query = query | SearchQuery(search_string) - qq |= Q(canvas__annotation__content__exact=search_string) - vector = SearchVector('canvas__annotation__content') - qs1 = qs.annotate(search=vector).filter(search=query) - qs1 = qs1.annotate( - rank=SearchRank(vector, query) - ).values( - 'pid', 'label', 'author', - 'published_date', 'created_at' - ).annotate( - pidcount = Count('pid') - ).order_by('-pidcount') - - vector2 = SearchVector( - 'label', weight='A' - ) + SearchVector( - 'author', weight='B' - ) + SearchVector( - 'summary', weight='C' - ) - - qs3 = qs.annotate(search=vector2).filter(search=query) - qs3 = qs3.annotate( - rank=SearchRank(vector2, query) - ).values( - 'pid', 'label', 'author', - 'published_date', 'created_at' - ).order_by('-rank') - - qs2 = qs.values( - 'canvas__pid', 'pid', - 'canvas__manifest__image_server__server_base' - ).order_by( - 'pid' - ).distinct('pid') - - if collection not in COL_OPTIONS: - collection = None - - if collection is not None: - qs1 = qs1.filter(collections__pid = collection) - qs3 = qs3.filter(collections__pid = collection) - - if 'collection' in collection_url_params: - del collection_url_params['collection'] - else: - search_string = '' - search_strings = '' - qs1 = '' - qs2 = '' - qs3 = '' - context['qs1'] = qs1 - context['qs2'] = qs2 - context['qs3'] = qs3 - except MultiValueDictKeyError: - q = '' - search_string = '' - search_strings = '' - - context['volumes'] = qs.all - annocount_list = [] - canvaslist = [] - for volume in qs: - user_annotation_count = UserAnnotation.objects.filter( - owner_id=self.request.user.id - ).filter( - canvas__manifest__id=volume.id - ).count() - annocount_list.append({volume.pid: user_annotation_count}) - context['user_annotation_count'] = annocount_list - canvasquery = Canvas.objects.filter(is_starting_page=1).filter(manifest__id=volume.id) - canvasquery2 = list(canvasquery) - canvaslist.append({volume.pid: canvasquery2}) - context['firstthumbnail'] = canvaslist - context.update({ - 'collection_url_params': urlencode(collection_url_params), - 'collection': collection, 'COL_OPTIONS': COL_OPTIONS, - 'COL_LIST': COL_LIST, 'search_string': search_string, 'search_strings': search_strings - }) - return context +# class VolumeSearch(ListView): +# '''Search across all volumes.''' +# template_name = 'search_results.html' + +# def get_queryset(self): +# return Manifest.objects.all() + +# def get_context_data(self, **kwargs): +# context = super().get_context_data(**kwargs) +# collection = self.request.GET.get('collection', None) +# # pylint: disable = invalid-name +# COLSET = Collection.objects.values_list('pid', flat=True) +# COL_OPTIONS = list(COLSET) +# COL_LIST = Collection.objects.values('pid', 'label').order_by('label').distinct('label') +# # pylint: enable = invalid-name +# collection_url_params = self.request.GET.copy() + +# qs = self.get_queryset() +# try: +# search_string = self.request.GET['q'] +# search_type = self.request.GET['type'] +# search_strings = self.request.GET['q'].split() +# if search_strings: +# if search_type == 'partial': +# qq = Q() +# qqq = Q() +# query = SearchQuery('') +# for search_string in search_strings: +# query = query | SearchQuery(search_string) +# qq |= Q(canvas__annotation__content__icontains=search_string) +# qqq |= Q(label__icontains=search_string) |Q(author__icontains=search_string) | Q(summary__icontains=search_string) # pylint: disable = line-too-long +# qs1 = qs.filter(qq) +# qs1 = qs1.values( +# 'pid', 'label', 'author', +# 'published_date', 'created_at' +# ).annotate( +# pidcount=Count('pid') +# ).order_by('-pidcount') + +# vector2 = SearchVector( +# 'label', weight='A' +# ) + SearchVector( +# 'author', weight='B' +# ) + SearchVector( +# 'summary', weight='C' +# ) + +# qs3 = qs.filter(qqq) +# qs2 = qs.values( +# 'label', 'author', 'published_date', 'created_at', 'canvas__pid', 'pid', +# 'canvas__manifest__image_server__server_base' +# ).order_by( +# 'pid' +# ).distinct( +# 'pid' +# ) + +# if collection not in COL_OPTIONS: +# collection = None + +# if collection is not None: +# qs1 = qs1.filter(collections__pid = collection) +# qs3 = qs3.filter(collections__pid = collection) + +# if 'collection' in collection_url_params: +# del collection_url_params['collection'] +# elif search_type == 'exact': +# qq = Q() +# query = SearchQuery('') +# for search_string in search_strings: +# query = query | SearchQuery(search_string) +# qq |= Q(canvas__annotation__content__exact=search_string) +# vector = SearchVector('canvas__annotation__content') +# qs1 = qs.annotate(search=vector).filter(search=query) +# qs1 = qs1.annotate( +# rank=SearchRank(vector, query) +# ).values( +# 'pid', 'label', 'author', +# 'published_date', 'created_at' +# ).annotate( +# pidcount = Count('pid') +# ).order_by('-pidcount') + +# vector2 = SearchVector( +# 'label', weight='A' +# ) + SearchVector( +# 'author', weight='B' +# ) + SearchVector( +# 'summary', weight='C' +# ) + +# qs3 = qs.annotate(search=vector2).filter(search=query) +# qs3 = qs3.annotate( +# rank=SearchRank(vector2, query) +# ).values( +# 'pid', 'label', 'author', +# 'published_date', 'created_at' +# ).order_by('-rank') + +# qs2 = qs.values( +# 'canvas__pid', 'pid', +# 'canvas__manifest__image_server__server_base' +# ).order_by( +# 'pid' +# ).distinct('pid') + +# if collection not in COL_OPTIONS: +# collection = None + +# if collection is not None: +# qs1 = qs1.filter(collections__pid = collection) +# qs3 = qs3.filter(collections__pid = collection) + +# if 'collection' in collection_url_params: +# del collection_url_params['collection'] +# else: +# search_string = '' +# search_strings = '' +# qs1 = '' +# qs2 = '' +# qs3 = '' +# context['qs1'] = qs1 +# context['qs2'] = qs2 +# context['qs3'] = qs3 +# except MultiValueDictKeyError: +# q = '' +# search_string = '' +# search_strings = '' + +# context['volumes'] = qs.all +# annocount_list = [] +# canvaslist = [] +# for volume in qs: +# user_annotation_count = UserAnnotation.objects.filter( +# owner_id=self.request.user.id +# ).filter( +# canvas__manifest__id=volume.id +# ).count() +# annocount_list.append({volume.pid: user_annotation_count}) +# context['user_annotation_count'] = annocount_list +# canvasquery = Canvas.objects.filter(is_starting_page=1).filter(manifest__id=volume.id) +# canvasquery2 = list(canvasquery) +# canvaslist.append({volume.pid: canvasquery2}) +# context['firstthumbnail'] = canvaslist +# context.update({ +# 'collection_url_params': urlencode(collection_url_params), +# 'collection': collection, 'COL_OPTIONS': COL_OPTIONS, +# 'COL_LIST': COL_LIST, 'search_string': search_string, 'search_strings': search_strings +# }) +# return context class ManifestsSitemap(Sitemap): """Django Sitemap for Manafests""" From 44c2eb2ecb4610906255a4bf4f824eeaf27fbfcd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 17:03:42 +0000 Subject: [PATCH 013/172] build(deps): Bump django-debug-toolbar from 3.2.2 to 3.2.4 Bumps [django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) from 3.2.2 to 3.2.4. - [Release notes](https://github.com/jazzband/django-debug-toolbar/releases) - [Changelog](https://github.com/jazzband/django-debug-toolbar/blob/main/docs/changes.rst) - [Commits](https://github.com/jazzband/django-debug-toolbar/compare/3.2.2...3.2.4) --- updated-dependencies: - dependency-name: django-debug-toolbar dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 9fd731ca4..0609233d6 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -31,7 +31,7 @@ coveralls factory-boy==3.2.1 # https://github.com/FactoryBoy/factory_boy faker==9.8.2 -django-debug-toolbar==3.2.2 # https://github.com/jazzband/django-debug-toolbar +django-debug-toolbar==3.2.4 # https://github.com/jazzband/django-debug-toolbar django-extensions==3.1.5 # https://github.com/django-extensions/django-extensions django-coverage-plugin==2.0.2 # https://github.com/nedbat/django_coverage_plugin pyopenssl # for running dev server under https From 59bfed6f6db9ba145f2fa8a25dacfc29efd10681 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 17:04:21 +0000 Subject: [PATCH 014/172] build(deps): Bump python-slugify from 5.0.2 to 6.1.1 Bumps [python-slugify](https://github.com/un33k/python-slugify) from 5.0.2 to 6.1.1. - [Release notes](https://github.com/un33k/python-slugify/releases) - [Changelog](https://github.com/un33k/python-slugify/blob/master/CHANGELOG.md) - [Commits](https://github.com/un33k/python-slugify/compare/5.0.2...v6.1.1) --- updated-dependencies: - dependency-name: python-slugify dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 8416caa54..b0f06c63a 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,5 +1,5 @@ pytz==2021.3 # https://github.com/stub42/pytz -python-slugify==5.0.2 # https://github.com/un33k/python-slugify +python-slugify==6.1.1 # https://github.com/un33k/python-slugify Pillow argon2-cffi==21.3.0 # https://github.com/hynek/argon2_cffi redis==4.0.0 # https://github.com/antirez/redis From 221ac1bb5db64d200e3f30dedf84d4bcafcf98ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 17:20:31 +0000 Subject: [PATCH 015/172] build(deps): Bump celery from 5.2.1 to 5.2.3 Bumps [celery](https://github.com/celery/celery) from 5.2.1 to 5.2.3. - [Release notes](https://github.com/celery/celery/releases) - [Changelog](https://github.com/celery/celery/blob/master/Changelog.rst) - [Commits](https://github.com/celery/celery/compare/v5.2.1...v5.2.3) --- updated-dependencies: - dependency-name: celery dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 9fd731ca4..48aad8509 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -41,5 +41,5 @@ pyopenssl # for running dev server under https # TODO: Why are we using this fork? Fabric3==1.14.post1 # https://github.com/mathiasertl/fabric -celery==5.2.1 +celery==5.2.3 django-celery-results==2.2.0 From 9c7930f7994c6e7464e84e80d8e30fb3f0c96500 Mon Sep 17 00:00:00 2001 From: Jay Varner Date: Mon, 21 Mar 2022 13:50:38 -0400 Subject: [PATCH 016/172] Update Django Redis add note about Rust --- .circleci/config.yml | 1 + README.md | 4 +++- requirements/base.txt | 3 +-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 859cec447..942fc6f32 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -22,6 +22,7 @@ jobs: POSTGRES_USER: root POSTGRES_DB: readux - image: cimg/ruby:2.5-node + - image: cimg/rust:1.59.0 steps: - checkout - restore_cache: diff --git a/README.md b/README.md index b083fdb79..d23198a53 100644 --- a/README.md +++ b/README.md @@ -41,12 +41,14 @@ source venv/bin/activate 4. Install the dependencies. +Note: You will need to install Rust and have it in your path. + ~~~bash pip install -r requirements/local.txt bundle install ~~~ -5. Copy and set up your local settings. +1. Copy and set up your local settings. ~~~bash cp config/settings/local.dst config/settings/local.py diff --git a/requirements/base.txt b/requirements/base.txt index b0f06c63a..1e1813127 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -2,7 +2,6 @@ pytz==2021.3 # https://github.com/stub42/pytz python-slugify==6.1.1 # https://github.com/un33k/python-slugify Pillow argon2-cffi==21.3.0 # https://github.com/hynek/argon2_cffi -redis==4.0.0 # https://github.com/antirez/redis bs4 pyyaml progress @@ -23,7 +22,7 @@ django-model-utils==4.2.0 # https://github.com/jazzband/django-model-utils django-dirtyfields>=1.7.0 # https://github.com/romgar/django-dirtyfields django-allauth>=0.49.0 # https://github.com/pennersr/django-allauth django-crispy-forms==1.13.0 # https://github.com/django-crispy-forms/django-crispy-forms -django-redis==5.0.0 # https://github.com/niwinz/django-redis +django-redis==5.2.0 # https://github.com/niwinz/django-redis # beta version required for Django 2.x django-modeltranslation>=0.17.2 # https://github.com/deschler/django-modeltranslation django-taggit>=1.5.0 # https://github.com/jazzband/django-taggit From f9279cfe9ca80bf4d21410eaa92073cb9590ee80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 17:51:39 +0000 Subject: [PATCH 017/172] build(deps): Bump cssutils from 2.3.0 to 2.4.0 Bumps [cssutils](https://github.com/jaraco/cssutils) from 2.3.0 to 2.4.0. - [Release notes](https://github.com/jaraco/cssutils/releases) - [Changelog](https://github.com/jaraco/cssutils/blob/main/CHANGES.rst) - [Commits](https://github.com/jaraco/cssutils/compare/v2.3.0...v2.4.0) --- updated-dependencies: - dependency-name: cssutils dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 9fd731ca4..037127a2d 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -16,7 +16,7 @@ requests==2.26.0 iiif-prezi==0.3.0 # https://github.com/iiif-prezi/iiif-prezi httpretty==1.1.4 # https://pypi.org/project/httpretty/ #mock==4.0.2 -cssutils==2.3.0 # https://pypi.org/project/cssutils/ +cssutils==2.4.0 # https://pypi.org/project/cssutils/ pytest-django==4.5.2 # https://github.com/pytest-dev/pytest-django moto==3.1.1 # https://github.com/spulec/moto From f79058ec3d17debd4d309f019d2f8578cf2fcc86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:05:43 +0000 Subject: [PATCH 018/172] build(deps): Bump pytz from 2021.3 to 2022.1 Bumps [pytz](https://github.com/stub42/pytz) from 2021.3 to 2022.1. - [Release notes](https://github.com/stub42/pytz/releases) - [Commits](https://github.com/stub42/pytz/compare/release_2021.3...release_2022.1) --- updated-dependencies: - dependency-name: pytz dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 1e1813127..ccecf2784 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ -pytz==2021.3 # https://github.com/stub42/pytz +pytz==2022.1 # https://github.com/stub42/pytz python-slugify==6.1.1 # https://github.com/un33k/python-slugify Pillow argon2-cffi==21.3.0 # https://github.com/hynek/argon2_cffi From b6bfd317b7399bc59da1fef869e34f554eca71a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:06:12 +0000 Subject: [PATCH 019/172] build(deps): Bump django-crispy-forms from 1.13.0 to 1.14.0 Bumps [django-crispy-forms](https://github.com/django-crispy-forms/django-crispy-forms) from 1.13.0 to 1.14.0. - [Release notes](https://github.com/django-crispy-forms/django-crispy-forms/releases) - [Changelog](https://github.com/django-crispy-forms/django-crispy-forms/blob/main/CHANGELOG.md) - [Commits](https://github.com/django-crispy-forms/django-crispy-forms/compare/1.13.0...1.14.0) --- updated-dependencies: - dependency-name: django-crispy-forms dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 1e1813127..8807e53e7 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -21,7 +21,7 @@ git+https://github.com/joke2k/django-environ@develop django-model-utils==4.2.0 # https://github.com/jazzband/django-model-utils django-dirtyfields>=1.7.0 # https://github.com/romgar/django-dirtyfields django-allauth>=0.49.0 # https://github.com/pennersr/django-allauth -django-crispy-forms==1.13.0 # https://github.com/django-crispy-forms/django-crispy-forms +django-crispy-forms==1.14.0 # https://github.com/django-crispy-forms/django-crispy-forms django-redis==5.2.0 # https://github.com/niwinz/django-redis # beta version required for Django 2.x django-modeltranslation>=0.17.2 # https://github.com/deschler/django-modeltranslation From 9af6ea67b67eee10d34b8d18c36aaed9e5487307 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:16:48 +0000 Subject: [PATCH 020/172] build(deps): Bump sphinx from 4.3.0 to 4.4.0 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 4.3.0 to 4.4.0. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/4.x/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v4.3.0...v4.4.0) --- updated-dependencies: - dependency-name: sphinx dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 48aad8509..22ddf4034 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -2,7 +2,7 @@ Werkzeug==2.0.2 # https://github.com/pallets/werkzeug ipdb==0.13.9 # https://github.com/gotcha/ipdb -Sphinx==4.3.0 # https://github.com/sphinx-doc/sphinx +Sphinx==4.4.0 # https://github.com/sphinx-doc/sphinx # TODO: Upgrade after moving to Django 3 psycopg2-binary==2.8.4 # https://github.com/psycopg/psycopg2 From 1983a3179e674c05c8348e5c25ce595b237f6d39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:24:20 +0000 Subject: [PATCH 021/172] build(deps): Bump requests from 2.26.0 to 2.27.1 Bumps [requests](https://github.com/psf/requests) from 2.26.0 to 2.27.1. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.26.0...v2.27.1) --- updated-dependencies: - dependency-name: requests dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/local.txt b/requirements/local.txt index 48aad8509..4f7756b72 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -2,7 +2,7 @@ Werkzeug==2.0.2 # https://github.com/pallets/werkzeug ipdb==0.13.9 # https://github.com/gotcha/ipdb -Sphinx==4.3.0 # https://github.com/sphinx-doc/sphinx +Sphinx==4.4.0 # https://github.com/sphinx-doc/sphinx # TODO: Upgrade after moving to Django 3 psycopg2-binary==2.8.4 # https://github.com/psycopg/psycopg2 @@ -12,7 +12,7 @@ mypy==0.910 # https://github.com/python/mypy pytest==6.2.5 # https://github.com/pytest-dev/pytest pytest-sugar==0.9.4 # https://github.com/Frozenball/pytest-sugar pytest-cov==3.0.0 -requests==2.26.0 +requests==2.27.1 iiif-prezi==0.3.0 # https://github.com/iiif-prezi/iiif-prezi httpretty==1.1.4 # https://pypi.org/project/httpretty/ #mock==4.0.2 From 7d893d50426819b8f2d98e53353f2cfe48bddf66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:24:24 +0000 Subject: [PATCH 022/172] build(deps): Bump django-celery-results from 2.2.0 to 2.3.0 Bumps [django-celery-results](https://github.com/celery/django-celery-results) from 2.2.0 to 2.3.0. - [Release notes](https://github.com/celery/django-celery-results/releases) - [Changelog](https://github.com/celery/django-celery-results/blob/master/Changelog) - [Commits](https://github.com/celery/django-celery-results/compare/v2.2.0...v2.3.0) --- updated-dependencies: - dependency-name: django-celery-results dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/local.txt b/requirements/local.txt index 48aad8509..4a9d9d3e0 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -2,7 +2,7 @@ Werkzeug==2.0.2 # https://github.com/pallets/werkzeug ipdb==0.13.9 # https://github.com/gotcha/ipdb -Sphinx==4.3.0 # https://github.com/sphinx-doc/sphinx +Sphinx==4.4.0 # https://github.com/sphinx-doc/sphinx # TODO: Upgrade after moving to Django 3 psycopg2-binary==2.8.4 # https://github.com/psycopg/psycopg2 @@ -42,4 +42,4 @@ pyopenssl # for running dev server under https Fabric3==1.14.post1 # https://github.com/mathiasertl/fabric celery==5.2.3 -django-celery-results==2.2.0 +django-celery-results==2.3.0 From 0cb4195943b85fb88155053c92048ff2a8ed3827 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:24:29 +0000 Subject: [PATCH 023/172] build(deps): Bump pylint-django from 2.4.4 to 2.5.2 Bumps [pylint-django](https://github.com/PyCQA/pylint-django) from 2.4.4 to 2.5.2. - [Release notes](https://github.com/PyCQA/pylint-django/releases) - [Changelog](https://github.com/PyCQA/pylint-django/blob/master/CHANGELOG.rst) - [Commits](https://github.com/PyCQA/pylint-django/compare/v2.4.4...v2.5.2) --- updated-dependencies: - dependency-name: pylint-django dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index ccecf2784..921582fde 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -39,7 +39,7 @@ django-compressor django-sass-processor # Django rules for PyLint -pylint-django==2.4.4 +pylint-django==2.5.2 # Wagtail wagtail==2.15 From b259072c00e75ab2b6b2c64ce18377af2d9240c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:24:47 +0000 Subject: [PATCH 024/172] build(deps): Bump gitpython from 3.1.24 to 3.1.27 Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.24 to 3.1.27. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.24...3.1.27) --- updated-dependencies: - dependency-name: gitpython dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index ccecf2784..3d22860da 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -51,7 +51,7 @@ wagtail-cache==1.0.2 # Import/Export django-import-export==2.6.1 -gitpython==3.1.24 +gitpython==3.1.27 # S3 Uploads boto3==1.21.22 From 9ea2deca3926034a585c641e4adf2f47ee35b26f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:25:18 +0000 Subject: [PATCH 025/172] build(deps): Bump faker from 9.8.2 to 13.3.2 Bumps [faker](https://github.com/joke2k/faker) from 9.8.2 to 13.3.2. - [Release notes](https://github.com/joke2k/faker/releases) - [Changelog](https://github.com/joke2k/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/joke2k/faker/compare/v9.8.2...v13.3.2) --- updated-dependencies: - dependency-name: faker dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index b003e7a07..b85a6086a 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -29,7 +29,7 @@ coveralls # Django # ------------------------------------------------------------------------------ factory-boy==3.2.1 # https://github.com/FactoryBoy/factory_boy -faker==9.8.2 +faker==13.3.2 django-debug-toolbar==3.2.4 # https://github.com/jazzband/django-debug-toolbar django-extensions==3.1.5 # https://github.com/django-extensions/django-extensions From 6caf8adf42a6c3ce952b86ad138d0cf429c41834 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:25:33 +0000 Subject: [PATCH 026/172] build(deps): Bump werkzeug from 2.0.2 to 2.0.3 Bumps [werkzeug](https://github.com/pallets/werkzeug) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/pallets/werkzeug/releases) - [Changelog](https://github.com/pallets/werkzeug/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/werkzeug/compare/2.0.2...2.0.3) --- updated-dependencies: - dependency-name: werkzeug dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index b003e7a07..245525dc9 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -1,6 +1,6 @@ -r ./base.txt -Werkzeug==2.0.2 # https://github.com/pallets/werkzeug +Werkzeug==2.0.3 # https://github.com/pallets/werkzeug ipdb==0.13.9 # https://github.com/gotcha/ipdb Sphinx==4.4.0 # https://github.com/sphinx-doc/sphinx # TODO: Upgrade after moving to Django 3 From 45d884a8a8ac3d98c6cc7bd941407b68d4db5346 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:25:34 +0000 Subject: [PATCH 027/172] build(deps): Bump psycopg2-binary from 2.8.4 to 2.9.3 Bumps [psycopg2-binary](https://github.com/psycopg/psycopg2) from 2.8.4 to 2.9.3. - [Release notes](https://github.com/psycopg/psycopg2/releases) - [Changelog](https://github.com/psycopg/psycopg2/blob/master/NEWS) - [Commits](https://github.com/psycopg/psycopg2/commits) --- updated-dependencies: - dependency-name: psycopg2-binary dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index b003e7a07..a0981c002 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -4,7 +4,7 @@ Werkzeug==2.0.2 # https://github.com/pallets/werkzeug ipdb==0.13.9 # https://github.com/gotcha/ipdb Sphinx==4.4.0 # https://github.com/sphinx-doc/sphinx # TODO: Upgrade after moving to Django 3 -psycopg2-binary==2.8.4 # https://github.com/psycopg/psycopg2 +psycopg2-binary==2.9.3 # https://github.com/psycopg/psycopg2 # Testing # ------------------------------------------------------------------------------ From 3e286c27e1f1ee6a4cee952cd5a9d06962a1a76e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:31:05 +0000 Subject: [PATCH 028/172] build(deps): Bump mypy from 0.910 to 0.941 Bumps [mypy](https://github.com/python/mypy) from 0.910 to 0.941. - [Release notes](https://github.com/python/mypy/releases) - [Commits](https://github.com/python/mypy/compare/v0.910...v0.941) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/requirements/local.txt b/requirements/local.txt index 22ddf4034..ee2139bd6 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -8,22 +8,22 @@ psycopg2-binary==2.8.4 # https://github.com/psycopg/psycopg2 # Testing # ------------------------------------------------------------------------------ -mypy==0.910 # https://github.com/python/mypy +mypy==0.941 # https://github.com/python/mypy pytest==6.2.5 # https://github.com/pytest-dev/pytest pytest-sugar==0.9.4 # https://github.com/Frozenball/pytest-sugar pytest-cov==3.0.0 -requests==2.26.0 +requests==2.27.1 iiif-prezi==0.3.0 # https://github.com/iiif-prezi/iiif-prezi httpretty==1.1.4 # https://pypi.org/project/httpretty/ #mock==4.0.2 -cssutils==2.3.0 # https://pypi.org/project/cssutils/ +cssutils==2.4.0 # https://pypi.org/project/cssutils/ pytest-django==4.5.2 # https://github.com/pytest-dev/pytest-django moto==3.1.1 # https://github.com/spulec/moto # Code quality # ------------------------------------------------------------------------------ flake8==4.0.1 # https://github.com/PyCQA/flake8 -coverage==6.1.2 # https://github.com/nedbat/coveragepy +coverage==6.3.2 # https://github.com/nedbat/coveragepy coveralls # Django @@ -31,7 +31,7 @@ coveralls factory-boy==3.2.1 # https://github.com/FactoryBoy/factory_boy faker==9.8.2 -django-debug-toolbar==3.2.2 # https://github.com/jazzband/django-debug-toolbar +django-debug-toolbar==3.2.4 # https://github.com/jazzband/django-debug-toolbar django-extensions==3.1.5 # https://github.com/django-extensions/django-extensions django-coverage-plugin==2.0.2 # https://github.com/nedbat/django_coverage_plugin pyopenssl # for running dev server under https @@ -42,4 +42,4 @@ pyopenssl # for running dev server under https Fabric3==1.14.post1 # https://github.com/mathiasertl/fabric celery==5.2.3 -django-celery-results==2.2.0 +django-celery-results==2.3.0 From 8aaee08cfa715f2ebbf2c49fdbfcb36304130ee7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:31:10 +0000 Subject: [PATCH 029/172] build(deps): Bump django-anymail[mailgun] from 8.4 to 8.5 Bumps [django-anymail[mailgun]](https://github.com/anymail/django-anymail) from 8.4 to 8.5. - [Release notes](https://github.com/anymail/django-anymail/releases) - [Changelog](https://github.com/anymail/django-anymail/blob/main/CHANGELOG.rst) - [Commits](https://github.com/anymail/django-anymail/compare/v8.4...v8.5) --- updated-dependencies: - dependency-name: django-anymail[mailgun] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/production.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/production.txt b/requirements/production.txt index 3f4fb7deb..b14d5f08d 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -8,4 +8,4 @@ raven==6.10.0 # https://github.com/getsentry/raven-python # Django # ------------------------------------------------------------------------------ -django-anymail[mailgun]==8.4 # https://github.com/anymail/django-anymail \ No newline at end of file +django-anymail[mailgun]==8.5 # https://github.com/anymail/django-anymail \ No newline at end of file From 0b7b57096a4a420ac6c18149cd2e84ec2f51354b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:31:59 +0000 Subject: [PATCH 030/172] build(deps): Bump django-import-export from 2.6.1 to 2.7.1 Bumps [django-import-export](https://github.com/django-import-export/django-import-export) from 2.6.1 to 2.7.1. - [Release notes](https://github.com/django-import-export/django-import-export/releases) - [Changelog](https://github.com/django-import-export/django-import-export/blob/main/docs/changelog.rst) - [Commits](https://github.com/django-import-export/django-import-export/compare/2.6.1...2.7.1) --- updated-dependencies: - dependency-name: django-import-export dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 3d0eff07c..e8a274d29 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -50,7 +50,7 @@ git+https://github.com/jcmundy/wagtail-autocomplete.git@master#egg=wagtail-autoc wagtail-cache==1.0.2 # Import/Export -django-import-export==2.6.1 +django-import-export==2.7.1 gitpython==3.1.27 # S3 Uploads From 60942a0831f85acfd66eeed93329e1f6926825ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 18:38:53 +0000 Subject: [PATCH 031/172] build(deps): Bump pytest from 6.2.5 to 7.1.1 Bumps [pytest](https://github.com/pytest-dev/pytest) from 6.2.5 to 7.1.1. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/6.2.5...7.1.1) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index c6daf9489..685865c08 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -9,7 +9,7 @@ psycopg2-binary==2.9.3 # https://github.com/psycopg/psycopg2 # Testing # ------------------------------------------------------------------------------ mypy==0.941 # https://github.com/python/mypy -pytest==6.2.5 # https://github.com/pytest-dev/pytest +pytest==7.1.1 # https://github.com/pytest-dev/pytest pytest-sugar==0.9.4 # https://github.com/Frozenball/pytest-sugar pytest-cov==3.0.0 requests==2.27.1 From b0db61ae31208ee44b2ae6f0af7759f42b154e33 Mon Sep 17 00:00:00 2001 From: Jay Varner Date: Mon, 21 Mar 2022 16:30:34 -0400 Subject: [PATCH 032/172] Bump Wagtail Version --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index e8a274d29..d27ef3358 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -42,7 +42,7 @@ django-sass-processor pylint-django==2.5.2 # Wagtail -wagtail==2.15 +wagtail==2.16.1 # wagtailmenus==2.13 git+https://github.com/jayvarner/wagtailmenus.git@master git+https://github.com/jcmundy/wagtail-autocomplete.git@master#egg=wagtail-autocomplete From ba1a9f601692c83e07a0680c7bc29ab64fa6fc8c Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Tue, 22 Mar 2022 15:19:46 -0400 Subject: [PATCH 033/172] Pass function, not called function, as pid default --- .../migrations/0026_alter_canvas_pid.py | 19 +++++++++++++++++++ .../migrations/0022_alter_collection_pid.py | 19 +++++++++++++++++++ .../migrations/0043_alter_manifest_pid.py | 19 +++++++++++++++++++ apps/iiif/models.py | 2 +- 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 apps/iiif/canvases/migrations/0026_alter_canvas_pid.py create mode 100644 apps/iiif/kollections/migrations/0022_alter_collection_pid.py create mode 100644 apps/iiif/manifests/migrations/0043_alter_manifest_pid.py diff --git a/apps/iiif/canvases/migrations/0026_alter_canvas_pid.py b/apps/iiif/canvases/migrations/0026_alter_canvas_pid.py new file mode 100644 index 000000000..7271462f3 --- /dev/null +++ b/apps/iiif/canvases/migrations/0026_alter_canvas_pid.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-03-22 19:11 + +import apps.utils.noid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('canvases', '0025_auto_20220316_1612'), + ] + + operations = [ + migrations.AlterField( + model_name='canvas', + name='pid', + field=models.CharField(default=apps.utils.noid.encode_noid, help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/kollections/migrations/0022_alter_collection_pid.py b/apps/iiif/kollections/migrations/0022_alter_collection_pid.py new file mode 100644 index 000000000..13a68fe33 --- /dev/null +++ b/apps/iiif/kollections/migrations/0022_alter_collection_pid.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-03-22 19:11 + +import apps.utils.noid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('kollections', '0021_auto_20220316_1612'), + ] + + operations = [ + migrations.AlterField( + model_name='collection', + name='pid', + field=models.CharField(default=apps.utils.noid.encode_noid, help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/manifests/migrations/0043_alter_manifest_pid.py b/apps/iiif/manifests/migrations/0043_alter_manifest_pid.py new file mode 100644 index 000000000..f869bd9e4 --- /dev/null +++ b/apps/iiif/manifests/migrations/0043_alter_manifest_pid.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-03-22 19:17 + +import apps.utils.noid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('manifests', '0042_auto_20220316_1612'), + ] + + operations = [ + migrations.AlterField( + model_name='manifest', + name='pid', + field=models.CharField(default=apps.utils.noid.encode_noid, help_text="Unique ID. Do not use _'s or spaces in the pid.", max_length=255), + ), + ] diff --git a/apps/iiif/models.py b/apps/iiif/models.py index ba44646aa..8b8749f96 100644 --- a/apps/iiif/models.py +++ b/apps/iiif/models.py @@ -9,7 +9,7 @@ class IiifBase(DirtyFieldsMixin, ClusterableModel): id = models.UUIDField(primary_key=True, default=uuid4, editable=True) pid = models.CharField( max_length=255, - default=encode_noid(), + default=encode_noid, blank=False, help_text="Unique ID. Do not use _'s or spaces in the pid." ) From ff85f1bab2fcb12e5de1317213f385cd2e619f4f Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Tue, 22 Mar 2022 15:30:35 -0400 Subject: [PATCH 034/172] Restrict Django version requirement to 3.x --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index d27ef3358..331e26ad2 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -15,7 +15,7 @@ git+https://github.com/ecds/python-edtf@214972b # ------------------------------------------------------------------------------ # TODO: To upgrade to Django 3, we have to redo the full text search on the manifest model. # TODO: When we get to update, check this re: summernote https://github.com/summernote/django-summernote/issues/449 -Django>=3.2.0 # https://www.djangoproject.com/ +Django>=3.2.0,<4.0 # https://www.djangoproject.com/ #django-environ==0.4.5 # https://github.com/joke2k/django-environ git+https://github.com/joke2k/django-environ@develop django-model-utils==4.2.0 # https://github.com/jazzband/django-model-utils From 6fcdd6b113032d8ec615ef7c1885a80cf0755215 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Mar 2022 19:57:16 +0000 Subject: [PATCH 035/172] build(deps): Bump boto3 from 1.21.22 to 1.21.23 Bumps [boto3](https://github.com/boto/boto3) from 1.21.22 to 1.21.23. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.21.22...1.21.23) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 331e26ad2..67fdc7f41 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -54,7 +54,7 @@ django-import-export==2.7.1 gitpython==3.1.27 # S3 Uploads -boto3==1.21.22 +boto3==1.21.23 django-storages==1.12.3 # https://github.com/jschneier/django-storages # Python function to stream unzip all the files in a ZIP archive, without loading the entire ZIP file into memory or any of its uncompressed files. From ae7e5651b32c0c3cb4272af02420e4eb8c4f2874 Mon Sep 17 00:00:00 2001 From: Jay Varner Date: Tue, 22 Mar 2022 08:45:34 -0400 Subject: [PATCH 036/172] Update CircleCI config and peg Django version --- .circleci/config.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 942fc6f32..4a20b1b0d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,7 +9,7 @@ version: 2.1 jobs: build: docker: - - image: circleci/python:3.8 + - image: cimg/python:3.8 environment: DATABASE_URL: postgres://root@127.0.0.1:5432/readux PGUSER: root @@ -17,7 +17,7 @@ jobs: AWS_SECRET_ACCESS_KEY: dummy-access-key-secret AWS_DEFAULT_REGION: us-east-1 DJANGO_ENV: test - - image: circleci/postgres:9.6.2-alpine + - image: cimg/postgres:10.19 environment: POSTGRES_USER: root POSTGRES_DB: readux @@ -29,6 +29,7 @@ jobs: key: deps1-{{ .Branch }}-{{ checksum "requirements/local.txt" }} - run: command: | + sudo apt update sudo apt install -y libjpeg-dev libopenjp2-7-dev libopenjp2-tools libssl-dev postgresql-client ruby-full mkdir logs && touch logs/debug.log sudo gem install bundler -v "$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n 1)" From c090e43b2a4ea9df070bf34cb498f72ea2338ade Mon Sep 17 00:00:00 2001 From: Jay Varner Date: Wed, 23 Mar 2022 09:17:49 -0400 Subject: [PATCH 037/172] Fix for CircleCI config --- .circleci/config.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4a20b1b0d..808852436 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -28,15 +28,25 @@ jobs: - restore_cache: key: deps1-{{ .Branch }}-{{ checksum "requirements/local.txt" }} - run: + name: Install System packages command: | sudo apt update sudo apt install -y libjpeg-dev libopenjp2-7-dev libopenjp2-tools libssl-dev postgresql-client ruby-full mkdir logs && touch logs/debug.log sudo gem install bundler -v "$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n 1)" + - run: + name: Install Ruby Stuff + command: | bundle install sudo gem install sass + - run: + name: Setup Virtual Environment + command: | python3 -m venv venv - . venv/bin/activate + source venv/bin/activate + - run: + name: Install Python Stuff and Setup App + command: | pip install --upgrade pip pip install pyld==1.0.5 pip install -r requirements/local.txt From c54e1beb923c47695e95a4b3d29243c7f04c858f Mon Sep 17 00:00:00 2001 From: Jay Varner Date: Wed, 23 Mar 2022 09:20:20 -0400 Subject: [PATCH 038/172] Fix for Coveralls report --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 808852436..799c5dbe4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -58,12 +58,12 @@ jobs: - run: name: Running tests command: | - . venv/bin/activate + source venv/bin/activate DJANGO_ENV=test pytest apps/ --cov=./apps - run: name: Sending Coverage Report when: on_success command: | - . venv/bin/activate + source venv/bin/activate ./venv/bin/coveralls From f1132904d59f3e83d82ce95e58e3e0ee030d316b Mon Sep 17 00:00:00 2001 From: Jay Varner Date: Wed, 23 Mar 2022 09:31:42 -0400 Subject: [PATCH 039/172] Remove virtual environment from CircleCI --- .circleci/config.yml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 799c5dbe4..55bdc0345 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -39,11 +39,6 @@ jobs: command: | bundle install sudo gem install sass - - run: - name: Setup Virtual Environment - command: | - python3 -m venv venv - source venv/bin/activate - run: name: Install Python Stuff and Setup App command: | @@ -51,19 +46,13 @@ jobs: pip install pyld==1.0.5 pip install -r requirements/local.txt cp config/settings/local.dst config/settings/local.py - - save_cache: - key: deps1-{{ .Branch }}-{{ checksum "requirements/local.txt" }} - paths: - - "venv" - run: name: Running tests command: | - source venv/bin/activate DJANGO_ENV=test pytest apps/ --cov=./apps - run: name: Sending Coverage Report when: on_success command: | - source venv/bin/activate - ./venv/bin/coveralls + coveralls From 87f2cb8cd17420f5a40727aa96482f557ed176ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Mar 2022 13:44:53 +0000 Subject: [PATCH 040/172] build(deps): Bump boto3 from 1.21.23 to 1.21.24 Bumps [boto3](https://github.com/boto/boto3) from 1.21.23 to 1.21.24. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.21.23...1.21.24) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 67fdc7f41..04b6c8b35 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -54,7 +54,7 @@ django-import-export==2.7.1 gitpython==3.1.27 # S3 Uploads -boto3==1.21.23 +boto3==1.21.24 django-storages==1.12.3 # https://github.com/jschneier/django-storages # Python function to stream unzip all the files in a ZIP archive, without loading the entire ZIP file into memory or any of its uncompressed files. From edf74a0f300a1c1683d4bea95fa9719ecb75112d Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Wed, 23 Mar 2022 14:46:40 -0400 Subject: [PATCH 041/172] Install django-elasticsearch-dsl --- requirements/base.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 04b6c8b35..6f733acdf 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -64,4 +64,7 @@ stream-unzip>=0.0.58 -e git+https://github.com/emory-libraries-ecds/digitaledition-jekylltheme.git@readux_2#egg=digitaledition-jekylltheme # List of BCP 47 language codes -bcp47==0.0.4 # https://github.com/highfestiva/bcp47.py \ No newline at end of file +bcp47==0.0.4 # https://github.com/highfestiva/bcp47.py + +# Elasticsearch +django-elasticsearch-dsl>=7.0.0 \ No newline at end of file From 43e3b463d0f84e16e678e6e4273c2dbd34021231 Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Wed, 23 Mar 2022 14:46:58 -0400 Subject: [PATCH 042/172] Add django-elasticsearch-dsl to configs --- config/settings/base.py | 1 + config/settings/local.dst | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/config/settings/base.py b/config/settings/base.py index ce99959ef..10fc896b1 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -84,6 +84,7 @@ 'corsheaders', 'crispy_forms', 'django_celery_results', + 'django_elasticsearch_dsl', 'modelcluster', 'sass_processor', 'storages', diff --git a/config/settings/local.dst b/config/settings/local.dst index 0cdbb5389..2914ad204 100644 --- a/config/settings/local.dst +++ b/config/settings/local.dst @@ -165,3 +165,12 @@ LOGGING = { }, }, } + +# Elasticsearch +# ------------------------------------------------------------------------------ + +ELASTICSEARCH_DSL={ + 'default': { + 'hosts': 'localhost:9200' # Must be configured to the host and port running Elasticsearch + }, +} From 6367df7f8198b3200ea8c3a2a977d529f8266508 Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Wed, 23 Mar 2022 14:53:50 -0400 Subject: [PATCH 043/172] Index initial fields in Elasticsearch --- apps/iiif/manifests/documents.py | 70 +++++++++++++++++++++ apps/iiif/manifests/tests/test_documents.py | 63 +++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 apps/iiif/manifests/documents.py create mode 100644 apps/iiif/manifests/tests/test_documents.py diff --git a/apps/iiif/manifests/documents.py b/apps/iiif/manifests/documents.py new file mode 100644 index 000000000..52b16b6e1 --- /dev/null +++ b/apps/iiif/manifests/documents.py @@ -0,0 +1,70 @@ +"""Elasticsearch indexing rules for IIIF manifests""" + +from django_elasticsearch_dsl import Document, fields +from django_elasticsearch_dsl.registries import registry +from elasticsearch_dsl import analyzer +from .models import Manifest + +html_strip = analyzer( + 'html_strip', + tokenizer="standard", + filter=["lowercase", "stop", "snowball"], + char_filter=["html_strip"] +) + +@registry.register_document +class ManifestDocument(Document): + """Elasticsearch Document class for IIIF Manifest""" + + # fields to map explicitly in Elasticsearch + authors = fields.TextField(multi=True) + collections = fields.NestedField(properties={ + 'summary': fields.TextField(analyzer=html_strip), + 'attribution': fields.TextField(), + 'pid': fields.TextField(), + 'label': fields.TextField(), + }) + # TODO: date = DateRange() + has_pdf = fields.BooleanField() + # TODO: languages = fields.TextField() + summary = fields.TextField(analyzer=html_strip) + + class Index: + """Settings for Elasticsearch""" + name = 'manifests' + + class Django: + """Settings for automatically pulling data from Django""" + model = Manifest + + # fields to map dynamically in Elasticsearch + fields = [ + 'attribution', + 'label', + 'license', + 'pid', + 'published_city', + 'publisher', + 'viewingdirection', + ] + related_models = ['collections'] + # we can give these fields individual boosts using caret notation when searching, + # for example: + # query = MultiMatch(query="test", fields=["pid", "label^3", "summary"]) + # search = ManifestDocument.search().query(query) + + def prepare_authors(self, instance): + """convert authors string into list""" + if instance.author: + return [s.strip() for s in instance.author.split(";")] + return [] + + def prepare_has_pdf(self, instance): + """convert pdf field into boolean""" + return bool(instance.pdf) + + def get_queryset(self): + """prefetch related to improve performance""" + return super().get_queryset().prefetch_related( + 'collections' + ) diff --git a/apps/iiif/manifests/tests/test_documents.py b/apps/iiif/manifests/tests/test_documents.py new file mode 100644 index 000000000..55fd656cb --- /dev/null +++ b/apps/iiif/manifests/tests/test_documents.py @@ -0,0 +1,63 @@ +""" +Test class for Elasticsearch indexing. +""" + +from django.test import TestCase +from apps.iiif.kollections.models import Collection +from apps.iiif.manifests.documents import ManifestDocument +from apps.iiif.manifests.tests.factories import ManifestFactory + +class ManifestDocumentTest(TestCase): + """Tests for IIIF manifest indexing""" + def setUp(self): + self.doc = ManifestDocument() + + def test_prepare_authors(self): + """Test authors returned as array instead of string""" + # test no author + manifest = ManifestFactory.create() + assert self.doc.prepare_authors(instance=manifest) == [] + # test empty string + manifest.author = "" + assert self.doc.prepare_authors(instance=manifest) == [] + # test no semicolon + manifest.author = "test author" + assert self.doc.prepare_authors(instance=manifest) == ["test author"] + # test semicolon separation + manifest.author = "test author;example author;ben" + assert self.doc.prepare_authors(instance=manifest) == [ + "test author", "example author", "ben" + ] + # test whitespace stripping + manifest.author = "test author; example author; ben" + assert self.doc.prepare_authors(instance=manifest) == [ + "test author", "example author", "ben" + ] + + def test_prepare_has_pdf(self): + """Test PDF presence detected accurately""" + # test no pdf + manifest = ManifestFactory.create() + assert not self.doc.prepare_has_pdf(instance=manifest) + # test empty string + manifest.pdf = "" + assert not self.doc.prepare_has_pdf(instance=manifest) + # test with pdf + manifest.pdf = "url" + assert self.doc.prepare_has_pdf(instance=manifest) + + def test_get_queryset(self): + """Test prefetching""" + manifest = ManifestFactory.create() + # connect a collection and manifest + collection = Collection(label="test collection") + collection.save() + manifest.collections.add(collection) + # get prefetched objects cache for elastic queryset + qs_manifest = self.doc.get_queryset().first() + prefetched = qs_manifest._prefetched_objects_cache # pylint: disable=protected-access + # should be a dict of prefetched relations + assert isinstance(prefetched, dict) + # should have one collection, which is the above collection + assert prefetched['collections'].count() == 1 + assert prefetched['collections'].first().pk == collection.pk From 59a581b6ddc0ee085b4d5c713d02622123506c57 Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Wed, 23 Mar 2022 15:37:54 -0400 Subject: [PATCH 044/172] Setup Elasticsearch in CircleCI --- .circleci/config.yml | 10 ++++++++++ config/settings/base.py | 8 ++++++++ config/settings/local.dst | 6 +----- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 55bdc0345..69b33012e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -17,12 +17,22 @@ jobs: AWS_SECRET_ACCESS_KEY: dummy-access-key-secret AWS_DEFAULT_REGION: us-east-1 DJANGO_ENV: test + ELASTICSEARCH_URL: 127.0.0.1:9200 - image: cimg/postgres:10.19 environment: POSTGRES_USER: root POSTGRES_DB: readux - image: cimg/ruby:2.5-node - image: cimg/rust:1.59.0 + - image: docker.elastic.co/elasticsearch/elasticsearch:8.1.1 + environment: + - cluster.name: readux_elasticsearch + - xpack.security.enabled: false + - transport.host: localhost + - network.host: 127.0.0.1 + - http.port: 9200 + - discovery.type: single-node + steps: - checkout - restore_cache: diff --git a/config/settings/base.py b/config/settings/base.py index 10fc896b1..4090d606b 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -333,3 +333,11 @@ # CORS HEADERS CORS_ORIGIN_ALLOW_ALL = True + +# Elasticsearch + +ELASTICSEARCH_DSL={ + 'default': { + 'hosts': env.db('ELASTICSEARCH_URL', default='localhost:9200') + }, +} diff --git a/config/settings/local.dst b/config/settings/local.dst index 2914ad204..2db326763 100644 --- a/config/settings/local.dst +++ b/config/settings/local.dst @@ -169,8 +169,4 @@ LOGGING = { # Elasticsearch # ------------------------------------------------------------------------------ -ELASTICSEARCH_DSL={ - 'default': { - 'hosts': 'localhost:9200' # Must be configured to the host and port running Elasticsearch - }, -} +ELASTICSEARCH_URL = 'localhost:9200' # Must be configured to the host and port running Elasticsearch From e3c378000de6f345b67b7100555a886b630dfaf0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Mar 2022 10:30:11 +0000 Subject: [PATCH 045/172] build(deps): Bump boto3 from 1.21.24 to 1.21.25 Bumps [boto3](https://github.com/boto/boto3) from 1.21.24 to 1.21.25. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.21.24...1.21.25) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 04b6c8b35..e1d2a3076 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -54,7 +54,7 @@ django-import-export==2.7.1 gitpython==3.1.27 # S3 Uploads -boto3==1.21.24 +boto3==1.21.25 django-storages==1.12.3 # https://github.com/jschneier/django-storages # Python function to stream unzip all the files in a ZIP archive, without loading the entire ZIP file into memory or any of its uncompressed files. From 612219b403b7a3d6a9622f4e915c5a454216e408 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Mar 2022 10:30:26 +0000 Subject: [PATCH 046/172] build(deps): Bump faker from 13.3.2 to 13.3.3 Bumps [faker](https://github.com/joke2k/faker) from 13.3.2 to 13.3.3. - [Release notes](https://github.com/joke2k/faker/releases) - [Changelog](https://github.com/joke2k/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/joke2k/faker/compare/v13.3.2...v13.3.3) --- updated-dependencies: - dependency-name: faker dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 685865c08..4806281fc 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -29,7 +29,7 @@ coveralls # Django # ------------------------------------------------------------------------------ factory-boy==3.2.1 # https://github.com/FactoryBoy/factory_boy -faker==13.3.2 +faker==13.3.3 django-debug-toolbar==3.2.4 # https://github.com/jazzband/django-debug-toolbar django-extensions==3.1.5 # https://github.com/django-extensions/django-extensions From c254ad3b64ac1021d18186d744356b5d6484d282 Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Thu, 24 Mar 2022 12:26:11 -0400 Subject: [PATCH 047/172] Fix elasticsearch config for CircleCI --- .circleci/config.yml | 11 +++++++---- config/settings/base.py | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 69b33012e..a89726e61 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,12 +24,11 @@ jobs: POSTGRES_DB: readux - image: cimg/ruby:2.5-node - image: cimg/rust:1.59.0 - - image: docker.elastic.co/elasticsearch/elasticsearch:8.1.1 + - image: docker.elastic.co/elasticsearch/elasticsearch:7.17.1 environment: - - cluster.name: readux_elasticsearch + - STACK_VERSION: 7.17.1 - xpack.security.enabled: false - - transport.host: localhost - - network.host: 127.0.0.1 + - cluster.name: readux-elasticsearch - http.port: 9200 - discovery.type: single-node @@ -56,6 +55,10 @@ jobs: pip install pyld==1.0.5 pip install -r requirements/local.txt cp config/settings/local.dst config/settings/local.py + - run: + name: Wait for Elasticsearch startup + command: | + dockerize -wait tcp://localhost:9200 - run: name: Running tests command: | diff --git a/config/settings/base.py b/config/settings/base.py index 4090d606b..119ebbf12 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -338,6 +338,6 @@ ELASTICSEARCH_DSL={ 'default': { - 'hosts': env.db('ELASTICSEARCH_URL', default='localhost:9200') + 'hosts': env('ELASTICSEARCH_URL', default='http://localhost:9200') }, } From 0b87eb06c14ca84dc285980777f9d4395e85432d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Mar 2022 10:24:08 +0000 Subject: [PATCH 048/172] build(deps): Bump mypy from 0.941 to 0.942 Bumps [mypy](https://github.com/python/mypy) from 0.941 to 0.942. - [Release notes](https://github.com/python/mypy/releases) - [Commits](https://github.com/python/mypy/compare/v0.941...v0.942) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 4806281fc..fa7fd5133 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -8,7 +8,7 @@ psycopg2-binary==2.9.3 # https://github.com/psycopg/psycopg2 # Testing # ------------------------------------------------------------------------------ -mypy==0.941 # https://github.com/python/mypy +mypy==0.942 # https://github.com/python/mypy pytest==7.1.1 # https://github.com/pytest-dev/pytest pytest-sugar==0.9.4 # https://github.com/Frozenball/pytest-sugar pytest-cov==3.0.0 From 36fd428a54da6008498bbd7fea5d05e67b926f95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Mar 2022 10:26:58 +0000 Subject: [PATCH 049/172] build(deps): Bump pylint-django from 2.5.2 to 2.5.3 Bumps [pylint-django](https://github.com/PyCQA/pylint-django) from 2.5.2 to 2.5.3. - [Release notes](https://github.com/PyCQA/pylint-django/releases) - [Changelog](https://github.com/PyCQA/pylint-django/blob/master/CHANGELOG.rst) - [Commits](https://github.com/PyCQA/pylint-django/compare/v2.5.2...v2.5.3) --- updated-dependencies: - dependency-name: pylint-django dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index e1d2a3076..756f04769 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -39,7 +39,7 @@ django-compressor django-sass-processor # Django rules for PyLint -pylint-django==2.5.2 +pylint-django==2.5.3 # Wagtail wagtail==2.16.1 From 59772a0a606cb80ad5548447b96f5492516bf785 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Mar 2022 10:27:18 +0000 Subject: [PATCH 050/172] build(deps): Bump sphinx from 4.4.0 to 4.5.0 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 4.4.0 to 4.5.0. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/4.x/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v4.4.0...v4.5.0) --- updated-dependencies: - dependency-name: sphinx dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 4806281fc..2bcef290b 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -2,7 +2,7 @@ Werkzeug==2.0.3 # https://github.com/pallets/werkzeug ipdb==0.13.9 # https://github.com/gotcha/ipdb -Sphinx==4.4.0 # https://github.com/sphinx-doc/sphinx +Sphinx==4.5.0 # https://github.com/sphinx-doc/sphinx # TODO: Upgrade after moving to Django 3 psycopg2-binary==2.9.3 # https://github.com/psycopg/psycopg2 From 0ca04b7b9dcc2ab9a5f90593314ddbfc0e8888cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Mar 2022 10:27:36 +0000 Subject: [PATCH 051/172] build(deps): Bump moto from 3.1.1 to 3.1.3 Bumps [moto](https://github.com/spulec/moto) from 3.1.1 to 3.1.3. - [Release notes](https://github.com/spulec/moto/releases) - [Changelog](https://github.com/spulec/moto/blob/master/CHANGELOG.md) - [Commits](https://github.com/spulec/moto/compare/3.1.1...3.1.3) --- updated-dependencies: - dependency-name: moto dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 4806281fc..7ec12b047 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -18,7 +18,7 @@ httpretty==1.1.4 # https://pypi.org/project/httpretty/ #mock==4.0.2 cssutils==2.4.0 # https://pypi.org/project/cssutils/ pytest-django==4.5.2 # https://github.com/pytest-dev/pytest-django -moto==3.1.1 # https://github.com/spulec/moto +moto==3.1.3 # https://github.com/spulec/moto # Code quality # ------------------------------------------------------------------------------ From b504f20e597e955f71fceea8aec82b33ea24535b Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Mon, 28 Mar 2022 16:12:17 -0400 Subject: [PATCH 052/172] Add basic view logic and tests for keyword search --- apps/iiif/manifests/documents.py | 35 ++++++++--------- apps/iiif/manifests/tests/test_documents.py | 4 +- apps/readux/forms.py | 17 +++++++++ apps/readux/tests/test_views.py | 42 ++++++++++++++++++++- apps/readux/views.py | 37 +++++++++++++++++- 5 files changed, 112 insertions(+), 23 deletions(-) create mode 100644 apps/readux/forms.py diff --git a/apps/iiif/manifests/documents.py b/apps/iiif/manifests/documents.py index 52b16b6e1..90dcdc42b 100644 --- a/apps/iiif/manifests/documents.py +++ b/apps/iiif/manifests/documents.py @@ -6,7 +6,7 @@ from .models import Manifest html_strip = analyzer( - 'html_strip', + "html_strip", tokenizer="standard", filter=["lowercase", "stop", "snowball"], char_filter=["html_strip"] @@ -19,10 +19,10 @@ class ManifestDocument(Document): # fields to map explicitly in Elasticsearch authors = fields.TextField(multi=True) collections = fields.NestedField(properties={ - 'summary': fields.TextField(analyzer=html_strip), - 'attribution': fields.TextField(), - 'pid': fields.TextField(), - 'label': fields.TextField(), + "summary": fields.TextField(analyzer=html_strip), + "attribution": fields.TextField(), + "pid": fields.TextField(), + "label": fields.TextField(), }) # TODO: date = DateRange() has_pdf = fields.BooleanField() @@ -31,27 +31,24 @@ class ManifestDocument(Document): class Index: """Settings for Elasticsearch""" - name = 'manifests' + name = "manifests" class Django: """Settings for automatically pulling data from Django""" model = Manifest + queryset_pagination = 25 # fields to map dynamically in Elasticsearch fields = [ - 'attribution', - 'label', - 'license', - 'pid', - 'published_city', - 'publisher', - 'viewingdirection', + "attribution", + "label", + "license", + "pid", + "published_city", + "publisher", + "viewingdirection", ] - related_models = ['collections'] - # we can give these fields individual boosts using caret notation when searching, - # for example: - # query = MultiMatch(query="test", fields=["pid", "label^3", "summary"]) - # search = ManifestDocument.search().query(query) + related_models = ["collections"] def prepare_authors(self, instance): """convert authors string into list""" @@ -66,5 +63,5 @@ def prepare_has_pdf(self, instance): def get_queryset(self): """prefetch related to improve performance""" return super().get_queryset().prefetch_related( - 'collections' + "collections" ) diff --git a/apps/iiif/manifests/tests/test_documents.py b/apps/iiif/manifests/tests/test_documents.py index 55fd656cb..8b3ef994c 100644 --- a/apps/iiif/manifests/tests/test_documents.py +++ b/apps/iiif/manifests/tests/test_documents.py @@ -3,13 +3,15 @@ """ from django.test import TestCase +from django_elasticsearch_dsl.test import ESTestCase from apps.iiif.kollections.models import Collection from apps.iiif.manifests.documents import ManifestDocument from apps.iiif.manifests.tests.factories import ManifestFactory -class ManifestDocumentTest(TestCase): +class ManifestDocumentTest(ESTestCase, TestCase): """Tests for IIIF manifest indexing""" def setUp(self): + super().setUp() self.doc = ManifestDocument() def test_prepare_authors(self): diff --git a/apps/readux/forms.py b/apps/readux/forms.py new file mode 100644 index 000000000..5a5ee4f00 --- /dev/null +++ b/apps/readux/forms.py @@ -0,0 +1,17 @@ +"""Forms for Readux search""" + +from django import forms + +class ManifestSearchForm(forms.Form): + """Django form for searching Manifests via Elasticsearch""" + query = forms.CharField( + label="Search by word or phrase", + required=False, + widget=forms.TextInput( + attrs={ + "placeholder": "Search by word or phrase", + "aria-label": "Search by word or phrase", + "type": "search", + } + ), + ) diff --git a/apps/readux/tests/test_views.py b/apps/readux/tests/test_views.py index 913ebeef0..e0ffc0934 100644 --- a/apps/readux/tests/test_views.py +++ b/apps/readux/tests/test_views.py @@ -1,8 +1,9 @@ import os +from unittest.mock import Mock import pytest from tempfile import gettempdir from pathlib import Path -from django.test import RequestFactory +from django.test import RequestFactory, TestCase from django.http import HttpResponse from apps.readux import views from apps.iiif.manifests.models import Manifest @@ -12,6 +13,7 @@ from apps.iiif.canvases.models import Canvas from apps.users.tests.factories import UserFactory import config.settings.local as settings +from django_elasticsearch_dsl.test import ESTestCase pytestmark = pytest.mark.django_db @@ -74,3 +76,41 @@ def test_export_download_zip(self): assert response.status_code == 200 assert isinstance(response.serialize(), bytes) assert 'jekyll_site_export.zip' in str(response.serialize()) + +class TestVolumeSearchView(ESTestCase, TestCase): + """View tests for Elasticsearch""" + + def setUp(self): + """Populate tests with sample data""" + super().setUp() + self.volume1 = Manifest(label="primary", summary="test") + self.volume1.save() + self.volume2 = Manifest(label="secondary", summary="test") + self.volume2.save() + self.volume3 = Manifest(label="tertiary", summary="secondary") + self.volume3.save() + + def test_get_queryset(self): + """Should be able to query by search term""" + volume_search_view = views.VolumeSearchView() + volume_search_view.request = Mock() + volume_search_view.request.GET = {"query": "primary"} + volumes_queryset = volume_search_view.get_queryset() + assert volumes_queryset.count() == 1 + assert volumes_queryset.first().pk == self.volume1.pk + + # should get all volumes when request is empty + volume_search_view.request.GET = {} + volumes_queryset = volume_search_view.get_queryset() + assert volumes_queryset.count() == 3 + + def test_label_boost(self): + """Should return the item matching label first, before matching summary""" + volume_search_view = views.VolumeSearchView() + volume_search_view.request = Mock() + volume_search_view.request.GET = {"query": "secondary test"} + volumes_queryset = volume_search_view.get_queryset() + # with multiple keywords, should return all matches + assert volumes_queryset.count() == 3 + # should return "secondary" label match first + assert volumes_queryset.first().pk == self.volume2.pk diff --git a/apps/readux/views.py b/apps/readux/views.py index 595d28fed..32cfe3b2b 100644 --- a/apps/readux/views.py +++ b/apps/readux/views.py @@ -5,11 +5,12 @@ from django.views.generic import ListView from django.views.generic.base import TemplateView, View from django.views.generic.edit import FormMixin -from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank from django.contrib.sitemaps import Sitemap from django.db.models import Max, Q, Count from django.urls import reverse -from django.utils.datastructures import MultiValueDictKeyError +from elasticsearch_dsl.query import MultiMatch +from apps.iiif.manifests.documents import ManifestDocument +from apps.readux.forms import ManifestSearchForm import config.settings.local as settings from apps.export.export import JekyllSiteExport from apps.export.forms import JekyllExportForm @@ -314,6 +315,38 @@ def get(self, request, *args, **kwargs): resp['Content-Disposition'] = 'attachment; filename=jekyll_site_export.zip' return resp +class VolumeSearchView(ListView, FormMixin): + """View to search across all volumes with Elasticsearch""" + model = Manifest + form_class = ManifestSearchForm + template_name = "search_results.html" + paginate_by = 25 + # default fields to search when using query box; ^ with number indicates a boosted field + query_search_fields = ["pid", "label^3", "summary", "authors"] + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + # use GET for form data so that query params appear in URL + form_data = self.request.GET.copy() + kwargs["data"] = form_data + return kwargs + + def get_queryset(self): + form = self.get_form() + if not form.is_valid(): + return Manifest.objects.none() + + volumes = ManifestDocument.search() + + form_data = form.cleaned_data + # default to empty string if no query in form data + search_query = form_data.get("query", "") + if search_query: + multimatch_query = MultiMatch(query=search_query, fields=self.query_search_fields) + volumes = volumes.query(multimatch_query) + return volumes.to_queryset() + + # TODO: Replace with Elasticsearch # class VolumeSearch(ListView): # '''Search across all volumes.''' From 4546ba7873f212a7fe5a307f4775028d758083fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 10:27:16 +0000 Subject: [PATCH 053/172] build(deps): Bump boto3 from 1.21.25 to 1.21.28 Bumps [boto3](https://github.com/boto/boto3) from 1.21.25 to 1.21.28. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.21.25...1.21.28) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index e1d2a3076..3223707e6 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -54,7 +54,7 @@ django-import-export==2.7.1 gitpython==3.1.27 # S3 Uploads -boto3==1.21.25 +boto3==1.21.28 django-storages==1.12.3 # https://github.com/jschneier/django-storages # Python function to stream unzip all the files in a ZIP archive, without loading the entire ZIP file into memory or any of its uncompressed files. From 2fac69f93342a37d1a4d3a6c729faa0d0d703cb5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 10:27:39 +0000 Subject: [PATCH 054/172] build(deps): Bump faker from 13.3.3 to 13.3.4 Bumps [faker](https://github.com/joke2k/faker) from 13.3.3 to 13.3.4. - [Release notes](https://github.com/joke2k/faker/releases) - [Changelog](https://github.com/joke2k/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/joke2k/faker/compare/v13.3.3...v13.3.4) --- updated-dependencies: - dependency-name: faker dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 4806281fc..4df06cbf6 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -29,7 +29,7 @@ coveralls # Django # ------------------------------------------------------------------------------ factory-boy==3.2.1 # https://github.com/FactoryBoy/factory_boy -faker==13.3.3 +faker==13.3.4 django-debug-toolbar==3.2.4 # https://github.com/jazzband/django-debug-toolbar django-extensions==3.1.5 # https://github.com/django-extensions/django-extensions From 0accb0cb575f91ab824e80e86049fd8180fc57dd Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Tue, 29 Mar 2022 11:03:03 -0400 Subject: [PATCH 055/172] Add migration to remove manifest search index --- .../0044_remove_manifest_search_index.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 apps/iiif/manifests/migrations/0044_remove_manifest_search_index.py diff --git a/apps/iiif/manifests/migrations/0044_remove_manifest_search_index.py b/apps/iiif/manifests/migrations/0044_remove_manifest_search_index.py new file mode 100644 index 000000000..f8380e232 --- /dev/null +++ b/apps/iiif/manifests/migrations/0044_remove_manifest_search_index.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.12 on 2022-03-28 21:01 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('manifests', '0043_alter_manifest_pid'), + ] + + operations = [ + migrations.RemoveIndex( + model_name='manifest', + name='manifests_m_search__bd83b2_gin', + ), + ] From 852bb292e49c1f44438124068c256de2708e9408 Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Tue, 29 Mar 2022 11:49:42 -0400 Subject: [PATCH 056/172] Add new Language model and migrations --- apps/iiif/manifests/forms.py | 7 ++-- .../0045_alter_valuebylanguage_language.py | 18 ++++++++++ .../migrations/0046_add_language_model.py | 35 +++++++++++++++++++ .../0047_add_languages_to_manifest.py | 24 +++++++++++++ apps/iiif/manifests/models.py | 13 +++++-- 5 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 apps/iiif/manifests/migrations/0045_alter_valuebylanguage_language.py create mode 100644 apps/iiif/manifests/migrations/0046_add_language_model.py create mode 100644 apps/iiif/manifests/migrations/0047_add_languages_to_manifest.py diff --git a/apps/iiif/manifests/forms.py b/apps/iiif/manifests/forms.py index 9f3e20675..f6aea27af 100644 --- a/apps/iiif/manifests/forms.py +++ b/apps/iiif/manifests/forms.py @@ -2,7 +2,7 @@ import logging from django import forms from django.contrib.admin import site as admin_site, widgets -from .models import Manifest +from .models import Language, Manifest from ..canvases.models import Canvas LOGGER = logging.getLogger(__name__) @@ -17,11 +17,14 @@ ) class ManifestAdminForm(forms.ModelForm): + """Form for adding or changing a manifest""" + # sort language list by name + languages = forms.ModelMultipleChoiceField(queryset=Language.objects.order_by("name")) class Meta: model = Manifest fields = ( 'id', 'pid', 'label', 'summary', 'author', - 'published_city', 'published_date', 'published_date_edtf', 'publisher', 'language', + 'published_city', 'published_date', 'published_date_edtf', 'publisher', 'languages', 'pdf', 'metadata', 'viewingdirection', 'collections', 'image_server', 'start_canvas', 'attribution', 'logo', 'license', 'scanned_by', 'identifier', 'identifier_uri' ) diff --git a/apps/iiif/manifests/migrations/0045_alter_valuebylanguage_language.py b/apps/iiif/manifests/migrations/0045_alter_valuebylanguage_language.py new file mode 100644 index 000000000..c0d660bea --- /dev/null +++ b/apps/iiif/manifests/migrations/0045_alter_valuebylanguage_language.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-03-28 21:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('manifests', '0044_remove_manifest_search_index'), + ] + + operations = [ + migrations.AlterField( + model_name='valuebylanguage', + name='language', + field=models.CharField(choices=[('aa', 'Afar'), ('aa-DJ', 'Afar - Djibouti'), ('aa-ER', 'Afar - Eritrea'), ('aa-ET', 'Afar - Ethiopia'), ('af', 'Afrikaans'), ('af-NA', 'Afrikaans - Namibia'), ('af-ZA', 'Afrikaans - South Africa'), ('agq', 'Aghem'), ('agq-CM', 'Aghem - Cameroon'), ('ak', 'Akan'), ('ak-GH', 'Akan - Ghana'), ('sq', 'Albanian'), ('sq-AL', 'Albanian - Albania'), ('sq-MK', 'Albanian - North Macedonia'), ('gsw', 'Alsatian'), ('gsw-FR', 'Alsatian - France'), ('gsw-LI', 'Alsatian - Liechtenstein'), ('gsw-CH', 'Alsatian - Switzerland'), ('am', 'Amharic'), ('am-ET', 'Amharic - Ethiopia'), ('ar', 'Arabic'), ('ar-DZ', 'Arabic - Algeria'), ('ar-BH', 'Arabic - Bahrain'), ('ar-TD', 'Arabic - Chad'), ('ar-KM', 'Arabic - Comoros'), ('ar-DJ', 'Arabic - Djibouti'), ('ar-EG', 'Arabic - Egypt'), ('ar-ER', 'Arabic - Eritrea'), ('ar-IQ', 'Arabic - Iraq'), ('ar-IL', 'Arabic - Israel'), ('ar-JO', 'Arabic - Jordan'), ('ar-KW', 'Arabic - Kuwait'), ('ar-LB', 'Arabic - Lebanon'), ('ar-LY', 'Arabic - Libya'), ('ar-MR', 'Arabic - Mauritania'), ('ar-MA', 'Arabic - Morocco'), ('ar-OM', 'Arabic - Oman'), ('ar-PS', 'Arabic - Palestinian Authority'), ('ar-QA', 'Arabic - Qatar'), ('ar-SA', 'Arabic - Saudi Arabia'), ('ar-SO', 'Arabic - Somalia'), ('ar-SS', 'Arabic - South Sudan'), ('ar-SD', 'Arabic - Sudan'), ('ar-SY', 'Arabic - Syria'), ('ar-TN', 'Arabic - Tunisia'), ('ar-AE', 'Arabic - U.A.E.'), ('ar-001', 'Arabic - World'), ('ar-YE', 'Arabic - Yemen'), ('hy', 'Armenian'), ('hy-AM', 'Armenian - Armenia'), ('as', 'Assamese'), ('as-IN', 'Assamese - India'), ('ast', 'Asturian'), ('ast-ES', 'Asturian - Spain'), ('asa', 'Asu'), ('asa-TZ', 'Asu - Tanzania'), ('az-Cyrl', 'Azerbaijani (Cyrillic)'), ('az-Cyrl-AZ', 'Azerbaijani (Cyrillic) - Azerbaijan'), ('az', 'Azerbaijani (Latin)'), ('az-Latn', 'Azerbaijani (Latin), Latn'), ('az-Latn-AZ', 'Azerbaijani (Latin) - Azerbaijan'), ('ksf', 'Bafia'), ('ksf-CM', 'Bafia - Cameroon'), ('bm', 'Bamanankan'), ('bm-Latn-ML', 'Bamanankan (Latin) - Mali'), ('bn', 'Bangla'), ('bn-BD', 'Bangla - Bangladesh'), ('bn-IN', 'Bangla - India'), ('bas', 'Basaa'), ('bas-CM', 'Basaa - Cameroon'), ('ba', 'Bashkir'), ('ba-RU', 'Bashkir - Russia'), ('eu', 'Basque'), ('eu-ES', 'Basque - Spain'), ('be', 'Belarusian'), ('be-BY', 'Belarusian - Belarus'), ('bem', 'Bemba'), ('bem-ZM', 'Bemba - Zambia'), ('bez', 'Bena'), ('bez-TZ', 'Bena - Tanzania'), ('byn', 'Blin'), ('byn-ER', 'Blin - Eritrea'), ('brx', 'Bodo'), ('brx-IN', 'Bodo - India'), ('bs-Cyrl', 'Bosnian (Cyrillic)'), ('bs-Cyrl-BA', 'Bosnian (Cyrillic) - Bosnia and Herzegovina'), ('bs', 'Bosnian (Latin)'), ('bs-Latn', 'Bosnian (Latin), Latn'), ('bs-Latn-BA', 'Bosnian (Latin) - Bosnia and Herzegovina'), ('br', 'Breton'), ('br-FR', 'Breton - France'), ('bg', 'Bulgarian'), ('bg-BG', 'Bulgarian - Bulgaria'), ('my', 'Burmese'), ('my-MM', 'Burmese - Myanmar'), ('ca', 'Catalan'), ('ca-AD', 'Catalan - Andorra'), ('ca-FR', 'Catalan - France'), ('ca-IT', 'Catalan - Italy'), ('ca-ES', 'Catalan - Spain'), ('ceb', 'Cebuano'), ('ceb-Latn', 'Cebuan (Latin)'), ('ceb-Latn-PH', 'Cebuan (Latin) - Philippines'), ('tzm-Latn-MA', 'Central Atlas Tamazight (Latin) - Morocco'), ('ku', 'Central Kurdish'), ('ku-Arab', 'Central Kurdish, Arab'), ('ku-Arab-IQ', 'Central Kurdish - Iraq'), ('ccp', 'Chakma'), ('ccp-Cakm', 'Chakma - Chakma'), ('ccp-Cakm-BD', 'Chakma - Bangladesh'), ('ccp-Cakm-IN', 'Chakma - India'), ('cd-RU', 'Chechen - Russia'), ('chr', 'Cherokee'), ('chr-Cher', 'Cherokee, Cher'), ('chr-Cher-US', 'Cherokee - United States'), ('cgg', 'Chiga'), ('cgg-UG', 'Chiga - Uganda'), ('zh', 'Chinese (Simplified)'), ('zh-Hans', 'Chinese (Simplified), Hans'), ('zh-CN', "Chinese (Simplified) - People's Republic of China"), ('zh-SG', 'Chinese (Simplified) - Singapore'), ('zh-Hant', 'Chinese (Traditional)'), ('zh-HK', 'Chinese (Traditional) - Hong Kong S.A.R.'), ('zh-MO', 'Chinese (Traditional) - Macao S.A.R.'), ('zh-TW', 'Chinese (Traditional) - Taiwan'), ('cu-RU', 'Church Slavic - Russia'), ('swc', 'Congo Swahili'), ('swc-CD', 'Congo Swahili - Congo DRC'), ('kw', 'Cornish'), ('kw-GB', 'Cornish - United Kingdom'), ('co', 'Corsican'), ('co-FR', 'Corsican - France'), ('hr,', 'Croatian'), ('hr-HR', 'Croatian - Croatia'), ('hr-BA', 'Croatian (Latin) - Bosnia and Herzegovina'), ('cs', 'Czech'), ('cs-CZ', 'Czech - Czech Republic'), ('da', 'Danish'), ('da-DK', 'Danish - Denmark'), ('da-GL', 'Danish - Greenland'), ('prs', 'Dari'), ('prs-AF', 'Dari - Afghanistan'), ('dv', 'Divehi'), ('dv-MV', 'Divehi - Maldives'), ('dua', 'Duala'), ('dua-CM', 'Duala - Cameroon'), ('nl', 'Dutch'), ('nl-AW', 'Dutch - Aruba'), ('nl-BE', 'Dutch - Belgium'), ('nl-BQ', 'Dutch - Bonaire, Sint Eustatius and Saba'), ('nl-CW', 'Dutch - Curaçao'), ('nl-NL', 'Dutch - Netherlands'), ('nl-SX', 'Dutch - Sint Maarten'), ('nl-SR', 'Dutch - Suriname'), ('dz', 'Dzongkha'), ('dz-BT', 'Dzongkha - Bhutan'), ('ebu', 'Embu'), ('ebu-KE', 'Embu - Kenya'), ('en', 'English'), ('en-AS', 'English - American Samoa'), ('en-AI', 'English - Anguilla'), ('en-AG', 'English - Antigua and Barbuda'), ('en-AU', 'English - Australia'), ('en-AT', 'English - Austria'), ('en-BS', 'English - Bahamas'), ('en-BB', 'English - Barbados'), ('en-BE', 'English - Belgium'), ('en-BZ', 'English - Belize'), ('en-BM', 'English - Bermuda'), ('en-BW', 'English - Botswana'), ('en-IO', 'English - British Indian Ocean Territory'), ('en-VG', 'English - British Virgin Islands'), ('en-BI', 'English - Burundi'), ('en-CM', 'English - Cameroon'), ('en-CA', 'English - Canada'), ('en-029', 'English - Caribbean'), ('en-KY', 'English - Cayman Islands'), ('en-CX', 'English - Christmas Island'), ('en-CC', 'English - Cocos [Keeling] Islands'), ('en-CK', 'English - Cook Islands'), ('en-CY', 'English - Cyprus'), ('en-DK', 'English - Denmark'), ('en-DM', 'English - Dominica'), ('en-ER', 'English - Eritrea'), ('en-150', 'English - Europe'), ('en-FK', 'English - Falkland Islands'), ('en-FI', 'English - Finland'), ('en-FJ', 'English - Fiji'), ('en-GM', 'English - Gambia'), ('en-DE', 'English - Germany'), ('en-GH', 'English - Ghana'), ('en-GI', 'English - Gibraltar'), ('en-GD', 'English - Grenada'), ('en-GU', 'English - Guam'), ('en-GG', 'English - Guernsey'), ('en-GY', 'English - Guyana'), ('en-HK', 'English - Hong Kong'), ('en-IN', 'English - India'), ('en-IE', 'English - Ireland'), ('en-IM', 'English - Isle of Man'), ('en-IL', 'English - Israel'), ('en-JM', 'English - Jamaica'), ('en-JE', 'English - Jersey'), ('en-KE', 'English - Kenya'), ('en-KI', 'English - Kiribati'), ('en-LS', 'English - Lesotho'), ('en-LR', 'English - Liberia'), ('en-MO', 'English - Macao SAR'), ('en-MG', 'English - Madagascar'), ('en-MW', 'English - Malawi'), ('en-MY', 'English - Malaysia'), ('en-MT', 'English - Malta'), ('en-MH', 'English - Marshall Islands'), ('en-MU', 'English - Mauritius'), ('en-FM', 'English - Micronesia'), ('en-MS', 'English - Montserrat'), ('en-NA', 'English - Namibia'), ('en-NR', 'English - Nauru'), ('en-NL', 'English - Netherlands'), ('en-NZ', 'English - New Zealand'), ('en-NG', 'English - Nigeria'), ('en-NU', 'English - Niue'), ('en-NF', 'English - Norfolk Island'), ('en-MP', 'English - Northern Mariana Islands'), ('en-PK', 'English - Pakistan'), ('en-PW', 'English - Palau'), ('en-PG', 'English - Papua New Guinea'), ('en-PN', 'English - Pitcairn Islands'), ('en-PR', 'English - Puerto Rico'), ('en-PH', 'English - Republic of the Philippines'), ('en-RW', 'English - Rwanda'), ('en-KN', 'English - Saint Kitts and Nevis'), ('en-LC', 'English - Saint Lucia'), ('en-VC', 'English - Saint Vincent and the Grenadines'), ('en-WS', 'English - Samoa'), ('en-SC', 'English - Seychelles'), ('en-SL', 'English - Sierra Leone'), ('en-SG', 'English - Singapore'), ('en-SX', 'English - Sint Maarten'), ('en-SI', 'English - Slovenia'), ('en-SB', 'English - Solomon Islands'), ('en-ZA', 'English - South Africa'), ('en-SS', 'English - South Sudan'), ('en-SH', 'English - St Helena, Ascension, Tristan da Cunha'), ('en-SD', 'English - Sudan'), ('en-SZ', 'English - Swaziland'), ('en-SE', 'English - Sweden'), ('en-CH', 'English - Switzerland'), ('en-TZ', 'English - Tanzania'), ('en-TK', 'English - Tokelau'), ('en-TO', 'English - Tonga'), ('en-TT', 'English - Trinidad and Tobago'), ('en-TC', 'English - Turks and Caicos Islands'), ('en-TV', 'English - Tuvalu'), ('en-UG', 'English - Uganda'), ('en-AE', 'English - United Arab Emirates'), ('en-GB', 'English - United Kingdom'), ('en-US', 'English - United States'), ('en-UM', 'English - US Minor Outlying Islands'), ('en-VI', 'English - US Virgin Islands'), ('en-VU', 'English - Vanuatu'), ('en-001', 'English - World'), ('en-ZM', 'English - Zambia'), ('en-ZW', 'English - Zimbabwe'), ('eo', 'Esperanto'), ('eo-001', 'Esperanto - World'), ('et', 'Estonian'), ('et-EE', 'Estonian - Estonia'), ('ee', 'Ewe'), ('ee-GH', 'Ewe - Ghana'), ('ee-TG', 'Ewe - Togo'), ('ewo', 'Ewondo'), ('ewo-CM', 'Ewondo - Cameroon'), ('fo', 'Faroese'), ('fo-DK', 'Faroese - Denmark'), ('fo-FO', 'Faroese - Faroe Islands'), ('fil', 'Filipino'), ('fil-PH', 'Filipino - Philippines'), ('fi', 'Finnish'), ('fi-FI', 'Finnish - Finland'), ('fr', 'French'), ('fr-DZ', 'French - Algeria'), ('fr-BE', 'French - Belgium'), ('fr-BJ', 'French - Benin'), ('fr-BF', 'French - Burkina Faso'), ('fr-BI', 'French - Burundi'), ('fr-CM', 'French - Cameroon'), ('fr-CA', 'French - Canada'), ('fr-CF', 'French - Central African Republic'), ('fr-TD', 'French - Chad'), ('fr-KM', 'French - Comoros'), ('fr-CG', 'French - Congo'), ('fr-CD', 'French - Congo, DRC'), ('fr-CI', "French - Côte d'Ivoire"), ('fr-DJ', 'French - Djibouti'), ('fr-GQ', 'French - Equatorial Guinea'), ('fr-FR', 'French - France'), ('fr-GF', 'French - French Guiana'), ('fr-PF', 'French - French Polynesia'), ('fr-GA', 'French - Gabon'), ('fr-GP', 'French - Guadeloupe'), ('fr-GN', 'French - Guinea'), ('fr-HT', 'French - Haiti'), ('fr-LU', 'French - Luxembourg'), ('fr-MG', 'French - Madagascar'), ('fr-ML', 'French - Mali'), ('fr-MQ', 'French - Martinique'), ('fr-MR', 'French - Mauritania'), ('fr-MU', 'French - Mauritius'), ('fr-YT', 'French - Mayotte'), ('fr-MA', 'French - Morocco'), ('fr-NC', 'French - New Caledonia'), ('fr-NE', 'French - Niger'), ('fr-MC', 'French - Principality of Monaco'), ('fr-RE', 'French - Reunion'), ('fr-RW', 'French - Rwanda'), ('fr-BL', 'French - Saint Barthélemy'), ('fr-MF', 'French - Saint Martin'), ('fr-PM', 'French - Saint Pierre and Miquelon'), ('fr-SN', 'French - Senegal'), ('fr-SC', 'French - Seychelles'), ('fr-CH', 'French - Switzerland'), ('fr-SY', 'French - Syria'), ('fr-TG', 'French - Togo'), ('fr-TN', 'French - Tunisia'), ('fr-VU', 'French - Vanuatu'), ('fr-WF', 'French - Wallis and Futuna'), ('fy', 'Frisian'), ('fy-NL', 'Frisian - Netherlands'), ('fur', 'Friulian'), ('fur-IT', 'Friulian - Italy'), ('ff', 'Fulah'), ('ff-Latn', 'Fulah (Latin)'), ('ff-Latn-BF', 'Fulah (Latin) - Burkina Faso'), ('ff-CM', 'Fulah - Cameroon'), ('ff-Latn-CM', 'Fulah (Latin) - Cameroon'), ('ff-Latn-GM', 'Fulah (Latin) - Gambia'), ('ff-Latn-GH', 'Fulah (Latin) - Ghana'), ('ff-GN', 'Fulah - Guinea'), ('ff-Latn-GN', 'Fulah (Latin) - Guinea'), ('ff-Latn-GW', 'Fulah (Latin) - Guinea-Bissau'), ('ff-Latn-LR', 'Fulah (Latin) - Liberia'), ('ff-MR', 'Fulah - Mauritania'), ('ff-Latn-MR', 'Fulah (Latin) - Mauritania'), ('ff-Latn-NE', 'Fulah (Latin) - Niger'), ('ff-NG', 'Fulah - Nigeria'), ('ff-Latn-NG', 'Fulah (Latin) - Nigeria'), ('ff-Latn-SN', 'Fulah - Senegal'), ('ff-Latn-SL', 'Fulah (Latin) - Sierra Leone'), ('gl', 'Galician'), ('gl-ES', 'Galician - Spain'), ('lg', 'Ganda'), ('lg-UG', 'Ganda - Uganda'), ('ka', 'Georgian'), ('ka-GE', 'Georgian - Georgia'), ('de', 'German'), ('de-AT', 'German - Austria'), ('de-BE', 'German - Belgium'), ('de-DE', 'German - Germany'), ('de-IT', 'German - Italy'), ('de-LI', 'German - Liechtenstein'), ('de-LU', 'German - Luxembourg'), ('de-CH', 'German - Switzerland'), ('el', 'Greek'), ('el-CY', 'Greek - Cyprus'), ('el-GR', 'Greek - Greece'), ('kl', 'Greenlandic'), ('kl-GL', 'Greenlandic - Greenland'), ('gn', 'Guarani'), ('gn-PY', 'Guarani - Paraguay'), ('gu', 'Gujarati'), ('gu-IN', 'Gujarati - India'), ('guz', 'Gusii'), ('guz-KE', 'Gusii - Kenya'), ('ha', 'Hausa (Latin)'), ('ha-Latn', 'Hausa (Latin), Latn'), ('ha-Latn-GH', 'Hausa (Latin) - Ghana'), ('ha-Latn-NE', 'Hausa (Latin) - Niger'), ('ha-Latn-NG', 'Hausa (Latin) - Nigeria'), ('haw', 'Hawaiian'), ('haw-US', 'Hawaiian - United States'), ('he', 'Hebrew'), ('he-IL', 'Hebrew - Israel'), ('hi', 'Hindi'), ('hi-IN', 'Hindi - India'), ('hu', 'Hungarian'), ('hu-HU', 'Hungarian - Hungary'), ('is', 'Icelandic'), ('is-IS', 'Icelandic - Iceland'), ('ig', 'Igbo'), ('ig-NG', 'Igbo - Nigeria'), ('id', 'Indonesian'), ('id-ID', 'Indonesian - Indonesia'), ('ia', 'Interlingua'), ('ia-FR', 'Interlingua - France'), ('ia-001', 'Interlingua - World'), ('iu', 'Inuktitut (Latin)'), ('iu-Latn', 'Inuktitut (Latin), Latn'), ('iu-Latn-CA', 'Inuktitut (Latin) - Canada'), ('iu-Cans', 'Inuktitut (Syllabics)'), ('iu-Cans-CA', 'Inuktitut (Syllabics) - Canada'), ('ga', 'Irish'), ('ga-IE', 'Irish - Ireland'), ('it', 'Italian'), ('it-IT', 'Italian - Italy'), ('it-SM', 'Italian - San Marino'), ('it-CH', 'Italian - Switzerland'), ('it-VA', 'Italian - Vatican City'), ('ja', 'Japanese'), ('ja-JP', 'Japanese - Japan'), ('jv', 'Javanese'), ('jv-Latn', 'Javanese - Latin'), ('jv-Latn-ID', 'Javanese - Latin, Indonesia'), ('dyo', 'Jola-Fonyi'), ('dyo-SN', 'Jola-Fonyi - Senegal'), ('kea', 'Kabuverdianu'), ('kea-CV', 'Kabuverdianu - Cabo Verde'), ('kab', 'Kabyle'), ('kab-DZ', 'Kabyle - Algeria'), ('kkj', 'Kako'), ('kkj-CM', 'Kako - Cameroon'), ('kln', 'Kalenjin'), ('kln-KE', 'Kalenjin - Kenya'), ('kam', 'Kamba'), ('kam-KE', 'Kamba - Kenya'), ('kn', 'Kannada'), ('kn-IN', 'Kannada - India'), ('ks', 'Kashmiri'), ('ks-Arab', 'Kashmiri - Perso-Arabic'), ('ks-Arab-IN', 'Kashmiri - Perso-Arabic, IN'), ('kk', 'Kazakh'), ('kk-KZ', 'Kazakh - Kazakhstan'), ('km', 'Khmer'), ('km-KH', 'Khmer - Cambodia'), ('quc', "K'iche"), ('quc-Latn-GT', "K'iche - Guatemala"), ('ki', 'Kikuyu'), ('ki-KE', 'Kikuyu - Kenya'), ('rw', 'Kinyarwanda'), ('rw-RW', 'Kinyarwanda - Rwanda'), ('sw', 'Kiswahili'), ('sw-KE', 'Kiswahili - Kenya'), ('sw-TZ', 'Kiswahili - Tanzania'), ('sw-UG', 'Kiswahili - Uganda'), ('kok', 'Konkani'), ('kok-IN', 'Konkani - India'), ('ko', 'Korean'), ('ko-KR', 'Korean - Korea'), ('ko-KP', 'Korean - North Korea'), ('khq', 'Koyra Chiini'), ('khq-ML', 'Koyra Chiini - Mali'), ('ses', 'Koyraboro Senni'), ('ses-ML', 'Koyraboro Senni - Mali'), ('nmg', 'Kwasio'), ('nmg-CM', 'Kwasio - Cameroon'), ('ky', 'Kyrgyz'), ('ky-KG', 'Kyrgyz - Kyrgyzstan'), ('ku-Arab-IR', 'Kurdish - Perso-Arabic, Iran'), ('lkt', 'Lakota'), ('lkt-US', 'Lakota - United States'), ('lag', 'Langi'), ('lag-TZ', 'Langi - Tanzania'), ('lo', 'Lao'), ('lo-LA', 'Lao - Lao P.D.R.'), ('lv', 'Latvian'), ('lv-LV', 'Latvian - Latvia'), ('ln', 'Lingala'), ('ln-AO', 'Lingala - Angola'), ('ln-CF', 'Lingala - Central African Republic'), ('ln-CG', 'Lingala - Congo'), ('ln-CD', 'Lingala - Congo DRC'), ('lt', 'Lithuanian'), ('lt-LT', 'Lithuanian - Lithuania'), ('nds', 'Low German'), ('nds-DE', 'Low German - Germany'), ('nds-NL', 'Low German - Netherlands'), ('dsb', 'Lower Sorbian'), ('dsb-DE', 'Lower Sorbian - Germany'), ('lu', 'Luba-Katanga'), ('lu-CD', 'Luba-Katanga - Congo DRC'), ('luo', 'Luo'), ('luo-KE', 'Luo - Kenya'), ('lb', 'Luxembourgish'), ('lb-LU', 'Luxembourgish - Luxembourg'), ('luy', 'Luyia'), ('luy-KE', 'Luyia - Kenya'), ('mk', 'Macedonian'), ('mk-MK', 'Macedonian - North Macedonia'), ('jmc', 'Machame'), ('jmc-TZ', 'Machame - Tanzania'), ('mgh', 'Makhuwa-Meetto'), ('mgh-MZ', 'Makhuwa-Meetto - Mozambique'), ('kde', 'Makonde'), ('kde-TZ', 'Makonde - Tanzania'), ('mg', 'Malagasy'), ('mg-MG', 'Malagasy - Madagascar'), ('ms', 'Malay'), ('ms-BN', 'Malay - Brunei Darussalam'), ('ms-MY', 'Malay - Malaysia'), ('ml', 'Malayalam'), ('ml-IN', 'Malayalam - India'), ('mt', 'Maltese'), ('mt-MT', 'Maltese - Malta'), ('gv', 'Manx'), ('gv-IM', 'Manx - Isle of Man'), ('mi', 'Maori'), ('mi-NZ', 'Maori - New Zealand'), ('arn', 'Mapudungun'), ('arn-CL', 'Mapudungun - Chile'), ('mr', 'Marathi'), ('mr-IN', 'Marathi - India'), ('mas', 'Masai'), ('mas-KE', 'Masai - Kenya'), ('mas-TZ', 'Masai - Tanzania'), ('mzn-IR', 'Mazanderani - Iran'), ('mer', 'Meru'), ('mer-KE', 'Meru - Kenya'), ('mgo', "Meta'"), ('mgo-CM', "Meta' - Cameroon"), ('moh', 'Mohawk'), ('moh-CA', 'Mohawk - Canada'), ('mn', 'Mongolian (Cyrillic)'), ('mn-Cyrl', 'Mongolian (Cyrillic), Cyrl'), ('mn-MN', 'Mongolian (Cyrillic) - Mongolia'), ('mn-Mong', 'Mongolian (Traditional Mongolian)'), ('mn-Mong-CN', "Mongolian (Traditional Mongolian) - People's Republic of China"), ('mn-Mong-MN', 'Mongolian (Traditional Mongolian) - Mongolia'), ('mfe', 'Morisyen'), ('mfe-MU', 'Morisyen - Mauritius'), ('mua', 'Mundang'), ('mua-CM', 'Mundang - Cameroon'), ('nqo', "N'ko"), ('nqo-GN', "N'ko - Guinea"), ('naq', 'Nama'), ('naq-NA', 'Nama - Namibia'), ('ne', 'Nepali'), ('ne-IN', 'Nepali - India'), ('ne-NP', 'Nepali - Nepal'), ('nnh', 'Ngiemboon'), ('nnh-CM', 'Ngiemboon - Cameroon'), ('jgo', 'Ngomba'), ('jgo-CM', 'Ngomba - Cameroon'), ('lrc-IQ', 'Northern Luri - Iraq'), ('lrc-IR', 'Northern Luri - Iran'), ('nd', 'North Ndebele'), ('nd-ZW', 'North Ndebele - Zimbabwe'), ('no', 'Norwegian (Bokmal)'), ('nb', 'Norwegian (Bokmal), nb'), ('nb-NO', 'Norwegian (Bokmal) - Norway'), ('nn', 'Norwegian (Nynorsk)'), ('nn-NO', 'Norwegian (Nynorsk) - Norway'), ('nb-SJ', 'Norwegian Bokmål - Svalbard and Jan Mayen'), ('nus', 'Nuer'), ('nus-SD', 'Nuer - Sudan'), ('nus-SS', 'Nuer - South Sudan'), ('nyn', 'Nyankole'), ('nyn-UG', 'Nyankole - Uganda'), ('oc', 'Occitan'), ('oc-FR', 'Occitan - France'), ('or', 'Odia'), ('or-IN', 'Odia - India'), ('om', 'Oromo'), ('om-ET', 'Oromo - Ethiopia'), ('om-KE', 'Oromo - Kenya'), ('os', 'Ossetian'), ('os-GE', 'Ossetian - Cyrillic, Georgia'), ('os-RU', 'Ossetian - Cyrillic, Russia'), ('ps', 'Pashto'), ('ps-AF', 'Pashto - Afghanistan'), ('ps-PK', 'Pashto - Pakistan'), ('fa', 'Persian'), ('fa-AF', 'Persian - Afghanistan'), ('fa-IR', 'Persian - Iran'), ('pl', 'Polish'), ('pl-PL', 'Polish - Poland'), ('pt', 'Portuguese'), ('pt-AO', 'Portuguese - Angola'), ('pt-BR', 'Portuguese - Brazil'), ('pt-CV', 'Portuguese - Cabo Verde'), ('pt-GQ', 'Portuguese - Equatorial Guinea'), ('pt-GW', 'Portuguese - Guinea-Bissau'), ('pt-LU', 'Portuguese - Luxembourg'), ('pt-MO', 'Portuguese - Macao SAR'), ('pt-MZ', 'Portuguese - Mozambique'), ('pt-PT', 'Portuguese - Portugal'), ('pt-ST', 'Portuguese - São Tomé and Príncipe'), ('pt-CH', 'Portuguese - Switzerland'), ('pt-TL', 'Portuguese - Timor-Leste'), ('prg-001', 'Prussian'), ('qps-ploca', 'Pseudo Language - Pseudo locale for east Asian/complex script localization testing'), ('qps-ploc', 'Pseudo Language - Pseudo locale used for localization testing'), ('qps-plocm', 'Pseudo Language - Pseudo locale used for localization testing of mirroredlocales'), ('pa', 'Punjabi'), ('pa-Arab', 'Punjabi, Arab'), ('pa-IN', 'Punjabi - India'), ('pa-Arab-PK', 'Punjabi - Islamic Republic of Pakistan'), ('quz', 'Quechua'), ('quz-BO', 'Quechua - Bolivia'), ('quz-EC', 'Quechua - Ecuador'), ('quz-PE', 'Quechua - Peru'), ('ksh', 'Ripuarian'), ('ksh-DE', 'Ripuarian - Germany'), ('ro', 'Romanian'), ('ro-MD', 'Romanian - Moldova'), ('ro-RO', 'Romanian - Romania'), ('rm', 'Romansh'), ('rm-CH', 'Romansh - Switzerland'), ('rof', 'Rombo'), ('rof-TZ', 'Rombo - Tanzania'), ('rn', 'Rundi'), ('rn-BI', 'Rundi - Burundi'), ('ru', 'Russian'), ('ru-BY', 'Russian - Belarus'), ('ru-KZ', 'Russian - Kazakhstan'), ('ru-KG', 'Russian - Kyrgyzstan'), ('ru-MD', 'Russian - Moldova'), ('ru-RU', 'Russian - Russia'), ('ru-UA', 'Russian - Ukraine'), ('rwk', 'Rwa'), ('rwk-TZ', 'Rwa - Tanzania'), ('ssy', 'Saho'), ('ssy-ER', 'Saho - Eritrea'), ('sah', 'Sakha'), ('sah-RU', 'Sakha - Russia'), ('saq', 'Samburu'), ('saq-KE', 'Samburu - Kenya'), ('smn', 'Sami (Inari)'), ('smn-FI', 'Sami (Inari) - Finland'), ('smj', 'Sami (Lule)'), ('smj-NO', 'Sami (Lule) - Norway'), ('smj-SE', 'Sami (Lule) - Sweden'), ('se', 'Sami (Northern)'), ('se-FI', 'Sami (Northern) - Finland'), ('se-NO', 'Sami (Northern) - Norway'), ('se-SE', 'Sami (Northern) - Sweden'), ('sms', 'Sami (Skolt)'), ('sms-FI', 'Sami (Skolt) - Finland'), ('sma', 'Sami (Southern)'), ('sma-NO', 'Sami (Southern) - Norway'), ('sma-SE', 'Sami (Southern) - Sweden'), ('sg', 'Sango'), ('sg-CF', 'Sango - Central African Republic'), ('sbp', 'Sangu'), ('sbp-TZ', 'Sangu - Tanzania'), ('sa', 'Sanskrit'), ('sa-IN', 'Sanskrit - India'), ('gd', 'Scottish Gaelic'), ('gd-GB', 'Scottish Gaelic - United Kingdom'), ('seh', 'Sena'), ('seh-MZ', 'Sena - Mozambique'), ('sr-Cyrl', 'Serbian (Cyrillic)'), ('sr-Cyrl-BA', 'Serbian (Cyrillic) - Bosnia and Herzegovina'), ('sr-Cyrl-ME', 'Serbian (Cyrillic) - Montenegro'), ('sr-Cyrl-RS', 'Serbian (Cyrillic) - Serbia'), ('sr-Cyrl-CS', 'Serbian (Cyrillic) - Serbia and Montenegro (Former)'), ('sr', 'Serbian (Latin)'), ('sr-Latn', 'Serbian (Latin), Latn'), ('sr-Latn-BA', 'Serbian (Latin) - Bosnia and Herzegovina'), ('sr-Latn-ME', 'Serbian (Latin) - Montenegro'), ('sr-Latn-RS', 'Serbian (Latin) - Serbia'), ('sr-Latn-CS', 'Serbian (Latin) - Serbia and Montenegro (Former)'), ('nso', 'Sesotho sa Leboa'), ('nso-ZA', 'Sesotho sa Leboa - South Africa'), ('tn', 'Setswana'), ('tn-BW', 'Setswana - Botswana'), ('tn-ZA', 'Setswana - South Africa'), ('ksb', 'Shambala'), ('ksb-TZ', 'Shambala - Tanzania'), ('sn', 'Shona'), ('sn-Latn', 'Shona - Latin'), ('sn-Latn-ZW', 'Shona - Zimbabwe'), ('sd', 'Sindhi'), ('sd-Arab', 'Sindhi, Arab'), ('sd-Arab-PK', 'Sindhi - Islamic Republic of Pakistan'), ('si', 'Sinhala'), ('si-LK', 'Sinhala - Sri Lanka'), ('sk', 'Slovak'), ('sk-SK', 'Slovak - Slovakia'), ('sl', 'Slovenian'), ('sl-SI', 'Slovenian - Slovenia'), ('xog', 'Soga'), ('xog-UG', 'Soga - Uganda'), ('so', 'Somali'), ('so-DJ', 'Somali - Djibouti'), ('so-ET', 'Somali - Ethiopia'), ('so-KE', 'Somali - Kenya'), ('so-SO', 'Somali - Somalia'), ('st', 'Sotho'), ('st-ZA', 'Sotho - South Africa'), ('nr', 'South Ndebele'), ('nr-ZA', 'South Ndebele - South Africa'), ('st-LS', 'Southern Sotho - Lesotho'), ('es', 'Spanish'), ('es-AR', 'Spanish - Argentina'), ('es-BZ', 'Spanish - Belize'), ('es-VE', 'Spanish - Bolivarian Republic of Venezuela'), ('es-BO', 'Spanish - Bolivia'), ('es-BR', 'Spanish - Brazil'), ('es-CL', 'Spanish - Chile'), ('es-CO', 'Spanish - Colombia'), ('es-CR', 'Spanish - Costa Rica'), ('es-CU', 'Spanish - Cuba'), ('es-DO', 'Spanish - Dominican Republic'), ('es-EC', 'Spanish - Ecuador'), ('es-SV', 'Spanish - El Salvador'), ('es-GQ', 'Spanish - Equatorial Guinea'), ('es-GT', 'Spanish - Guatemala'), ('es-HN', 'Spanish - Honduras'), ('es-419', 'Spanish - Latin America'), ('es-MX', 'Spanish - Mexico'), ('es-NI', 'Spanish - Nicaragua'), ('es-PA', 'Spanish - Panama'), ('es-PY', 'Spanish - Paraguay'), ('es-PE', 'Spanish - Peru'), ('es-PH', 'Spanish - Philippines'), ('es-PR', 'Spanish - Puerto Rico'), ('es-ES', 'Spanish - Spain'), ('es-ES_tradnl', 'Spanish - Spain, ES_tradnl'), ('es-US', 'Spanish - United - States'), ('es-UY', 'Spanish - Uruguay'), ('zgh', 'Standard Moroccan Tamazight'), ('zgh-Tfng-MA', 'Standard Moroccan Tamazight - Morocco'), ('zgh-Tfng', 'Standard Moroccan Tamazight - Tifinagh'), ('ss', 'Swati'), ('ss-ZA', 'Swati - South Africa'), ('ss-SZ', 'Swati - Swaziland'), ('sv', 'Swedish'), ('sv-AX', 'Swedish - Åland Islands'), ('sv-FI', 'Swedish - Finland'), ('sv-SE', 'Swedish - Sweden'), ('syr', 'Syriac'), ('syr-SY', 'Syriac - Syria'), ('shi', 'Tachelhit'), ('shi-Tfng', 'Tachelhit - Tifinagh'), ('shi-Tfng-MA', 'Tachelhit - Tifinagh, Morocco'), ('shi-Latn', 'Tachelhit (Latin)'), ('shi-Latn-MA', 'Tachelhit (Latin) - Morocco'), ('dav', 'Taita'), ('dav-KE', 'Taita - Kenya'), ('tg', 'Tajik (Cyrillic)'), ('tg-Cyrl', 'Tajik (Cyrillic), Cyrl'), ('tg-Cyrl-TJ', 'Tajik (Cyrillic) - Tajikistan'), ('tzm', 'Tamazight (Latin)'), ('tzm-Latn', 'Tamazight (Latin), Latn'), ('tzm-Latn-DZ', 'Tamazight (Latin) - Algeria'), ('ta', 'Tamil'), ('ta-IN', 'Tamil - India'), ('ta-MY', 'Tamil - Malaysia'), ('ta-SG', 'Tamil - Singapore'), ('ta-LK', 'Tamil - Sri Lanka'), ('twq', 'Tasawaq'), ('twq-NE', 'Tasawaq - Niger'), ('tt', 'Tatar'), ('tt-RU', 'Tatar - Russia'), ('te', 'Telugu'), ('te-IN', 'Telugu - India'), ('teo', 'Teso'), ('teo-KE', 'Teso - Kenya'), ('teo-UG', 'Teso - Uganda'), ('th', 'Thai'), ('th-TH', 'Thai - Thailand'), ('bo', 'Tibetan'), ('bo-IN', 'Tibetan - India'), ('bo-CN', "Tibetan - People's Republic of China"), ('tig', 'Tigre'), ('tig-ER', 'Tigre - Eritrea'), ('ti', 'Tigrinya'), ('ti-ER', 'Tigrinya - Eritrea'), ('ti-ET', 'Tigrinya - Ethiopia'), ('to', 'Tongan'), ('to-TO', 'Tongan - Tonga'), ('ts', 'Tsonga'), ('ts-ZA', 'Tsonga - South Africa'), ('tr', 'Turkish'), ('tr-CY', 'Turkish - Cyprus'), ('tr-TR', 'Turkish - Turkey'), ('tk', 'Turkmen'), ('tk-TM', 'Turkmen - Turkmenistan'), ('uk', 'Ukrainian'), ('uk-UA', 'Ukrainian - Ukraine'), ('hsb', 'Upper Sorbian'), ('hsb-DE', 'Upper Sorbian - Germany'), ('ur', 'Urdu'), ('ur-IN', 'Urdu - India'), ('ur-PK', 'Urdu - Islamic Republic of Pakistan'), ('ug', 'Uyghur'), ('ug-CN', "Uyghur - People's Republic of China"), ('uz-Arab', 'Uzbek - Perso-Arabic'), ('uz-Arab-AF', 'Uzbek - Perso-Arabic, Afghanistan'), ('uz-Cyrl', 'Uzbek (Cyrillic)'), ('uz-Cyrl-UZ', 'Uzbek (Cyrillic) - Uzbekistan'), ('uz', 'Uzbek (Latin)'), ('uz-Latn', 'Uzbek (Latin), Latn'), ('uz-Latn-UZ', 'Uzbek (Latin) - Uzbekistan'), ('vai', 'Vai'), ('vai-Vaii', 'Vai, Vaii'), ('vai-Vaii-LR', 'Vai - Liberia'), ('vai-Latn-LR', 'Vai (Latin) - Liberia'), ('vai-Latn', 'Vai (Latin)'), ('ca-ES-valencia', 'Valencian - Spain'), ('ve', 'Venda'), ('ve-ZA', 'Venda - South Africa'), ('vi', 'Vietnamese'), ('vi-VN', 'Vietnamese - Vietnam'), ('vo', 'Volapük'), ('vo-001', 'Volapük - World'), ('vun', 'Vunjo'), ('vun-TZ', 'Vunjo - Tanzania'), ('wae', 'Walser'), ('wae-CH', 'Walser - Switzerland'), ('cy', 'Welsh'), ('cy-GB', 'Welsh - United Kingdom'), ('wal', 'Wolaytta'), ('wal-ET', 'Wolaytta - Ethiopia'), ('wo', 'Wolof'), ('wo-SN', 'Wolof - Senegal'), ('xh', 'Xhosa'), ('xh-ZA', 'Xhosa - South Africa'), ('yav', 'Yangben'), ('yav-CM', 'Yangben - Cameroon'), ('ii', 'Yi'), ('ii-CN', "Yi - People's Republic of China"), ('yo', 'Yoruba'), ('yo-BJ', 'Yoruba - Benin'), ('yo-NG', 'Yoruba - Nigeria'), ('dje', 'Zarma'), ('dje-NE', 'Zarma - Niger'), ('zu', 'Zulu'), ('zu-ZA', 'Zulu - South Africa')], default='en', max_length=16), + ), + ] diff --git a/apps/iiif/manifests/migrations/0046_add_language_model.py b/apps/iiif/manifests/migrations/0046_add_language_model.py new file mode 100644 index 000000000..0a99aed08 --- /dev/null +++ b/apps/iiif/manifests/migrations/0046_add_language_model.py @@ -0,0 +1,35 @@ +# Generated by Django 3.2.12 on 2022-03-28 21:03 + +from django.db import migrations, models + +from bcp47 import languages + +def populate_languages(apps, schema_editor): # pylint: disable = unused-argument + """Populate the new Language model with language codes/names""" + Language = apps.get_model("manifests", "Language") # pylint: disable = invalid-name + lang_list = [] + for label, code in languages.items(): + lang_list.append(Language(code=code, name=label)) + # for some reason Latin is not present in the library + lang_list.append(Language(code="la", name="Latin")) + Language.objects.bulk_create(lang_list) + +class Migration(migrations.Migration): + """Migration to create new Language model and populate it with language codes""" + dependencies = [ + ("manifests", "0045_alter_valuebylanguage_language"), + ] + + operations = [ + migrations.CreateModel( + name="Language", + fields=[ + ("id", models.AutoField( + auto_created=True, primary_key=True, serialize=False, verbose_name="ID") + ), + ("code", models.CharField(max_length=16, unique=True)), + ("name", models.CharField(max_length=255)), + ], + ), + migrations.RunPython(populate_languages, migrations.RunPython.noop), + ] diff --git a/apps/iiif/manifests/migrations/0047_add_languages_to_manifest.py b/apps/iiif/manifests/migrations/0047_add_languages_to_manifest.py new file mode 100644 index 000000000..3fb87d83f --- /dev/null +++ b/apps/iiif/manifests/migrations/0047_add_languages_to_manifest.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.12 on 2022-03-28 21:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + """Migration to migrate old language field on Manifest to new Language model""" + dependencies = [ + ("manifests", "0046_add_language_model"), + ] + + operations = [ + migrations.AddField( + model_name="manifest", + name="languages", + field=models.ManyToManyField( + help_text="Languages present in the manifest.", to="manifests.Language" + ), + ), + migrations.RemoveField( + model_name="manifest", + name="language", + ), + ] diff --git a/apps/iiif/manifests/models.py b/apps/iiif/manifests/models.py index 77c557062..a954fce90 100644 --- a/apps/iiif/manifests/models.py +++ b/apps/iiif/manifests/models.py @@ -56,12 +56,21 @@ def bucket(self): class ValueByLanguage(models.Model): """ Labels by language. """ id = models.UUIDField(primary_key=True, default=uuid4) - language = models.CharField(max_length=10, choices=Choices.LANGUAGES, default=settings.DEFAULT_LANGUAGE) + language = models.CharField(max_length=16, choices=Choices.LANGUAGES, default=settings.DEFAULT_LANGUAGE) content = models.TextField() content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.UUIDField() content_object = GenericForeignKey('content_type', 'object_id') +class Language(models.Model): + """Model to store language names and codes for multiple choice fields""" + code = models.CharField(max_length=16, unique=True) + name = models.CharField(max_length=255) + + def __str__(self): + """String representation of the language""" + return self.name + class ManifestManager(models.Manager): # pylint: disable = too-few-public-methods """Model manager for searches.""" def with_documents(self): @@ -104,7 +113,7 @@ class Manifest(IiifBase): date_sort_ascending = models.FloatField(blank=True, null=True) date_sort_descending = models.FloatField(blank=True, null=True) publisher = models.TextField(null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") - language = models.CharField(max_length=255, null=True, blank=True, help_text="Enter multiple entities separated by a semicolon (;).") + languages = models.ManyToManyField(Language, help_text="Languages present in the manifest.") attribution = models.CharField( max_length=255, null=True, From 194cb36cf82a3309e2208d2cc4b3036671017ff2 Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Tue, 29 Mar 2022 11:53:17 -0400 Subject: [PATCH 057/172] Add indexing logic for languages --- apps/iiif/manifests/documents.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/iiif/manifests/documents.py b/apps/iiif/manifests/documents.py index 90dcdc42b..27102ffbd 100644 --- a/apps/iiif/manifests/documents.py +++ b/apps/iiif/manifests/documents.py @@ -26,7 +26,7 @@ class ManifestDocument(Document): }) # TODO: date = DateRange() has_pdf = fields.BooleanField() - # TODO: languages = fields.TextField() + languages = fields.TextField(multi=True) summary = fields.TextField(analyzer=html_strip) class Index: @@ -59,6 +59,10 @@ def prepare_authors(self, instance): def prepare_has_pdf(self, instance): """convert pdf field into boolean""" return bool(instance.pdf) + + def prepare_languages(self, instance): + """convert languages into list of strings""" + return [lang.name for lang in instance.languages.all()] def get_queryset(self): """prefetch related to improve performance""" From 516231ed175b3739ee44cd7e5bf94bde41b559bb Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Tue, 29 Mar 2022 12:08:17 -0400 Subject: [PATCH 058/172] Use meta option instead of order_by for languages --- apps/iiif/manifests/forms.py | 2 -- apps/iiif/manifests/models.py | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/iiif/manifests/forms.py b/apps/iiif/manifests/forms.py index f6aea27af..03c615b8a 100644 --- a/apps/iiif/manifests/forms.py +++ b/apps/iiif/manifests/forms.py @@ -18,8 +18,6 @@ class ManifestAdminForm(forms.ModelForm): """Form for adding or changing a manifest""" - # sort language list by name - languages = forms.ModelMultipleChoiceField(queryset=Language.objects.order_by("name")) class Meta: model = Manifest fields = ( diff --git a/apps/iiif/manifests/models.py b/apps/iiif/manifests/models.py index a954fce90..93f1f0d64 100644 --- a/apps/iiif/manifests/models.py +++ b/apps/iiif/manifests/models.py @@ -67,6 +67,9 @@ class Language(models.Model): code = models.CharField(max_length=16, unique=True) name = models.CharField(max_length=255) + class Meta: + ordering = ["name"] + def __str__(self): """String representation of the language""" return self.name From e8ce026a469c23784f8561fe367aaa248b254fa2 Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Tue, 29 Mar 2022 12:21:57 -0400 Subject: [PATCH 059/172] Add tests for language indexing --- apps/iiif/manifests/tests/test_documents.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/iiif/manifests/tests/test_documents.py b/apps/iiif/manifests/tests/test_documents.py index 8b3ef994c..c8db68807 100644 --- a/apps/iiif/manifests/tests/test_documents.py +++ b/apps/iiif/manifests/tests/test_documents.py @@ -6,6 +6,7 @@ from django_elasticsearch_dsl.test import ESTestCase from apps.iiif.kollections.models import Collection from apps.iiif.manifests.documents import ManifestDocument +from apps.iiif.manifests.models import Language from apps.iiif.manifests.tests.factories import ManifestFactory class ManifestDocumentTest(ESTestCase, TestCase): @@ -13,6 +14,8 @@ class ManifestDocumentTest(ESTestCase, TestCase): def setUp(self): super().setUp() self.doc = ManifestDocument() + (self.lang_en, _) = Language.objects.get_or_create(code="en", name="English") + (self.lang_la, _) = Language.objects.get_or_create(code="la", name="Latin") def test_prepare_authors(self): """Test authors returned as array instead of string""" @@ -48,6 +51,18 @@ def test_prepare_has_pdf(self): manifest.pdf = "url" assert self.doc.prepare_has_pdf(instance=manifest) + def test_prepare_languages(self): + """Test languages converted into string array""" + # test no languages + manifest = ManifestFactory.create() + assert self.doc.prepare_languages(instance=manifest) == [] + # test one language + manifest.languages.add(self.lang_en) + assert self.doc.prepare_languages(instance=manifest) == ["English"] + # test multiple languages + manifest.languages.add(self.lang_la) + assert len(self.doc.prepare_languages(instance=manifest)) == 2 + def test_get_queryset(self): """Test prefetching""" manifest = ManifestFactory.create() From 8618909b1cf9d255346363f0fcfe67889f68cf93 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 18:36:54 +0000 Subject: [PATCH 060/172] build(deps): Bump werkzeug from 2.0.3 to 2.1.0 Bumps [werkzeug](https://github.com/pallets/werkzeug) from 2.0.3 to 2.1.0. - [Release notes](https://github.com/pallets/werkzeug/releases) - [Changelog](https://github.com/pallets/werkzeug/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/werkzeug/compare/2.0.3...2.1.0) --- updated-dependencies: - dependency-name: werkzeug dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 30fce2865..467a545f2 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -1,6 +1,6 @@ -r ./base.txt -Werkzeug==2.0.3 # https://github.com/pallets/werkzeug +Werkzeug==2.1.0 # https://github.com/pallets/werkzeug ipdb==0.13.9 # https://github.com/gotcha/ipdb Sphinx==4.5.0 # https://github.com/sphinx-doc/sphinx # TODO: Upgrade after moving to Django 3 From 5130023f88696b501c8ebbc7db91eb9171e4d4c3 Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Tue, 29 Mar 2022 15:54:53 -0400 Subject: [PATCH 061/172] Use ES search object in view to reduce DB calls --- apps/readux/tests/test_views.py | 22 ++++++++++++---------- apps/readux/views.py | 7 +++++-- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/apps/readux/tests/test_views.py b/apps/readux/tests/test_views.py index e0ffc0934..876e2a954 100644 --- a/apps/readux/tests/test_views.py +++ b/apps/readux/tests/test_views.py @@ -94,23 +94,25 @@ def test_get_queryset(self): """Should be able to query by search term""" volume_search_view = views.VolumeSearchView() volume_search_view.request = Mock() - volume_search_view.request.GET = {"query": "primary"} - volumes_queryset = volume_search_view.get_queryset() - assert volumes_queryset.count() == 1 - assert volumes_queryset.first().pk == self.volume1.pk + volume_search_view.request.GET = {"q": "primary"} + search_results = volume_search_view.get_queryset() + response = search_results.execute() + assert search_results.count() == 1 + assert response.hits[0]['pid'] == self.volume1.pid # should get all volumes when request is empty volume_search_view.request.GET = {} - volumes_queryset = volume_search_view.get_queryset() - assert volumes_queryset.count() == 3 + search_results = volume_search_view.get_queryset() + assert search_results.count() == 3 def test_label_boost(self): """Should return the item matching label first, before matching summary""" volume_search_view = views.VolumeSearchView() volume_search_view.request = Mock() - volume_search_view.request.GET = {"query": "secondary test"} - volumes_queryset = volume_search_view.get_queryset() + volume_search_view.request.GET = {"q": "secondary test"} + search_results = volume_search_view.get_queryset() # with multiple keywords, should return all matches - assert volumes_queryset.count() == 3 + response = search_results.execute() + assert search_results.count() == 3 # should return "secondary" label match first - assert volumes_queryset.first().pk == self.volume2.pk + assert response.hits[0]['pid'] == self.volume2.pid diff --git a/apps/readux/views.py b/apps/readux/views.py index 32cfe3b2b..a503336a8 100644 --- a/apps/readux/views.py +++ b/apps/readux/views.py @@ -320,6 +320,7 @@ class VolumeSearchView(ListView, FormMixin): model = Manifest form_class = ManifestSearchForm template_name = "search_results.html" + context_object_name = "volumes" paginate_by = 25 # default fields to search when using query box; ^ with number indicates a boosted field query_search_fields = ["pid", "label^3", "summary", "authors"] @@ -340,11 +341,13 @@ def get_queryset(self): form_data = form.cleaned_data # default to empty string if no query in form data - search_query = form_data.get("query", "") + search_query = form_data.get("q", "") if search_query: multimatch_query = MultiMatch(query=search_query, fields=self.query_search_fields) volumes = volumes.query(multimatch_query) - return volumes.to_queryset() + + # return elasticsearch_dsl Search instance + return volumes # TODO: Replace with Elasticsearch From e3c2d445551cf2b242939d351cf1bd9c87d371ce Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Tue, 29 Mar 2022 16:07:16 -0400 Subject: [PATCH 062/172] Upgrade UIKit to 3.13.5 --- apps/templates/admin/base.html | 6 +++--- apps/templates/base.html | 6 +++--- apps/templates/collections.html | 4 ++-- apps/templates/pages/about.html | 2 +- apps/templates/volume.html | 2 +- apps/templates/volumes.html | 4 ++-- apps/templates/wagtailadmin/home.html | 6 +++--- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/templates/admin/base.html b/apps/templates/admin/base.html index 90ac21cba..58f17452c 100644 --- a/apps/templates/admin/base.html +++ b/apps/templates/admin/base.html @@ -1,10 +1,10 @@ {% load i18n static %} {% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %} - + - - + + {% block title %}{% endblock %} diff --git a/apps/templates/base.html b/apps/templates/base.html index e05bc2a2a..5d5380974 100644 --- a/apps/templates/base.html +++ b/apps/templates/base.html @@ -69,7 +69,7 @@ {% block css %} - + + {% endblock %} {% block body_class %}template-homepage{% endblock %} @@ -58,7 +66,7 @@

Search

-
+
Date: Fri, 22 Apr 2022 12:33:00 -0400 Subject: [PATCH 141/172] Use toggle switch for date range filter --- apps/static/css/project.css | 91 ++++++++++++++++++++++++++---- apps/static/js/search.js | 55 +++++++++++------- apps/templates/search_results.html | 15 ++--- 3 files changed, 120 insertions(+), 41 deletions(-) diff --git a/apps/static/css/project.css b/apps/static/css/project.css index 10f94208c..c5942ed65 100644 --- a/apps/static/css/project.css +++ b/apps/static/css/project.css @@ -1648,10 +1648,14 @@ a.nav-link { background-image: url("data:image/svg+xml;charset=UTF-8,%8Csvg+width%3D%2213%22+height%3D%2213%22+viewBox%3D%220+0+13+13%22+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0D%0A++++%3Crect+fill%3D%22rgba%28149%2C+9%2C+83%2C+1%29%22+width%3D%2213%22+height%3D%221%22+x%3D%220%22+y%3D%226%22+%2F%3E%0D%0A%3C%2Fsvg%3E") !important; } +/* Search results page styles */ + +/* search form */ form#search-form input[type="search"][name="q"] { width: 100%; } +/* grid layout for filter panel and search results */ div#search-grid { margin-left: 0; } @@ -1661,14 +1665,78 @@ div#search-grid :first-child { div#search-grid :first-child button#reset-filters { padding-left: 30px; } -div#search-grid button#clear-date { + +/* Date published filter toggle + * Adapted from https://codepen.io/adamhutch/pen/JoKEPp + */ +div#search-grid input[type="checkbox"]#toggle-date { font-size: 14px; - padding-left: 12px; - margin-left: 12px; - display: flex; - align-items: center; - justify-content: space-between; + display: none; +} +div#search-grid input[type="checkbox"]#toggle-date + label { + -webkit-transition: 0.3s background; + -moz-transition: 0.3s background; + transition: 0.3s background; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + position: relative; + display: inline-block; + height: 1.5em; + width: 3em; + background: #ECECEC; + border-radius: 20em; + vertical-align: middle; +} +div#search-grid input[type="checkbox"]#toggle-date + label:before, input[type=checkbox]#toggle-date + label:after { + position: absolute; + top: 0; + left: 0; +} +div#search-grid input[type="checkbox"]#toggle-date + label:before { + -webkit-transition: 0.3s left; + -moz-transition: 0.3s left; + transition: 0.3s left; + content: ""; + display: inline-block; + background: rgba(0, 0, 0, 0.5); + height: 1.125em; + width: 1.125em; + margin: 0.1875em; + border-radius: 50%; + z-index: 5; +} +div#search-grid input[type="checkbox"]#toggle-date + label:after { + color: #fff; + content: "\f00d"; + font: 1.125em "FontAwesome"; + top: 50%; + margin-top: -0.5em; + left: 1.5em; } +div#search-grid input[type="checkbox"]#toggle-date:checked + label { + background: #3FB8AF; +} +div#search-grid input[type="checkbox"]#toggle-date:checked + label:before { + left: 1.5em; +} +div#search-grid input[type="checkbox"]#toggle-date:checked + label:after { + content: "\f00c"; + left: 0.375em; +} +div#search-grid input[type="checkbox"]#toggle-date + label { + margin: 16px 0 0; +} +div#search-grid input[type="checkbox"]#toggle-date + label span { + position: absolute; + top: 0; + left: 55px; + width: 170px; +} + +/* Multiselect filter */ #search-filters select[multiple] { height: 150px; width: 100%; @@ -1676,14 +1744,19 @@ div#search-grid button#clear-date { overflow-x: hidden; } +/* Date slider */ #search-filters .noUi-target { margin: 60px 20px 10px; } +/* Individual search results */ ol#search-results { list-style: none; } - +ol#search-results dl { + margin-left: 2rem; +} +/* Clamp summary to 3 lines */ ol#search-results dd.result-volume-summary { display: -webkit-box; -webkit-box-orient: vertical; @@ -1691,8 +1764,4 @@ ol#search-results dd.result-volume-summary { overflow: hidden; } -ol#search-results dl { - margin-left: 2rem; -} - /*# sourceMappingURL=project.css.map */ \ No newline at end of file diff --git a/apps/static/js/search.js b/apps/static/js/search.js index d9c70607e..aa5924f84 100644 --- a/apps/static/js/search.js +++ b/apps/static/js/search.js @@ -9,30 +9,28 @@ let form; let slider; let resetFiltersButton; let allFilters; -let clearDateButton; -let shouldClearDate = false; +let dateToggleSwitch; +let dateToggleState; let urlParams; let queryMinYear; let queryMaxYear; window.addEventListener("DOMContentLoaded", () => { - form = document.querySelector("form#search-form"); - clearDateButton = document.getElementById("clear-date"); - // Get URL params if (window.location.search) { urlParams = new URLSearchParams(window.location.search); queryMinYear = urlParams.get('start_date'); queryMaxYear = urlParams.get('end_date'); - // If there's no min and max year, disable date clear button - if (!queryMinYear && !queryMaxYear) { - clearDateButton.disabled = true; - } + // If there's a min or max year, assume date toggle is on + dateToggleState = Boolean(queryMinYear || queryMaxYear); } else { - // If there's no search at all, disable date clear button - clearDateButton.disabled = true; + // If there's no search at all, turn date toggle off + dateToggleState = false; } + // initialize elements + form = document.querySelector("form#search-form"); + dateToggleSwitch = document.querySelector("input[type='checkbox']#toggle-date"); sortElement = document.querySelector("select#id_sort"); relevanceSortOption = sortElement.querySelector("option[value='_score']"); defaultSortOption = sortElement.querySelector("option[value='label_alphabetical']"); @@ -48,8 +46,9 @@ window.addEventListener("DOMContentLoaded", () => { slider = document.getElementById("date-range-slider"); setUpSlider(slider); - // Add clear dates event listener - clearDateButton.addEventListener("click", clearDateAndSubmit); + // Initialize date toggle switch and add event listener + setDateFieldToggleState(dateToggleState); + dateToggleSwitch.addEventListener("change", toggleDate); // Add reset filters event listener allFilters = document.querySelectorAll("#search-filters select"); @@ -135,16 +134,30 @@ function disableRelevanceSort() { } function resetFilters() { - // Clears filters and submits the search + // Clear filters and submit the search allFilters.forEach((filter) => { filter.selectedIndex = -1; }); - clearDateAndSubmit(); + dateToggleState = false; + setDateFieldToggleState(false); + form.submit(); } -function clearDateAndSubmit() { - shouldClearDate = true; // Needed to reset start and end date on form - form.submit(); +function toggleDate(e) { + // Use state of toggle button to turn on/off date filter + dateToggleState = e.currentTarget.checked; + setDateFieldToggleState(dateToggleState); +} + +function setDateFieldToggleState(state) { + // Change the date toggle switch and slider to match toggle state + if (state === false) { + dateToggleSwitch.removeAttribute("checked"); + slider.setAttribute("disabled", true); + } else { + dateToggleSwitch.setAttribute("checked", true); + slider.removeAttribute("disabled"); + } } function handleSubmit() { @@ -154,10 +167,10 @@ function handleSubmit() { function handleFormData(e) { const formData = e.formData; - if (shouldClearDate === true) { + if (dateToggleState === false) { // unset start and end date - formData.set("start_date", ""); - formData.set("end_date", ""); + formData.delete("start_date"); + formData.delete("end_date"); } else { // set start and end date on form, from slider values (year only) const dateRange = slider.noUiSlider.get(); diff --git a/apps/templates/search_results.html b/apps/templates/search_results.html index 174c4f235..15a711a35 100644 --- a/apps/templates/search_results.html +++ b/apps/templates/search_results.html @@ -25,9 +25,10 @@ @@ -92,13 +93,9 @@

Filters

-
- Date published - -
- + Date published + +
\n ',data:function(){return{hasImage:!1,localManifestCount:this.manifestCount,localPageCount:this.pageCount,annotationData:{}}},mounted(){var t=this;this.annotationData=JSON.parse(document.getElementById("context").textContent).json_data,window.addEventListener("canvasswitch",(function(e){if(e.detail.annotationAdded){for(var n=!0,i=0;i\n \n
\n {{url}}\n
\n
\n ',methods:{onCopy(){alert(`You have copied: ${this.url}`)},onError(){alert("Something went wrong with copy.")}}}),Vue.component("v-info-content-url-unit",{props:["url"],template:'\n
\n {{url}}\n
\n Copy\n
\n
\n ',methods:{onCopy(){alert(`You have copied: ${this.url}`)},onError(){alert("Something went wrong with copy.")}}}),Vue.component("v-info-content-url-multiple",{props:["label"],template:'\n
\n \n
\n \n
\n
\n '}),Vue.component("v-info-content-url-external",{props:["label","url","volume"],data:function(){return{localUrl:this.url}},template:'\n
\n \n \n
\n ',methods:{onCopy(){alert(`You have copied: ${this.localUrl}`)},onError(){alert("Something went wrong with copy.")}},mounted(){var t=this;window.addEventListener("canvasswitch",(function(e){if(e.detail){var n=window.location.protocol,i=window.location.host,r=e.detail.canvas,o=t.volume,s=n+"//"+i+o+"/page/"+r;t.localUrl=s,t.vol=o}}))}}),Vue.component("v-info-content-url-image-link",{props:["label","pagelink"],data:function(){return{localUrls:this.url,pageresource:this.pageresource}},template:'\n
\n \n \n
\n ',methods:{onCopy(){alert(`You have copied: ${this.localUrls}`)},onError(){alert("Something went wrong with copy.")}},mounted(){var t=this;window.addEventListener("canvasswitch",(function(e){if(e.detail){window.location.protocol,window.location.host;var n=e.detail.canvas,i=(e.detail.volume,t.pagelink);axios.get(`iiif/resource/${e.detail.canvas}`).then((e=>{console.log(e.data.resource),console.log(e.data.text),t.pageresource=e.data.resource,t.pagetext=e.data.text})).catch((t=>{console.log(t)}));var r=i+"/"+n+"/full/full/0/default.jpg";t.localUrls=r,t.can=n}}))}}),Vue.component("v-info-content-url-page-text",{props:[],data:function(){return{pagetext:this.pagetext}},template:'\n
\n
\n \n

Text

\n

{{pagetext}}

\n
\n
\n ',methods:{},mounted(){var t=this;window.addEventListener("canvasswitch",(function(e){if(e.detail){window.location.protocol,window.location.host;var n=e.detail.canvas,i=(e.detail.volume,t.pagelink);axios.get(`iiif/resource/${e.detail.canvas}`).then((e=>{console.log(e.data.resource),console.log(e.data.text),t.pageresource=e.data.resource,t.pagetext=e.data.text})).catch((t=>{console.log(t)}));var r=i+"/"+n+"/full/full/0/default.jpg";t.localUrls=r,t.can=n}}))}}),new Vue({el:"#v-readux",delimiters:["[[","]]"],component:{VueClipboard},data:{options:["title","author","date published","date added"],searchPrefix:"?sort=",currentSelection:null,itemNotFound:!1,showMoreInfo:!1},methods:{sortBy:function(t){var e=this.searchPrefix+t;window.location!==e&&(window.location=e)},toggleMoreInfo:function(){this.showMoreInfo=!this.showMoreInfo}},mounted:function(){this.$refs["v-attr-sort"]&&(this.currentSelection=this.$refs["v-attr-sort"].getAttribute("data-sort")),window.location.href.includes("?q=")&&(this.showMoreInfo=!0)}})},625:function(t,e,n){t.exports=function(){"use strict";var t=Object.freeze({});function e(t){return null==t}function i(t){return null!=t}function r(t){return!0===t}function o(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function s(t){return null!==t&&"object"==typeof t}var a=Object.prototype.toString;function l(t){return a.call(t).slice(8,-1)}function c(t){return"[object Object]"===a.call(t)}function u(t){return"[object RegExp]"===a.call(t)}function h(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function d(t){return i(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function p(t){return null==t?"":Array.isArray(t)||c(t)&&t.toString===a?JSON.stringify(t,null,2):String(t)}function f(t){var e=parseFloat(t);return isNaN(e)?t:e}function g(t,e){for(var n=Object.create(null),i=t.split(","),r=0;r-1)return t.splice(n,1)}}var w=Object.prototype.hasOwnProperty;function x(t,e){return w.call(t,e)}function b(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var C=/-(\w)/g,k=b((function(t){return t.replace(C,(function(t,e){return e?e.toUpperCase():""}))})),$=b((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),_=/\B([A-Z])/g,S=b((function(t){return t.replace(_,"-$1").toLowerCase()}));var T=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var i=arguments.length;return i?i>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function L(t,e){e=e||0;for(var n=t.length-e,i=new Array(n);n--;)i[n]=t[n+e];return i}function A(t,e){for(var n in e)t[n]=e[n];return t}function O(t){for(var e={},n=0;n0,Q=X&&X.indexOf("edge/")>0,tt=(X&&X.indexOf("android"),X&&/iphone|ipad|ipod|ios/.test(X)||"ios"===J),et=(X&&/chrome\/\d+/.test(X),X&&/phantomjs/.test(X),X&&X.match(/firefox\/(\d+)/)),nt={}.watch,it=!1;if(Z)try{var rt={};Object.defineProperty(rt,"passive",{get:function(){it=!0}}),window.addEventListener("test-passive",null,rt)}catch(t){}var ot=function(){return void 0===U&&(U=!Z&&!K&&void 0!==n.g&&n.g.process&&"server"===n.g.process.env.VUE_ENV),U},st=Z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function at(t){return"function"==typeof t&&/native code/.test(t.toString())}var lt,ct="undefined"!=typeof Symbol&&at(Symbol)&&"undefined"!=typeof Reflect&&at(Reflect.ownKeys);lt="undefined"!=typeof Set&&at(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var ut,ht,dt,pt=E,ft="undefined"!=typeof console,gt=/(?:^|[-_])(\w)/g;ut=function(t,e){var n=e?pt(e):"";H.warnHandler?H.warnHandler.call(null,t,e,n):ft&&!H.silent&&console.error("[Vue warn]: "+t+n)},ht=function(t,e){ft&&!H.silent&&console.warn("[Vue tip]: "+t+(e?pt(e):""))},dt=function(t,e){if(t.$root===t)return"";var n="function"==typeof t&&null!=t.cid?t.options:t._isVue?t.$options||t.constructor.options:t,i=n.name||n._componentTag,r=n.__file;if(!i&&r){var o=r.match(/([^/\\]+)\.vue$/);i=o&&o[1]}return(i?"<"+function(t){return t.replace(gt,(function(t){return t.toUpperCase()})).replace(/[-_]/g,"")}(i)+">":"")+(r&&!1!==e?" at "+r:"")};pt=function(t){if(t._isVue&&t.$parent){for(var e=[],n=0;t;){if(e.length>0){var i=e[e.length-1];if(i.constructor===t.constructor){n++,t=t.$parent;continue}n>0&&(e[e.length-1]=[i,n],n=0)}e.push(t),t=t.$parent}return"\n\nfound in\n\n"+e.map((function(t,e){return""+(0===e?"---\x3e ":function(t,e){for(var n="";e;)e%2==1&&(n+=t),e>1&&(t+=t),e>>=1;return n}(" ",5+2*e))+(Array.isArray(t)?dt(t[0])+"... ("+t[1]+" recursive calls)":dt(t))})).join("\n")}return"\n\n(found in "+dt(t)+")"};var vt=0,mt=function(){this.id=vt++,this.subs=[]};mt.prototype.addSub=function(t){this.subs.push(t)},mt.prototype.removeSub=function(t){y(this.subs,t)},mt.prototype.depend=function(){mt.target&&mt.target.addDep(this)},mt.prototype.notify=function(){var t=this.subs.slice();H.async||t.sort((function(t,e){return t.id-e.id}));for(var e=0,n=t.length;e-1)if(o&&!x(r,"default"))a=!1;else if(""===a||a===S(t)){var u=Qt(String,r.type);(u<0||c0&&(Pe((a=Be(a,(n||"")+"_"+s))[0])&&Pe(c)&&(u[l]=$t(c.text+a[0].text),a.shift()),u.push.apply(u,a)):o(a)?Pe(c)?u[l]=$t(c.text+a):""!==a&&u.push($t(a)):Pe(a)&&Pe(c)?u[l]=$t(c.text+a.text):(r(t._isVList)&&i(a.tag)&&e(a.key)&&i(n)&&(a.key="__vlist"+n+"_"+s+"__"),u.push(a)));return u}function Fe(t,e){if(t){for(var n=Object.create(null),i=ct?Reflect.ownKeys(t):Object.keys(t),r=0;r0,s=e?!!e.$stable:!o,a=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&i&&i!==t&&a===i.$key&&!o&&!i.$hasNormal)return i;for(var l in r={},e)e[l]&&"$"!==l[0]&&(r[l]=Ve(n,l,e[l]))}else r={};for(var c in n)c in r||(r[c]=Ue(n,c));return e&&Object.isExtensible(e)&&(e._normalized=r),q(r,"$stable",s),q(r,"$key",a),q(r,"$hasNormal",o),r}function Ve(t,e,n){var i=function(){var t=arguments.length?n.apply(null,arguments):n({}),e=(t=t&&"object"==typeof t&&!Array.isArray(t)?[t]:je(t))&&t[0];return t&&(!e||1===t.length&&e.isComment&&!Re(e))?void 0:t};return n.proxy&&Object.defineProperty(t,e,{get:i,enumerable:!0,configurable:!0}),i}function Ue(t,e){return function(){return t[e]}}function We(t,e){var n,r,o,a,l;if(Array.isArray(t)||"string"==typeof t)for(n=new Array(t.length),r=0,o=t.length;r.",t),l=new bt(H.parsePlatformTagName(e),n,r,void 0,void 0,t)):l=n&&n.pre||!i(u=Wt(t.$options,"components",e))?new bt(e,n,r,void 0,void 0,t):pn(u,n,t,r,e)):l=pn(e,n,t,r),Array.isArray(l)?l:i(l)?(i(c)&&vn(l,c),i(n)&&function(t){s(t.style)&&Ae(t.style),s(t.class)&&Ae(t.class)}(n),l):kt()):kt());var l,c,u}(t,e,n,a,l)}function vn(t,n,o){if(t.ns=n,"foreignObject"===t.tag&&(n=void 0,o=!0),i(t.children))for(var s=0,a=t.children.length;sdocument.createEvent("Event").timeStamp&&(Hn=function(){return zn.now()})}function Rn(){var t,e;for(Fn=Hn(),Pn=!0,Mn.sort((function(t,e){return t.id-e.id})),Bn=0;Bn100)){ut("You may have an infinite update loop "+(t.user?'in watcher with expression "'+t.expression+'"':"in a component render function."),t.vm);break}var n=In.slice(),i=Mn.slice();Bn=Mn.length=In.length=0,Dn={},Nn={},jn=Pn=!1,function(t){for(var e=0;eBn&&Mn[n].id>t.id;)n--;Mn.splice(n+1,0,t)}else Mn.push(t);if(!jn){if(jn=!0,!H.async)return void Rn();ye(Rn)}}}(this)},Vn.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||s(t)||this.deep){var e=this.value;if(this.value=t,this.user){var n='callback for watcher "'+this.expression+'"';re(this.cb,this.vm,[t,e],this.vm,n)}else this.cb.call(this.vm,t,e)}}},Vn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},Vn.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},Vn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||y(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1}};var Un={enumerable:!0,configurable:!0,get:E,set:E};function Wn(t,e,n){Un.get=function(){return this[e][n]},Un.set=function(t){this[e][n]=t},Object.defineProperty(t,n,Un)}function Zn(t){t._watchers=[];var e=t.$options;e.props&&function(t,e){var n=t.$options.propsData||{},i=t._props={},r=t.$options._propKeys=[],o=!t.$parent;o||Ot(!1);var s=function(s){r.push(s);var a=Zt(s,e,n,t),l=S(s);(m(l)||H.isReservedAttr(l))&&ut('"'+l+'" is a reserved attribute and cannot be used as component prop.',t),It(i,s,a,(function(){o||Sn||ut("Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: \""+s+'"',t)})),s in t||Wn(t,"_props",s)};for(var a in e)s(a);Ot(!0)}(t,e.props),e.methods&&function(t,e){var n=t.$options.props;for(var i in e)"function"!=typeof e[i]&&ut('Method "'+i+'" has type "'+typeof e[i]+'" in the component definition. Did you reference the function correctly?',t),n&&x(n,i)&&ut('Method "'+i+'" has already been defined as a prop.',t),i in t&&R(i)&&ut('Method "'+i+'" conflicts with an existing Vue instance method. Avoid defining component methods that start with _ or $.'),t[i]="function"!=typeof e[i]?E:T(e[i],t)}(t,e.methods),e.data?function(t){var e=t.$options.data;c(e=t._data="function"==typeof e?function(t,e){wt();try{return t.call(e,e)}catch(t){return ie(t,e,"data()"),{}}finally{xt()}}(e,t):e||{})||(e={},ut("data functions should return an object:\nhttps://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function",t));for(var n=Object.keys(e),i=t.$options.props,r=t.$options.methods,o=n.length;o--;){var s=n[o];r&&x(r,s)&&ut('Method "'+s+'" has already been defined as a data property.',t),i&&x(i,s)?ut('The data property "'+s+'" is already declared as a prop. Use prop default value instead.',t):R(s)||Wn(t,"_data",s)}Mt(e,!0)}(t):Mt(t._data={},!0),e.computed&&function(t,e){var n=t._computedWatchers=Object.create(null),i=ot();for(var r in e){var o=e[r],s="function"==typeof o?o:o.get;null==s&&ut('Getter is missing for computed property "'+r+'".',t),i||(n[r]=new Vn(t,s||E,E,Kn)),r in t?r in t.$data?ut('The computed property "'+r+'" is already defined in data.',t):t.$options.props&&r in t.$options.props?ut('The computed property "'+r+'" is already defined as a prop.',t):t.$options.methods&&r in t.$options.methods&&ut('The computed property "'+r+'" is already defined as a method.',t):Jn(t,r,o)}}(t,e.computed),e.watch&&e.watch!==nt&&function(t,e){for(var n in e){var i=e[n];if(Array.isArray(i))for(var r=0;r-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!u(t)&&t.test(e)}function oi(t,e){var n=t.cache,i=t.keys,r=t._vnode;for(var o in n){var s=n[o];if(s){var a=s.name;a&&!e(a)&&si(n,o,i,r)}}}function si(t,e,n,i){var r=t[e];!r||i&&r.tag===i.tag||r.componentInstance.$destroy(),t[e]=null,y(n,e)}(function(e){e.prototype._init=function(e){var n,i,r=this;r._uid=Qn++,H.performance&&le&&(n="vue-perf-start:"+r._uid,i="vue-perf-end:"+r._uid,le(n)),r._isVue=!0,e&&e._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),i=e._parentVnode;n.parent=e.parent,n._parentVnode=i;var r=i.componentOptions;n.propsData=r.propsData,n._parentListeners=r.listeners,n._renderChildren=r.children,n._componentTag=r.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(r,e):r.$options=Ut(ti(r.constructor),e||{},r),we(r),r._self=r,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(r),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&$n(t,e)}(r),function(e){e._vnode=null,e._staticTrees=null;var n=e.$options,i=e.$vnode=n._parentVnode,r=i&&i.context;e.$slots=He(n._renderChildren,r),e.$scopedSlots=t,e._c=function(t,n,i,r){return gn(e,t,n,i,r,!1)},e.$createElement=function(t,n,i,r){return gn(e,t,n,i,r,!0)};var o=i&&i.data;It(e,"$attrs",o&&o.attrs||t,(function(){!Sn&&ut("$attrs is readonly.",e)}),!0),It(e,"$listeners",n._parentListeners||t,(function(){!Sn&&ut("$listeners is readonly.",e)}),!0)}(r),En(r,"beforeCreate"),function(t){var e=Fe(t.$options.inject,t);e&&(Ot(!1),Object.keys(e).forEach((function(n){It(t,n,e[n],(function(){ut('Avoid mutating an injected value directly since the changes will be overwritten whenever the provided component re-renders. injection being mutated: "'+n+'"',t)}))})),Ot(!0))}(r),Zn(r),function(t){var e=t.$options.provide;e&&(t._provided="function"==typeof e?e.call(t):e)}(r),En(r,"created"),H.performance&&le&&(r._name=dt(r,!1),le(i),ce("vue "+r._name+" init",n,i)),r.$options.el&&r.$mount(r.$options.el)}})(ei),function(t){var e={get:function(){return this._data}},n={get:function(){return this._props}};e.set=function(){ut("Avoid replacing instance root $data. Use nested data properties instead.",this)},n.set=function(){ut("$props is readonly.",this)},Object.defineProperty(t.prototype,"$data",e),Object.defineProperty(t.prototype,"$props",n),t.prototype.$set=Dt,t.prototype.$delete=Nt,t.prototype.$watch=function(t,e,n){var i=this;if(c(e))return Gn(i,t,e,n);(n=n||{}).user=!0;var r=new Vn(i,t,e,n);if(n.immediate){var o='callback for immediate watcher "'+r.expression+'"';wt(),re(e,i,[r.value],i,o),xt()}return function(){r.teardown()}}}(ei),function(t){var e=/^hook:/;t.prototype.$on=function(t,n){var i=this;if(Array.isArray(t))for(var r=0,o=t.length;r1?L(i):i;for(var r=L(arguments,1),o='event handler for "'+t+'"',s=0,a=i.length;sparseInt(this.max)&&si(e,n[0],n,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)si(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){oi(t,(function(t){return ri(e,t)}))})),this.$watch("exclude",(function(e){oi(t,(function(t){return!ri(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=xn(t),n=e&&e.componentOptions;if(n){var i=ii(n),r=this.include,o=this.exclude;if(r&&(!i||!ri(r,i))||o&&i&&ri(o,i))return e;var s=this.cache,a=this.keys,l=null==e.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):e.key;s[l]?(e.componentInstance=s[l].componentInstance,y(a,l),a.push(l)):(this.vnodeToCache=e,this.keyToCache=l),e.data.keepAlive=!0}return e||t&&t[0]}},ci={KeepAlive:li};(function(t){var e={get:function(){return H},set:function(){ut("Do not replace the Vue.config object, set individual fields instead.")}};Object.defineProperty(t,"config",e),t.util={warn:ut,extend:A,mergeOptions:Ut,defineReactive:It},t.set=Dt,t.delete=Nt,t.nextTick=ye,t.observable=function(t){return Mt(t),t},t.options=Object.create(null),B.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,A(t.options.components,ci),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=L(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Ut(this.options,t),this}}(t),ni(t),function(t){B.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&qt(t),"component"===e&&c(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"==typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)})(ei),Object.defineProperty(ei.prototype,"$isServer",{get:ot}),Object.defineProperty(ei.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(ei,"FunctionalRenderContext",{value:ln}),ei.version="2.6.14";var ui=g("style,class"),hi=g("input,textarea,option,select,progress"),di=function(t,e,n){return"value"===n&&hi(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},pi=g("contenteditable,draggable,spellcheck"),fi=g("events,caret,typing,plaintext-only"),gi=g("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),vi="http://www.w3.org/1999/xlink",mi=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},yi=function(t){return mi(t)?t.slice(6,t.length):""},wi=function(t){return null==t||!1===t};function xi(t){for(var e=t.data,n=t,r=t;i(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=bi(r.data,e));for(;i(n=n.parent);)n&&n.data&&(e=bi(e,n.data));return o=e.staticClass,s=e.class,i(o)||i(s)?Ci(o,ki(s)):"";var o,s}function bi(t,e){return{staticClass:Ci(t.staticClass,e.staticClass),class:i(t.class)?[t.class,e.class]:e.class}}function Ci(t,e){return t?e?t+" "+e:t:e||""}function ki(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?Ki(t,e,n):gi(e)?wi(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):pi(e)?t.setAttribute(e,function(t,e){return wi(e)||"false"===e?"false":"contenteditable"===t&&fi(e)?e:"true"}(e,n)):mi(e)?wi(n)?t.removeAttributeNS(vi,yi(e)):t.setAttributeNS(vi,e,n):Ki(t,e,n)}function Ki(t,e,n){if(wi(n))t.removeAttribute(e);else{if(Y&&!G&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var i=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",i)};t.addEventListener("input",i),t.__ieph=!0}t.setAttribute(e,n)}}var Ji={create:Wi,update:Wi};function Xi(t,n){var r=n.elm,o=n.data,s=t.data;if(!(e(o.staticClass)&&e(o.class)&&(e(s)||e(s.staticClass)&&e(s.class)))){var a=xi(n),l=r._transitionClasses;i(l)&&(a=Ci(a,ki(l))),a!==r._prevClass&&(r.setAttribute("class",a),r._prevClass=a)}}var Yi,Gi,Qi,tr,er,nr,ir,rr={create:Xi,update:Xi},or=/[\w).+\-_$\]]/;function sr(t){var e,n,i,r,o,s=!1,a=!1,l=!1,c=!1,u=0,h=0,d=0,p=0;for(i=0;i=0&&" "===(g=t.charAt(f));f--);g&&or.test(g)||(c=!0)}}else void 0===r?(p=i+1,r=t.slice(0,i).trim()):v();function v(){(o||(o=[])).push(t.slice(p,i).trim()),p=i+1}if(void 0===r?r=t.slice(0,i).trim():0!==p&&v(),o)for(i=0;i-1?{exp:t.slice(0,tr),key:'"'+t.slice(tr+1)+'"'}:{exp:t,key:null};for(Gi=t,tr=er=nr=0;!$r();)_r(Qi=kr())?Tr(Qi):91===Qi&&Sr(Qi);return{exp:t.slice(0,er),key:t.slice(er+1,nr)}}(t);return null===n.key?t+"="+e:"$set("+n.exp+", "+n.key+", "+e+")"}function kr(){return Gi.charCodeAt(++tr)}function $r(){return tr>=Yi}function _r(t){return 34===t||39===t}function Sr(t){var e=1;for(er=tr;!$r();)if(_r(t=kr()))Tr(t);else if(91===t&&e++,93===t&&e--,0===e){nr=tr;break}}function Tr(t){for(var e=t;!$r()&&(t=kr())!==e;);}var Lr,Ar="__r";function Or(t,e,n){var i=Lr;return function r(){null!==e.apply(null,arguments)&&Ir(t,r,n,i)}}var Er=ue&&!(et&&Number(et[1])<=53);function Mr(t,e,n,i){if(Er){var r=Fn,o=e;e=o._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=r||t.timeStamp<=0||t.target.ownerDocument!==document)return o.apply(this,arguments)}}Lr.addEventListener(t,e,it?{capture:n,passive:i}:n)}function Ir(t,e,n,i){(i||Lr).removeEventListener(t,e._wrapper||e,n)}function Dr(t,n){if(!e(t.data.on)||!e(n.data.on)){var r=n.data.on||{},o=t.data.on||{};Lr=n.elm,function(t){if(i(t.__r)){var e=Y?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}i(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(r),Ie(r,o,Mr,Ir,Or,n.context),Lr=void 0}}var Nr,jr={create:Dr,update:Dr};function Pr(t,n){if(!e(t.data.domProps)||!e(n.data.domProps)){var r,o,s=n.elm,a=t.data.domProps||{},l=n.data.domProps||{};for(r in i(l.__ob__)&&(l=n.data.domProps=A({},l)),a)r in l||(s[r]="");for(r in l){if(o=l[r],"textContent"===r||"innerHTML"===r){if(n.children&&(n.children.length=0),o===a[r])continue;1===s.childNodes.length&&s.removeChild(s.childNodes[0])}if("value"===r&&"PROGRESS"!==s.tagName){s._value=o;var c=e(o)?"":String(o);Br(s,c)&&(s.value=c)}else if("innerHTML"===r&&Si(s.tagName)&&e(s.innerHTML)){(Nr=Nr||document.createElement("div")).innerHTML=""+o+"";for(var u=Nr.firstChild;s.firstChild;)s.removeChild(s.firstChild);for(;u.firstChild;)s.appendChild(u.firstChild)}else if(o!==a[r])try{s[r]=o}catch(t){}}}}function Br(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(i(r)){if(r.number)return f(n)!==f(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var Fr={create:Pr,update:Pr},Hr=b((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var i=t.split(n);i.length>1&&(e[i[0].trim()]=i[1].trim())}})),e}));function zr(t){var e=Rr(t.style);return t.staticStyle?A(t.staticStyle,e):e}function Rr(t){return Array.isArray(t)?O(t):"string"==typeof t?Hr(t):t}var qr,Vr=/^--/,Ur=/\s*!important$/,Wr=function(t,e,n){if(Vr.test(e))t.style.setProperty(e,n);else if(Ur.test(n))t.style.setProperty(S(e),n.replace(Ur,""),"important");else{var i=Kr(e);if(Array.isArray(n))for(var r=0,o=n.length;r-1?e.split(Yr).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Qr(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(Yr).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",i=" "+e+" ";n.indexOf(i)>=0;)n=n.replace(i," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function to(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&A(e,eo(t.name||"v")),A(e,t),e}return"string"==typeof t?eo(t):void 0}}var eo=b((function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}})),no=Z&&!G,io="transition",ro="animation",oo="transition",so="transitionend",ao="animation",lo="animationend";no&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(oo="WebkitTransition",so="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(ao="WebkitAnimation",lo="webkitAnimationEnd"));var co=Z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function uo(t){co((function(){co(t)}))}function ho(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),Gr(t,e))}function po(t,e){t._transitionClasses&&y(t._transitionClasses,e),Qr(t,e)}function fo(t,e,n){var i=vo(t,e),r=i.type,o=i.timeout,s=i.propCount;if(!r)return n();var a=r===io?so:lo,l=0,c=function(){t.removeEventListener(a,u),n()},u=function(e){e.target===t&&++l>=s&&c()};setTimeout((function(){l0&&(n=io,u=s,h=o.length):e===ro?c>0&&(n=ro,u=c,h=l.length):h=(n=(u=Math.max(s,c))>0?s>c?io:ro:null)?n===io?o.length:l.length:0,{type:n,timeout:u,propCount:h,hasTransform:n===io&&go.test(i[oo+"Property"])}}function mo(t,e){for(;t.length explicit "+e+" duration is not a valid number - got "+JSON.stringify(t)+".",n.context):isNaN(t)&&ut(" explicit "+e+" duration is NaN - the duration expression might be incorrect.",n.context)}function Co(t){return"number"==typeof t&&!isNaN(t)}function ko(t){if(e(t))return!1;var n=t.fns;return i(n)?ko(Array.isArray(n)?n[0]:n):(t._length||t.length)>1}function $o(t,e){!0!==e.data.show&&wo(e)}var _o=function(t){var n,s,a={},l=t.modules,c=t.nodeOps;for(n=0;n - did you register the component correctly? For recursive components, make sure to provide the "name" option.',t.context),t.elm=t.ns?c.createElementNS(t.ns,g):c.createElement(g,t),b(t),y(t,f,e),i(h)&&x(t,e),m(n,t.elm,o),h&&h.pre&&p--):r(t.isComment)?(t.elm=c.createComment(t.text),m(n,t.elm,o)):(t.elm=c.createTextNode(t.text),m(n,t.elm,o))}}function v(t,e){i(t.data.pendingInsert)&&(e.push.apply(e,t.data.pendingInsert),t.data.pendingInsert=null),t.elm=t.componentInstance.$el,w(t)?(x(t,e),b(t)):(Di(t),e.push(t))}function m(t,e,n){i(t)&&(i(n)?c.parentNode(n)===t&&c.insertBefore(t,e,n):c.appendChild(t,e))}function y(t,e,n){if(Array.isArray(e)){S(e);for(var i=0;ip?C(t,e(r[m+1])?null:r[m+1].elm,r,d,m,o):d>m&&$(n,h,p)}(h,g,v,o,u):i(v)?(S(v),i(t.text)&&c.setTextContent(h,""),C(h,null,v,0,v.length-1,o)):i(g)?$(g,0,g.length-1):i(t.text)&&c.setTextContent(h,""):t.text!==n.text&&c.setTextContent(h,n.text),i(p)&&i(d=p.hook)&&i(d=d.postpatch)&&d(t,n)}}}function A(t,e,n){if(r(n)&&i(t.parent))t.parent.data.pendingInsert=e;else for(var o=0;o, or missing . Bailing hydration and performing full client-side render.")}C=t,t=new bt(c.tagName(C).toLowerCase(),{},[],void 0,C)}var d=t.elm,p=c.parentNode(d);if(f(n,u,d._leaveCb?null:p,c.nextSibling(d)),i(n.parent))for(var g=n.parent,v=w(n);g;){for(var m=0;m-1,s.selected!==o&&(s.selected=o);else if(D(Oo(s),i))return void(t.selectedIndex!==a&&(t.selectedIndex=a));r||(t.selectedIndex=-1)}else ut('