After struggling a bit with this, and watching several tutorials on how the .lang file should be formatted I have decided it is time for some fresh eyes on this problem.
For reference, my .lang file contains exactly the following:
<Entry Name="Description">Just a brief description!</Entry>
<Entry Name="ItemName_key1">Master Key</Entry>
<Entry Name="ItemDesc_key1">A key that will open all the doors in the mansion</Entry>
For now, the story description is just there for me to make sure the .lang file loads correctly, and it seems to do so as the text "Just a brief description!" does indeed appear on the custom story screen when selecting my story, as opposed to the "No description" that would appear could the .lang not load at all.
This leads me to believe that there is a problem with the identifier of the key (as the script that should allow it to open doors does not work either), however I have checked several times (and copy-pasted, to make sure there are no lowercase/uppercase shenangians) and the names do match.
In case it is relevant, here are the parts of the map code that the key is contained within that associates with the opening of doors:
void OnStart ()
AddUseItemCallback("", "key1", "lockeddoor1", "func_unlockdoor", false);
AddUseItemCallback("", "key1", "lockeddoor2", "func_unlockdoor", false);
void func_unlockdoor (string &in item, string &in door)
SetSwingDoorLocked(door, false, true);
PlaySoundAtEntity("", "unlock_door", door, 0, false);
Note that both the CustomSubItemTypeName identifier and the Name identifier are set to "key1", and the doors are called "lockeddoor1" and "lockeddoor2".
Side-note: I have also had occasions where the .lang file would not load. But copying it's contents, creating a new .lang file, and pasting the contents inside would make it load.