How to write an address

The examples on the Thailand wikipage are confusing e.g.
addr:subdistrict=Bang Talat Subdistrict
The word Subdistrict seems redundant. I think it should only be
addr:subdistrict=Bang Talat

Is this correct?

I agree; the addr:subdistrict key does not need the word subdistrict repeated in its value. It is redundant.

However, seeing as you’re working in Thailand, any key you enter in English needs to have an “:en” suffix on them. Unless, of course, you use Thai characters for the values.

addr:subdistrict:en=Bang Talat

First, the English address, as Dave said, should be kept in addr:subdistrict:en=*.

For addr:street=* and addr:place=*, it should be full terms because they should correspond with the nearby mapped street/village name tag.

However, I’m unsure about addr:subdistrict=, addr:district=, and addr:province=*. If it is to correspond with the nearby boundary=administrative, it should be in full terms, including “Subdistrict”. If it is not necessary, then the words subdistrict can be removed.

Another issue is that including these words is not always useless. Although the terms subdistrict and district are always the same in English, they differ in Thai between Bangkok and other provinces (subdistrict–ตำบล or แขวง, district–อำเภอ or เขต). Also, Bangkok does not have the suffix “Province” for province-level. Removing these words may not be a problem for mappers, and it may be easier, but developers who want to use this data for some purpose, such as generating a formal address, may have some difficulties.

I have to say, I never mapped subdistrict.

In this question we have multiple topics.

First, and undisputed:
Only in the *:en tags you place the RTGS transliteration or otherwise used English name.
There is no need to manually create transliterations for all names. This is a task a script can do as well on the side of data consumers like map producers. See other threads for examples pointing to some libraries.

For the “redundant” part:
In many cases it is common in Thai to have the “describing” part of something part of the name. A school is a “Rongrian something” and so on.
We keep the full names in the database, as it is a very simple task to shorten or leave out this part from data based on algorithms, but the opposite way around is often hard to impossible.
You can compare that with some terms also in western world often repeated. Many roads are calles “something road”, even as we already know from tagging that it is actually a road. Similarly many Hotels have the term “hotel” in the name. We still map it, as it is part of their name.

If you look at signs of government offices, you will also often find that as part of the name.

So I think for all name related things we have an agreement to tag full.

What would be a benefit to not do the same on these relatively rarely mapped address tags?
As above, algorithms can easily drop it on consumer side in case not required for a specific use-case. For other scenarios it is better to keep it in the database.

So summary: Keep full in the tag. For the addr:subsistrict sample above use THAI script.

The wikipage is correct then. ตำบล Subdistrict, อำเภอ District and จังหวัด Province are required and the English address goes to :en tags.

addr:district, addr:subdistrict should contain exactly the same value as a name key in correspondent OSM object. Usually it is administrative boundary with appropriate admin_level