Skip to main content

Look-up utilities for ISO 639 language codes and names

Project description

python-iso639

PyPI version Supported Python versions CircleCI Builds

python-iso639 is a Python package for accessing ISO 639 language codes, names, and other associated information.

Current features:

  • A representation of languages mapped across ISO 639-1, 639-2, and 639-3.
  • Functionality to "guess" what a language is for a given unknown language code or name.

Installation

pip install python-iso639

Usage

python-iso639 revolves around a Language class. Instances of Language have attributes and methods that you will find useful.

Note that while the package name registered on PyPI is python-iso639, the actual import name during runtime is iso639 (which means you should do import iso639 in your Python code).

Creating Language Instances

Create a Language instance by one of the methods.

from_part3, with an ISO 639-3 code

>>> import iso639
>>> lang1 = iso639.Language.from_part3('fra')
>>> type(lang1)
<class 'iso639.language.Language'>
>>> lang1
Language(part3='fra', part2b='fre', part2t='fra', part1='fr', scope='I', type='L', name='French', comment=None, other_names=None, macrolanguage=None, retire_reason=None, retire_change_to=None, retire_remedy=None, retire_date=None)

From Another ISO 639 Code Set or a Reference Name

>>> lang2 = iso639.Language.from_part2b('fre')  # ISO 639-2 (bibliographic)
>>> lang3 = iso639.Language.from_part2t('fra')  # ISO 639-2 (terminological)
>>> lang4 = iso639.Language.from_part1('fr')  # ISO 639-1
>>> lang5 = iso639.Language.from_name('French')  # ISO 639-3 reference language name

You Get None for Invalid Inputs

The user input is case-sensitive!

>>> None == iso639.Language.from_part3('Fra') == iso639.Language.from_name("unknown language")
True

Accessing Attributes

>>> lang1
Language(part3='fra', part2b='fre', part2t='fra', part1='fr', scope='I', type='L', name='French', comment=None, other_names=None, macrolanguage=None, retire_reason=None, retire_change_to=None, retire_remedy=None, retire_date=None)
>>> lang1.part3
'fra'
>>> lang1.name
'French'

Comparison

>>> lang1 == lang2 == lang3 == lang4 == lang5  # All are French
True
>>> lang6 = iso639.Language.from_part3('spa')  # Spanish
>>> lang1 == lang6  # French vs. Spanish
False
>>> 'French' == lang1.name == lang2.name == lang3.name == lang4.name == lang5.name
True
>>> lang6.name
'Spanish'

Guess a Language: Classmethod match

You don't know which code set or name your input is from? Use the match classmethod:

>>> lang1 = iso639.Language.match('fra')
>>> lang2 = iso639.Language.match('fre')
>>> lang3 = iso639.Language.match('fr')
>>> lang4 = iso639.Language.match('French')
>>> lang1 == lang2 == lang3 == lang4
True

The classmethod match is particularly useful for consistently accessing a specific attribute from unknown inputs, e.g., the ISO 639-3 code.

>>> 'fra' == lang1.part3 == lang2.part3 == lang3.part3 == lang4.part3
True

If there's no match, None is returned. You may need to catch a potential AttributeError:

>>> lang = iso639.Language.match('not gonna find a match')
>>> lang is None
True
>>> lang.part3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'part3'
>>> try:
...     code = lang.part3
... except AttributeError:
...     code = None
...     print("no match found!")
... 
no match found!

Macrolanguages and Alternative Names

>>> language = iso639.Language.match('yue')
>>> language.name
'Yue Chinese'  # also commonly known as Cantonese
>>> language.macrolanguage
'zho'  # Chinese
>>> language.other_names
[Name(print='Yue Chinese', inverted='Chinese, Yue')]
>>> for name in language.other_names:
...     print(f'{name.print} | {name.inverted}')
...
Yue Chinese | Chinese, Yue

Retired Language Codes:

>>> language = iso639.Language.match('bvs')
>>> language.part3
'bvs'
>>> language.name
'Belgian Sign Language'
>>> language.status
'R'  # (R)etired
>>> language.retire_reason
'S'  # (S)plit
>>> language.retire_change_to is None
True
>>> language.retire_remedy
'Split into Langue des signes de Belgique Francophone [sfb], and Vlaamse Gebarentaal [vgt]'
>>> language.retire_date
datetime.date(2007, 7, 18)

Into the Weeds

Attributes of a Language Instance

A Language instance has the following attributes:

