According to the official SQL standards documentation, TRUNCATE TABLE is a data manipulation statement and has been since it was introduced in the 2008 version of the standard.1
Various database vendors describe TRUNCATE as DDL, apparently following the lead of Oracle who seem to have been the first to refer to it that way. Oracle's classification of TRUNCATE as DDL presumably arose because of their internal implementation of the truncate operation and others continue to apply the DDL label even though they don't implement TRUNCATE the same way as Oracle.
In standard SQL the difference between TRUNCATE and DELETE without a WHERE clause is that TRUNCATE does not invoke any triggered actions. Logically it behaves as data manipulation and in the standard it comes in section 14 along with all other data manipulation language (including DELETE which immediately precedes TRUNCATE). There seems to be no sound reason to call it DDL, it's just a long-standing convention in vendors' documentation.