I extracted Language.bin
using Evolution Engine Cache Extractor
. Game internally uses strings like '/Lotus/Language/Factions/ArbitersDesc' and displays proper names only when user needs them. '/Lotus/Language/Factions/' is group, 'ArbitersDesc' is identifier (see below).
Language.bin content (I'll use Long as 4 byte int; little endian; strings are not null-terminated):
16 bytes - hash?
12 bytes - unknown
Long - number of languages
Long - length of lang string
<variable length> - lang string
LANG END (those lang strings are totally unnecessary, because other language strings are in different files)
Long - number of groups
Long - length of group name string
<variable length> - group name string
4 bytes - unknown
Long - number of strings in group
Long - length of encrypted data
<variable length> - *encrypted data*
Long - length of identifier string
<variable length> - identifier string
11 bytes - unknown
According to WFPackageParser
code the only thing that changed in file structure is that strings are now encrypted. What is unknown was unknown and not needed. Strings were previously separated by 0x00 (not sure if last string ended with 0x00 too). With this information I tried to find a group with all strings known to me. See attachments.