You should be able to return the owner of the text &/or the id belonging to the active text using either the textStarted event listener of the registerEventHandler() function or the textPosition handler for the registerHookFunction().
function txtStart(text)
print( text.TextOwner, text:getId().id )
end
registerEventHandler("textStarted", "txtStart")
Written that off the top of my head without checking the syntax, but it should print a message to the log each time a text is started that contains the owner of the text & the id belonging to the text. Anyway... take that as a basis then create some tables, like so...
txt = {} -- declare global table called txt
txt["English"] = {} -- add sub-table English to txt table
txt["English"][117] = {1={d=1000, f=1}, 2={d=350, f=4},...} -- create id sub-table & add some data (d = delay in ms, f = animation frame to display)
txt["English"][126] = {...} -- etc
... these tables are very rough, but should give you an idea. Technically you can add as many sub-tables as you like, but the general idea for looping purposes here is that the sub-tables after the id one should increment starting from 1, the reason being that we will want to access the data by iterating through it using the
for loop operator or a loop created in the editor itself via the use of the jump to x action part. I recommend using the latter as you can control the delay with pause action parts. I believe that it should technically be possible to use a single display text action part & update the text by updating the string content of a value & by changing the path to the audio file belonging to the display texts current language - not 100% sure as I've not tested but in theory it should be possible - well, it's something to look into at some point (for me, I guess).