I am maintaining an ISV solution across AX 2012 and Dynamics 365 for Finance and Operations, Enterprise Edition, and when there is development in one, porting those changes to the other can be a hassle.
If I create a label in Dynamics AX 2012, exactly creating it in D365 isn't straight forward/simple.
I quickly wrote this simple job to export a label to a format that can be easily imported into Dynamics 365. I simply looked at how D365 label text is stored and inferred this, so I haven't done extensive testing, but it seems to work fine for several hundred labels when comparing via WinMerge what my job outputs vs what D365 contains.
static void AlexOnDaxExportLabelToD365(Args _args)
{
#File
str labelFileId = 'QUA';
str language = 'en-us';
Filename labelFilenameD365 = @'C:\Temp\AlexLabel.label.txt';
LabelId labelId;
LabelString labelString;
LabelDescription labelDescription;
Set setLabelIds;
SetEnumerator se;
SysLabelFileReader labelFileReader;
TextIo textIo;
SysLabelFile labelFile = SysLabelFile::newLanguageModule(language, labelFileId);
if (!Label::flush(labelFileId, language))
throw error(strFmt("Unable to flush label %1 in language %2", labelFileId, language));
new FileIOPermission(labelFilenameD365, 'W').assert();
// This just create the file if it doesn't exist
textIo = new TextIo(labelFilenameD365, #IO_Write, #utf8Format);
textIo.write('');
textIo = null;
// We output the file somewhere
if (labelFile.toFile(labelFilenameD365, true))
{
labelFileReader = SysLabelFileReader::newFileClient(labelFilenameD365);
if (labelFileReader)
{
setLabelIds = labelFileReader.labelIds();
}
}
if (!(setLabelIds && labelFileReader))
throw error("Unable to get label");
textIo = new TextIo(labelFilenameD365, #IO_Write, #utf8Format);
se = setLabelIds.getEnumerator();
while (se.moveNext())
{
labelId = se.current();
labelString = labelFileReader.labelText(labelId);
labelDescription = labelFileReader.labelDescription(labelId);
// There must be a value
if (!labelString)
labelString = ' ';
if (labelDescription)
textIo.write(labelId + '=' + labelString + '\n' + ' ;' + labelDescription);
else
textIo.write(labelId + '=' + labelString);
}
textIo.write(''); // Write ending CR
textIo = null;
CodeAccessPermission::revertAssert();
info(strFmt("Finished converting %1 to Dynamics 365 for Operations label file", labelFilenameD365));
}