Localization files are text files which contain various informations displayed as text in MSFS and sometimes sent to vocal Azure text-to-speech. They cover a wide range of thing such as loading tips, ATC comms, menu items, etc...
The main localization files are located in the fs-base folder (.../Official/OneStore/fs-base), but many others can be found elsewhere such as in Aircraft folders or Landing Challenges folders.
Generic structure:
I've been trying those last three days to tame them, but it's not going as good as expected... From here I'll focus on Airport informations stored in these files.
In the fs-base localization files are stored 3 different airport informations:
1. An AIRPORTS directory that seems to be used in the world map. It has all 37000+ MSFS stock airports and account for the majority of the files records.
Sample record:
Only text information here, which is not meant to be spoken by the sim via text-to-speech.
It is divided in several ICAO blocks: AIRPORTS S Z being used for all airports from ICAI block S to ICAO clock Z.
2. An AGENT_NAME used to designate ATC agents and used for user/ATC vocal interactions ("ATCCOM").
Sample record: One text string meant to be displayed on screen, and one text-to-speech (tts) string meant to be processed by Azure:
These agent names are intended to match those in scenery bgl, which are defined like this in scenery project xml source files:
No match is done in this example since the "HANGZHOU" ATC Agent string doesn't strictly match any of the Com frequency name strings in the xml. When tuning on 121.95 I hear aircrafts calling "Clearance Delivery" instead of "Hangzhou Clearance Delivery".
To fix this you would add the following record to the fs-base localization packages:
3. An ATCCOM.AIRPORT string meant to convert any ICAO designator into airport and/or city names.
Sample record: One text string for display, for tts string for vocal speech by Azure
Without this one would hear "requesting IFR clearance to Z S H C" instead of "requesting IFR clearance to Hangzhou".
Now, THE PROBLEM:
Many airports miss the ATCCOM.AIRPORT record and get they ICAO spelled by ATC instead of using a proper name: only 3096 airports (out of 37000) are listed in this section. So I've been amending the stock fs-base files with an airport database I made for myself. Also, I changed many existing records with a more suitable name to my taste (like LFLL being called Lyon St Ex instead of St Exupéry). I ended up with 535 updated airport records and 2520 new airports records, now having globally almost all commercial airports covered.
Of course I generated an updated layout.json in the fs-base folder to validate my altered localization packs.
- Updated airports do work properly. For example I replaced "ATCCOM.AIRPORT ZGSZ.0.tts": "Huangtian" with "ATCCOM.AIRPORT ZGSZ.0.tts": "Shenzhen" and now MSFS is correctly naming ZGSZ as "Shenzhen" during ATC comms.
- New airports don't work. For example ZBAD Beijing Daxing is still spelled as "Z B A D". Even airports already existing in stock MSFS with a correct ICAO and present in the first AIRPORTS directory (part 1) are not called properly: Guiyang ZUGY and Miangyang ZUMY are still spelled "Z U G Y" and "Z U M Y".
- Another potential issue is that amending stock files should be avoided at any cost: they would be overwrited at each sim update/patch, and they could conflict with other 3rd party work.
I troubleshooted a lot, including amending all 10 localization files with the same exact same content, but still the new records seem ignored.
- Could Azure tts ignore those new entries and only process existing, pre-defined ones by Asobo ?
- Is there a master file / master list somewhere in MSFS install that would unlock those new records ?
I'm totally clueless abou this issue...
But I went on: since some other packages have their own localization files, and since it's not recommended to alter stock files, I decided to add my own localization files to an airport project I'm working on.
So I added my missing ATCCOM.AGENTs for Hangzhou, in a separate set of files that I put in my airport package folder:
en-US.locPak:
I even got further with chinese and russian localizations, since I had them set:
But this doesn't work: updating json files and reloading the sim won't help, with still no mention of "Hangzhou" in ATC comms with Tower, Ground nor Delivery.
It's really disapointing since I believe that the virtual file system should favor this idea of adding separately small pieces of amends/additions instead of messing with one big stock file. Then every 3-rd party developer could add customized localizations for their products in an easy and clean way.
It's really frustrating, I must have missed something... Do any of you have any idea about this ? Is it somehow locked at Azure level (which would be strange since it seems to proceed any user or AI callsign with no difficulty) ?
The main localization files are located in the fs-base folder (.../Official/OneStore/fs-base), but many others can be found elsewhere such as in Aircraft folders or Landing Challenges folders.
Generic structure:
Code:
{
"LocalisationPackage": {
"Language": "en-US",
"Strings": {
INSERT DATA HERE
}
}
}
I've been trying those last three days to tame them, but it's not going as good as expected... From here I'll focus on Airport informations stored in these files.
In the fs-base localization files are stored 3 different airport informations:
1. An AIRPORTS directory that seems to be used in the world map. It has all 37000+ MSFS stock airports and account for the majority of the files records.
Sample record:
Code:
"AIRPORTSZ.ZBAA.city": "Beijing",
"AIRPORTSZ.ZBAA.name": "Beijing Capital",
"AIRPORTSZ.ZBAA.state": "NO STATE",
It is divided in several ICAO blocks: AIRPORTS S Z being used for all airports from ICAI block S to ICAO clock Z.
2. An AGENT_NAME used to designate ATC agents and used for user/ATC vocal interactions ("ATCCOM").
Sample record: One text string meant to be displayed on screen, and one text-to-speech (tts) string meant to be processed by Azure:
Code:
"ATCCOM.AGENT_NAME HANGZHOU.0.text": "Hangzhou",
"ATCCOM.AGENT_NAME HANGZHOU.0.tts": "Hangzhou",
These agent names are intended to match those in scenery bgl, which are defined like this in scenery project xml source files:
XML:
<Com frequency="123.65" type="TOWER" name="HANGZHOU TOWER"/>
<Com frequency="118.30" type="TOWER" name="HANGZHOU TOWER"/>
<Com frequency="127.25" type="ATIS" name="HANGZHOU ATIS"/>
<Com frequency="125.55" type="APPROACH" name="HANGZHOU APPROACH"/>
<Com frequency="126.05" type="APPROACH" name="HANGZHOU APPROACH"/>
<Com frequency="121.65" type="GROUND" name="HANGZHOU GROUND"/>
<Com frequency="121.725" type="GROUND" name="HANGZHOU GROUND"/>
<Com frequency="121.95" type="CLEARANCE" name="HANGZHOU DELIVERY"/>
No match is done in this example since the "HANGZHOU" ATC Agent string doesn't strictly match any of the Com frequency name strings in the xml. When tuning on 121.95 I hear aircrafts calling "Clearance Delivery" instead of "Hangzhou Clearance Delivery".
To fix this you would add the following record to the fs-base localization packages:
Code:
"ATCCOM.AGENT_NAME HANGZHOU DELIVERY.0.text": "Hangzhou",
"ATCCOM.AGENT_NAME HANGZHOU DELIVERY.0.tts": "Hangzhou",
3. An ATCCOM.AIRPORT string meant to convert any ICAO designator into airport and/or city names.
Sample record: One text string for display, for tts string for vocal speech by Azure
Code:
"ATCCOM.AIRPORT ZSHC.0.text": "Hangzhou",
"ATCCOM.AIRPORT ZSHC.0.tts": "Hangzhou",
Now, THE PROBLEM:
Many airports miss the ATCCOM.AIRPORT record and get they ICAO spelled by ATC instead of using a proper name: only 3096 airports (out of 37000) are listed in this section. So I've been amending the stock fs-base files with an airport database I made for myself. Also, I changed many existing records with a more suitable name to my taste (like LFLL being called Lyon St Ex instead of St Exupéry). I ended up with 535 updated airport records and 2520 new airports records, now having globally almost all commercial airports covered.
Of course I generated an updated layout.json in the fs-base folder to validate my altered localization packs.
- Updated airports do work properly. For example I replaced "ATCCOM.AIRPORT ZGSZ.0.tts": "Huangtian" with "ATCCOM.AIRPORT ZGSZ.0.tts": "Shenzhen" and now MSFS is correctly naming ZGSZ as "Shenzhen" during ATC comms.
- New airports don't work. For example ZBAD Beijing Daxing is still spelled as "Z B A D". Even airports already existing in stock MSFS with a correct ICAO and present in the first AIRPORTS directory (part 1) are not called properly: Guiyang ZUGY and Miangyang ZUMY are still spelled "Z U G Y" and "Z U M Y".
- Another potential issue is that amending stock files should be avoided at any cost: they would be overwrited at each sim update/patch, and they could conflict with other 3rd party work.
I troubleshooted a lot, including amending all 10 localization files with the same exact same content, but still the new records seem ignored.
- Could Azure tts ignore those new entries and only process existing, pre-defined ones by Asobo ?
- Is there a master file / master list somewhere in MSFS install that would unlock those new records ?
I'm totally clueless abou this issue...
But I went on: since some other packages have their own localization files, and since it's not recommended to alter stock files, I decided to add my own localization files to an airport project I'm working on.
So I added my missing ATCCOM.AGENTs for Hangzhou, in a separate set of files that I put in my airport package folder:
en-US.locPak:
Code:
{
"LocalisationPackage": {
"Language": "en-US",
"Strings": {
"AIRPORTSZ.ZSHC.city": "Hangzhou",
"AIRPORTSZ.ZSHC.name": "Xiaoshan",
"AIRPORTSZ.ZSHC.state": "NO STATE",
"ATCCOM.AGENT_NAME HANGZHOU TOWER.0.text": "Hangzhou",
"ATCCOM.AGENT_NAME HANGZHOU TOWER.0.tts": "Hangzhou",
"ATCCOM.AGENT_NAME HANGZHOU APPROACH.0.text": "Hangzhou",
"ATCCOM.AGENT_NAME HANGZHOU APPROACH.0.tts": "Hangzhou",
"ATCCOM.AGENT_NAME HANGZHOU GROUND.0.text": "Hangzhou",
"ATCCOM.AGENT_NAME HANGZHOU GROUND.0.tts": "Hangzhou",
"ATCCOM.AGENT_NAME HANGZHOU DELIVERY.0.text": "Hangzhou",
"ATCCOM.AGENT_NAME HANGZHOU DELIVERY.0.tts": "Hangzhou",
}
}
}
I even got further with chinese and russian localizations, since I had them set:
Code:
"ATCCOM.AGENT_NAME HANGZHOU TOWER.0.text": "Ханчжоу",
"ATCCOM.AGENT_NAME HANGZHOU TOWER.0.tts": "Hangzhou",
Code:
"ATCCOM.AGENT_NAME HANGZHOU TOWER.0.text": "杭州",
"ATCCOM.AGENT_NAME HANGZHOU TOWER.0.tts": "Hangzhou",
But this doesn't work: updating json files and reloading the sim won't help, with still no mention of "Hangzhou" in ATC comms with Tower, Ground nor Delivery.
It's really disapointing since I believe that the virtual file system should favor this idea of adding separately small pieces of amends/additions instead of messing with one big stock file. Then every 3-rd party developer could add customized localizations for their products in an easy and clean way.
It's really frustrating, I must have missed something... Do any of you have any idea about this ? Is it somehow locked at Azure level (which would be strange since it seems to proceed any user or AI callsign with no difficulty) ?
Last edited: