Also available in: Español · Português · Français · العربية
Language Codes
The complete ISO 639 list with all three code forms, and a straight answer to which one belongs in your markup.
What are ISO language codes?
A language code is the short identifier you put in an HTML lang attribute, a filename, an Accept-Language header or a database column. There are three forms of it. ISO 639-1 is the familiar two-letter code — en, de, fr. ISO 639-2 is three letters, and it covers far more languages. ISO 639-3 goes further still, to roughly seven thousand.
This page lists ISO 639-2 in full, straight from the Library of Congress, which is the registration authority for the standard. That is 487 rows: 486 languages plus one entry that is not a language at all, which the table flags. Each row shows its two-letter code where one exists, both of its three-letter codes, and which one you should actually use.
That last column exists because of something the standard does that catches people out: for twenty languages there are two different three-letter codes, both official, both current. Neither is a typo or a legacy alias.
How to use this page
- Search by name or by any of the three codes. Typing “de”, “ger”, “deu” or “German” all land on the same row, and so does the name in your own language. Exact code matches rank first, which matters because “is” is Icelandic’s code and also a substring of dozens of language names.
- Tick the filter to see only the ambiguous twenty. Those are the languages where the two three-letter codes differ. The list below the table shows each pair side by side with the reason they differ.
- Read the “use this” column and copy from it. It gives the two-letter code when one exists and the terminological three-letter code otherwise — which is what BCP 47 requires, and therefore what belongs in HTML, HTTP and anything a browser reads.
Why twenty languages have two codes
ISO 639-2 assigns codes on two different principles and, for twenty languages, they disagree. The bibliographic code follows the language’s English name: German is ger, French is fre, Chinese is chi, Dutch is dut, Welsh is wel. The terminological code follows what speakers call the language themselves: Deutsch gives deu, français gives fra, Zhōngwén gives zho, Nederlands gives nld, Cymraeg gives cym.
The bibliographic codes exist because library catalogues were built on them long before anyone needed a language tag for a web page, and changing them would have broken every card index in the world. The terminological codes exist because naming a language after what its speakers call it is the better principle. Both survived, so both are current, and which one is “correct” depends on whether you are cataloguing a book or labelling a document.
The full twenty are Albanian, Armenian, Basque, Burmese, Chinese, Czech, Dutch, French, Georgian, German, Greek, Icelandic, Macedonian, Malay, Maori, Persian, Romanian, Slovak, Tibetan and Welsh. Every other language in the standard — 466 of them — has one three-letter code and no ambiguity at all.
There is a pattern worth noticing, and it is not a coincidence: every one of the twenty is a language whose English name differs sharply from its endonym. Nobody had to choose between two codes for Japanese, because jpn works either way.
Which one should you actually use?
For the web, neither. Use the two-letter code, and this is not a preference — it is what the specification says. BCP 47, the standard behind the HTML lang attribute, the Accept-Language header and every browser language API, requires the shortest available subtag. Where a language has an ISO 639-1 code, that code is the only correct tag and the three-letter forms are simply wrong in that context.
That resolves the ambiguity completely, and the reason is a property rather than a coincidence: all twenty of the languages with two three-letter codes also have a two-letter code. We check that rather than assert it, because a single exception would break the rule. So the web never has to choose between ger and deu — it uses de, and both three-letter spellings canonicalise to exactly that, which we also verify.
The ambiguity only reaches you when you work in three-letter codes: MARC records, some subtitle formats, older terminology databases, anything modelled on library practice. There the convention is usually bibliographic, and the safe move is to say in your schema which of the two you mean rather than assuming your reader shares your default.
Honest limits
Most languages have no two-letter code. Only 183 of the 486 do; the other 303 have three letters and nothing shorter. Cebuano, spoken by more than twenty million people, is ceb and has no ISO 639-1 form. So a database column of char(2) cannot store most of the world’s languages, and a language picker built from the two-letter list is quietly excluding the majority of them.
One row in the file is not a language. The entry qaa-qtz is a range, standing for 520 codes reserved for private use — anyone can use them internally for a language the standard does not cover, and none of them will ever be assigned. The table shows it as one row and labels it, rather than pretending it is a language or dropping it silently.
The localized names come from Unicode CLDR, which does not have a name for every entry. The collective codes such as “Bantu languages” and many ancient and constructed languages have no CLDR name in any language, so those rows fall back to the English name from the registration authority. Around 419 of the 486 are named in each language, and the exact figure differs slightly between them — which is what a genuine gap in the data looks like, as opposed to a lookup that is failing.
Finally, this is ISO 639-2 and not 639-3. The larger standard covers roughly seven thousand languages, including nearly every one that has ever been documented, and it is maintained separately by SIL International. If a language you need is missing here, that is where to look.
Why is it free?
Because it is a table and a search box. The whole list is in the page you have already loaded, the search runs in your browser, and nothing you type is sent anywhere.
So there is no account, no sign-up and nothing held back. The generator that builds this from the Library of Congress list and Unicode CLDR is in the repository beside the page, along with the 2,011-assertion test suite that checks the codes, the twenty ambiguous pairs and the BCP 47 property — including the negative controls that stop those tests passing for the wrong reason.