Correct use of LANGUAGE (TLAN)

We recently had an interesting discussion about how to use the ID3v2 LANGUAGE tag "TLAN" over in the MusicIP Forums.

It seems that more than one language in the TLAN field (i.e., for duets and the like) should be separated by NULL characters, so how would we handle that in Mp3tag? (A NULL character cannot readily be entered into input fields, or displayed.)

Florian, any ideas? Like maybe a "pseudo separation sequence" one could enter into the field and which in turn would be displayed again? I know our broadcasting software does this for the "lyrics" (USLT) field: You can enter something like "eng||lyrics text..." or "ger||lyrics text..." and it will get converted.

Here is a short excerpt of what my ideas are regarding the TLAN tag:

From "TLAN: The 'Language(s)' frame should contain the languages of the text or lyrics spoken or sung in the audio. The language is represented with three characters according to ISO-639-2. If more than one language is used in the text their language codes should follow according to their usage."

For sorting, the "bibliographic" (i.e., "ger" for German) and "terminology" (i.e., "deu" for German) language codes should be considered equal, since many people are unsure which to use, and many languages have both variants.

In the interest of most people understandig it, I strongly opt for only using the bibliographic terms, i.e. "per" for "Persian" and "ger" for "German" - most foreigneirs would probably not know about "far" meaning "Farsi" (the Persian language) and "deu" meaning "Deutsch" (the German language).

Also, there are songs out there sung in more than one language, so these should be found/sorted according to whatever is in the tag (i.e., "ger" and "eng" should be sorted as "German" since that comes first, but found as "German" and "English").


  • A German-language song:
    "ger" (or "deu")
    Sorted and found under "ger".
  • A German song with some lines of English in it:
    "ger" and "eng" - since the main part is in German (not "eng" and "ger"!)
    Sorted under "ger" but found under both "ger" and "eng".
  • A duet sung in English, with many Italian parts:
    "eng" and "ita" - since the main part is still English (not "ita" and "eng")
    Sorted under "eng" but found under both "eng" and "ita".
  • An instrumental title:
    Should not have a TLAN tag (or maybe an empty one). No reason to show it as "instrumental", though - it might just not have been tagged and still be a song with lyrics. (In my opinion, it just might be a good idea to set up a de-facto standard of "No TLAN=untagged" and "Empty TLAN=instrumental".)

Multiple tag values are possible with the \\ syntax e.g. deu\\eng
Or just create another LANGUAGE field with extended tags view.

Great... thanks a lot, dano - I must have overlooked that.

What will that do internally? Create a NUL character?

I was looking for the language code, used by others for instrumental music. Leave it blank, as suggested here, I do not consider as a good solution. First, I do not know, how to achieve this (if I do not write anything, there will simply be no TLAN tag), and even if there is a solution, it probably will not appear in the Mp3tag.

So a simple poll: how others use the TLAN in instrumental music?
May be, zxx, for "no linguistic content, not applicable"?

Exactly true. ISO 639-2 and ISO 639-3 (which should be used) have been supplemented by these four special codes:

  • mis: Missing code (i.e., language not yet defined in ISO 639-3)
  • mul: Multiple languages (if you don’t use multivalue language tags)
  • und: Undetermined (i.e., a language you can’t find out, like mysterious human sounds or growled words that can’t be understood)
  • zxx: No linguistic content, i.e. instrumental

I quite simply use "Instrumental".
This does not comply with the standards but gives a hint.
MP3tag can filter for files that do not have a field - but the absence of a field does not transport the information whether the file has already been treated or not. So it could be that you find the same file again and again.
So I use "Instrumental".

Quoting the ID3v2.3.0 spec, this is illegal:

The 'Language(s)' frame should contain the languages of the text or lyrics spoken or sung in the audio. The language is represented with three characters according to ISO-639-2. If more than one language is used in the text their language codes should follow according to their usage.

Sadly enough, I often run across badly tagged files that have things like Unknown, English or even русский in this frame. und (or no tag at all), eng and rus would be correct instead.

Also, using ISO 639-2 terminological codes, or even better, ISO 639-3 codes (which are all T codes) is correct. So it’s never ger for German, but deu instead.

Using the correct codes is a great help if you have larger collections (like mine, about 150,000 songs) and wish to select for things like "all hard rock titles from Norwegian bands sung in Old Norsk", for instance. Or maybe "all instrumental pop songs".

Correcting myself 12 years after … :slight_smile:

So i rewrote my files and autoplaylistes to use zxx for instrumental music. But yet i confused with croon, hum, for example in relaxing musics. Und seems not to be a good choice -- croon and hum i exactly can identify (...and do not like them in most cases, so want to distinguish it from the instrumental).

und (for undetermined) is used in situations in which a language or languages must be indicated but the language cannot be identified.

No reply. So i decided to use hmm for croon and hum. It is onomatopoeic, and not reserved.

It would be helpful indeed if Mp3tag presented and accepted localized terms, but only ever stored correct alpha-3 codes. The respective data is available in CLDR, but it is not that sole to handle or one wants to get it right.

There is absolutely no use to accept something that cannot be used any further.
MP3tag should show the field contents as it is and will be. Everything else would only lead to irritation.
And here MP3tag follows the standard which has been implemented apparently without the vision that other character sets than just the western could be of interest.

No, users should not be bothered with the decision which of deu, Ger or DE would be the proper code for German. They should be able to select German or Deutsch or Tysk or Niemcy or Allemand as appropriate for their system language from a predefined list. They should also be able to enter a valid but unknown code (i.e. three lowercase letters), but not an invalid value (e.g. digits or non-ASCII or the wrong number of letters).

This would lead to irritation as I would not recognize what I entered when I re-open the file unless the tag would remember what I entered during the last time I editted the file. And if that was not me, what should I see then?
So it is rather likely that next user, perhaps from a different country would be puzzled to see something that he cannot decipher.
So it would be necessary to have a reference table between that what is saved in the tags and that what it looks like in my environment.
And this double-dutch somersault has not been defined in the ID3 standard - instead it uses the ISO 3166 standard.

Huh? Every user would see the language name in their local language. Itʼs like predefined genres which are stored as an 8-bit integer.

What I mean:
I enter "Deutsch", save the tag and next time I open the file I see "deu".
Or I enter "ger" and next time I open the file I see "deu".
This would be puzzling to me.

Thatʼs not what I meant. You would only see Deutsch, others would see German, nobody would see deu nor ger, except in other programs or perhaps in ALT+T.

That is more or less what I meant: you select "Deutsch" and other programs show "deu" as they show the raw data - how would I retranslate? ... the ID3 standard simply does not offer more language support.

I honestly do not understand. Would you complain if a user interface presented you with a checkbox for a boolean field, so you would not have to remember whether the binary value actually needs to be stored as 0 / 1 or as something else, e.g. 0x0 / 0x1, false / true, off / on or no / yes?

Another example in Mp3tag is ITUNESMEDIATYPE which is stored as an integer value, but displayed as a keyword (which unfortunately is always in English) and can be entered as either of these (e.g. 9 = Movie).