este link descreve como o descritor de strings 0 contém a lista de todos os idiomas usados pelo resto das strings como códigos de 16 bits, por exemplo, 0x0409 para inglês dos EUA. (Na maioria das vezes, a lista consiste em apenas um idioma).
Quando um utilitário usb solicita uma pesquisa de strings, ele especifica com este código de 16 bits qual dos idiomas que deseja ou 0 para um padrão. Eu imagino que a maioria dos utilitários procura apenas pela primeira língua. Todas as strings estão em unicode.
Você pode escrever algum python simples para obter o código de idioma (pacote de instalação pyusb):
#!/usr/bin/python
import usb.core
import usb.util
import usb.control
def getlangs(dev): # from /usr/lib/python2.7/site-packages/usb/util.py
# Asking for the zero'th index is special - it returns a string
# descriptor that contains all the language IDs supported by the device.
# Typically there aren't many - often only one. The language IDs are 16
# bit numbers, and they start at the third byte in the descriptor. See
# USB 2.0 specification section 9.6.7 for more information.
# Note from libusb 1.0 sources (descriptor.c)
buf = usb.control.get_descriptor(dev, 254, usb.util.DESC_TYPE_STRING, 0)
assert len(buf) >= 4
langid = buf[2] | (buf[3] << 8)
return langid
for dev in usb.core.find(find_all=True):
try:
print usb.util.get_string(dev, dev.iManufacturer) # ,langid=0x409
print " first language code 0x%x" % getlangs(dev)
except usb.core.USBError:
pass