Attribute Data type Can it be None? Description
part3 str ISO 639-3 code
part2b str ISO 639-2 code (bibliographic)
part2t str ISO 639-2 code (terminological)
part1 str ISO 639-1 code
scope str One of {(I)ndividual, (M)acrolanguage, (S)pecial}
type str One of {(A)ncient, (C)onstructed, (E)xtinct, (H)istorical, (L)iving, (S)pecial} [1]
status str One of {(A)ctive, (R)etired}, describing the ISO 639-3 code
name str Reference language name in ISO 639-3
comment str Comment from ISO 639-3
other_names List[Name] Other print and inverted names [2]
macrolanguage str Macrolanguage
retire_reason str Retirement reason, one of {(C)hange, (D)uplicate, (N)on-existent, (S)plit, (M)erge}
retire_change_to str ISO 639-3 code to which this language can be changed, if retirement reason is one of {(C)hange, (D)uplicate, (M)erge}
retire_remedy str Instructions for updating this retired language code
retire_date datetime.date The date the retirement became effective

[1] If the ISO 639-3 code is retired, then the type attribute is None, because its value is not clearly discernible from the SIL data source.

[2] A Name instance has the attributes print and inverted, for the print name and inverted name, respectively. If reference name, print name, and inverted name are all the same, then that particular (print name, inverted name) pair is excluded from the other_names attribute. For example, for Spanish (ISO 639-3: spa), one (print name, inverted name) pair is (Spanish, Spanish) from the SIL data source, but this pair is excluded from its list of other_names.

How Language.match Matches the Language

At a high level, Language.match assumes the input is more likely to be a language code rather than a language name. Beyond that, the precise order in matching is as follows:

  • ISO 639-3 codes (among the active codes)
  • ISO 639-2 (bibliographic) codes
  • ISO 639-2 (terminological) codes
  • ISO 639-1 codes
  • ISO 639-3 codes (among the retired codes)
  • ISO 639-3 reference language names
  • ISO 639-3 alternative language names (the "print" ones)
  • ISO 639-3 alternative language names (the "inverted" ones)

Only exact matching is done (there's no fuzzy string matching of any sort). As soon as a match is found, Language.match returns a Language instance. If there isn't a match, None is returned.

Language is a dataclass

The Language class is a dataclass. All functionality of dataclases applies to Language and its instances, e.g., dataclasses.asdict:

>>> import dataclasses, iso639
>>> language = iso639.Language.match('fra')
>>> dataclasses.asdict(language)
{'part3': 'fra', 'part2b': 'fre', 'part2t': 'fra', 'part1': 'fr', 'scope': 'I', 'type': 'L', 'status': 'A', 'name': 'French', 'comment': None, 'other_names': None, 'macrolanguage': None, 'retire_reason': None, 'retire_change_to': None, 'retire_remedy': None, 'retire_date': None}

Constants

  • DATA_LAST_UPDATED: The release date of the included language code data from SIL

    >>> import iso639
    >>> iso639.DATA_LAST_UPDATED
    datetime.date(2022, 3, 11)
    
  • ALL_LANGUAGES: The list of all Language objects based on the included language code data

    >>> import iso639
    >>> type(iso639.ALL_LANGUAGES)
    <class 'list'>
    >>> len(iso639.ALL_LANGUAGES)
    7910
    >>> iso639.ALL_LANGUAGES[0]
    Language(part3='aaa', scope='I', type='L', status='A', name='Ghotuo', ...)
    

Links

License and Data Source

The python-iso639 code is released under an Apache 2.0 license. Please see LICENSE.txt for details.

The data source that backs this package is the language code tables published by SIL. Note that SIL resources have their terms of use.

Why Another ISO 639 Package?

Both packages iso639 and iso-639 exist on PyPI. However, as of this writing (May 2022), they were last updated in 2016 and don't seem to be maintained anymore for updating the language codes. pycountry is a great package, but what if you want a more lightweight package with just the language codes only and not the other stuff? :-)

If you ever notice that the upstream ISO 639-3 tables from SIL have been updated and yet this package isn't using the latest data, please ping me by opening a GitHub issue.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python-iso639-2022.9.17.tar.gz (276.9 kB view details)

Uploaded Source

Built Distribution

python_iso639-2022.9.17-py3-none-any.whl (274.2 kB view details)

Uploaded Python 3

File details

Details for the file python-iso639-2022.9.17.tar.gz.

File metadata

  • Download URL: python-iso639-2022.9.17.tar.gz
  • Upload date:
  • Size: 276.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for python-iso639-2022.9.17.tar.gz
Algorithm Hash digest
SHA256 434027004b63738395410c9e7df8ce08e3c9c97be0e01bc8e7fc515014959923
MD5 dff15899e68a5cd4b0ab9b28af4745cd
BLAKE2b-256 53d2fd533df602514fb4ca030ebce51b9bf74ef4431caa8620f2db1465d0a649

See more details on using hashes here.

File details

Details for the file python_iso639-2022.9.17-py3-none-any.whl.

File metadata

File hashes

Hashes for python_iso639-2022.9.17-py3-none-any.whl
Algorithm Hash digest
SHA256 9c45335c81aa288a28e45e66484306e340777adac01e6cb2ee84c9909ffa3f18
MD5 c62a98ae4677cb796783e138b5e72819
BLAKE2b-256 6e502f9cbe9bf76b1ec020afb9cdf92d0d541eb65d562c4a073a6346490508fb

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page