How to create a new language in Dynamics 365 for Operations
Some weeks ago I wrote a post about the supported countries/regions and languages in Microsoft Dynamics 365 for Operations. This post is having technical information how to create a new language. While reading this post, you will also get more background information about do’s and don’ts and you will learn more about my country like my previous post. Also, if you are not a developer, it would be an interesting read. Then just ignore the technical details you don’t understand.
Create a new language in Microsoft Dynamics 365 for Operations
In previous versions of Microsoft Dynamics AX, creating a new language was a bit cumbersome. The languages needed to be activated using an ISV license object, a kernel translation file, and new label files for the new language. As Microsoft Dynamics 365 for Operations now comes with a license per named user instead of purchasing modules, the license requirement has been removed. In addition, the license was controlled using a pre-defined list of codes and not all languages were included. Also, we got rid of the Dynamics client and development workspace, as the application now runs in an internet browser and development is fully moved to Visual Studio.
There is good news for partners in countries where there is no out-of-the-box localization available. All Windows languages are now supported to be used as label files in Dynamics 365 for Operations. Also, it is applicable in the Netherlands. You might think Belgium is one of the few countries which do have the Dutch language as one of the dual languages in the country. Also, the Netherlands has an official second language. Next to the Dutch language, we have a region in the north of our country speaking Frisian. This language will be used in my example below. Before doing any changes in Visual Studio, you can try to change the default language to e.g. Frisian (fy). You might notice that this language is not within the list of languages you can choose from.
There are two ways of creating a new language in Microsoft Dynamics AX. There is an option for customizing and also, as of (platform) Update 3 of Dynamics 365 for Operations, the support for extending labels.
Customizing labels (overlayering)
NOTE: Overlayering of standard application objects is not possible anymore in the current versions of Microsoft Dynamics 365 for Finance and Operations. You can use the label extensions which is described below.
If you want to customize labels, you are overlayering Microsoft Dynamics 365 for Operations which is not recommended for models created by Microsoft or other ISV partners. You could use it for your own solutions. I will start with creating the Frisian language for the Fleet Management module. Within Visual Studio, you can start with an empty solution. From label file(s) you can right-click to activate a context menu and choose the option Add to new project.
Then you will need to provide information about the project name and if it will be part of the current or a new solution.
The FLM_en-us label object is then added to the Solution Explorer. Now you can add a new language using the context menu.
In the Label file Wizard, you can search for your language. To continue my story, I will use the Frisian language.
You can eventually select more languages. When you have selected the required languages, click Next.
Then you have some options to have blank label values, a fixed label or use the labels of the existing language which was taken as base. In this example, I had chosen for the blank label values. Why I did choose this option? This will be explained below.
Review the summary and click Finish to complete the creation of a new file.
When opening the new Frisian label file, you will now notice that all Labels are created with blank values. You can start translating now…
Now the reason why I did choose the blank values… On Lifecycle services, there is a new tool released for Localization and translation. With this tool, you can create a translation project. Upload a source label file in zip format and let the service translate the labels for you.
However, the translation from English to Frisian did not work out. I got a new label file with the copied English labels. If you had read the Wikipedia link about the Frisian language, you would know that English and Frisian are very closely related. So I would have expected that this should work. But I guess Microsoft is not aware of Dutch history…
To overcome this issue, I used a workaround. I used the tool to translate from English to Dutch. Then I used a local site for translating the labels from Dutch to Frisian. Of course, I’m not that familiar with the Frisian language and I was not in the mood to check the quality of this translation. For me, this was just a story to be able to understand the translation process. Your translations are more important and you should verify the translated labels. Don’t underestimate the time and cost involved if you would like to translate all labels of Microsoft Dynamics 365 for Operations.
I did replace the translated label (text) file in the appropriate AxLabel folder of the model and restarted Visual Studio to be able to view the Frisian labels.
The next step is building the solution and starting a database synchronization. After that, you can start Dynamics 365 for Operations. If you go to the (user) Options form, you can now see that the language Frisian is selectable.
After you made the changes, you have to restart Dynamics 365 and have a look at the results. I don’t dare to say this is correct Frisian, but at least the example worked and my story is complete on the customization/overlayering part. Note that some labels were part of another label file that was not translated.
Label extensions
When trying to create new languages, I was wondering how we could also translate complete label files now belonging to the platform models. These models are locked for customizations and you can only extend this part of the solution. Using extensions is a much better approach for creating general solutions or customizations on top of Dynamics 365 for Operations. It will ensure the standard coding can be upgraded without the need for merging coding. If you are not familiar with the differences between overlayering and extensions, it would be recommended to read the help page “Customization: Overlayering and extensions“.
Initially, I got stuck on this part, however, there should be a way to extend label files as of platform Update 3. If you look at the context menu above, you noticed the options to create extensions were not active. Luckily I got help on a Microsoft feedback forum from Bostjan Golob. He is a solution architect and is involved in the development of their localization for Slovenia. Although he was also waiting for this Update 3, there was no updated documentation on how to use label extensions. After some time fiddling he found the solution to do it. @Bostjan: Thanks again! You deserve these credits. While writing this blog, the documentation (link provided above) had been updated.
So how to create label extensions? Follow the next steps to find out how. First of all you can create a new model based on the option Create new package which actually creates an extension model. In a new (or existing extension based project) you can then add a new item of type Label file. The name of the label file should be: [LABELFILE] + “_extension“.
When you click Add, you will have to complete a wizard for the label file. The label file ID was pre-filled based on the name of the new label object.
On the next page, you can select languages to be part of the extension. Note that in this case, the language en-us was already the base language.
At the last step, you can review the summary and click the button Finish to create the new objects in Visual Studio.
In the Solution Explorer, you can now find the new label files and they will start blank initially.
You can add the labels only for your new language. As it is an extension, you don’t have to repeat all labels in the original language. I did edit the label file with Notepad outside of Visual Studio to create the bulk based on the translation result. Copy and pasting hundreds of labels is much quicker compared to manually entering the data in the Visual Studio label editor.
After filling the labels you can build the Solution; Synchronize the database and start Dynamics 365 for Operations. The result is the same as shown above. I do prefer this way of extensions if you would translate existing label files.
There is more…
With the extension labels, you can also replace existing label translations without affecting the standard sources. If you would like to rename the term ‘Customers’ to e.g. ‘Renters’ you can actually achieve it with an extension label as well. To do so, you can add only the label ID’s that needs to have another description in the label extension.
So, now you have learned how to create a new language and extend label files. In my next blog, I will explain the option to create new countries in your Microsoft Dynamics 365 for Operations environment.
I do hope you liked this post and will add value for you in your daily work as a professional. If you have related questions or feedback, don’t hesitate to use the Comment feature below.
That’s all for now. Till next time!
Hi Andre, is this way applicable when using AX2012?
Hi Antineus,
This is not applicable when using AX2012 for the reasons mentioned in the blog. The number of possible new languages are limited in AX 2012 because of a predefined coding system done in the early years of Damgaard. You need to add an ISV license code in AX2012 and you need to translate a kernel translation label file.
Hi Andre,
How can ı edit other language label files. For example Turkish (tr). I cant find the other language Label files. There is only en-us exists.
Hi Fatih,
First of all thanks for reading the blog. If you have an environment without the Turkish localization, the language ‘tr’ is not available. If a language is not available, follow the steps in the blog to create a new language.
Hi Andre,
Thanks for your sharing, and i have met a problem with this, i have create a new extension label file, and add the Korean label, after build and Synchronize, restart the ax, the korean label is not display in AX. Did you met this problem, or give me some suggestion. Thank you!
Marco
Hi Marco,
Did you actually try to change the user language in the User options? Is the language available in language list on this form? If not, the build might have failed. Did you check if the build was completed without errors?
Hi Ander,
Thanks for your help, it is ok for new label, but i have tried to translate the SYS_en-us label to korean, i add a new model, and add a extension label file named SYS_extension_ko-kR, then translate the label to korean, build model and Synchronize database, when i open the ax, there have some problem, only a little of label changed to korean, some of label is disappear, do you met this problem before?
Hi Marco,
I contacted Microsoft and they have stated that it is currently not possible. They are still using the KTD files like they did in previous versions. Possibly Microsoft will consider finding a solution. But no guarantees if and when…. You can read about upcoming developments on the roadmap pages: https://roadmap.dynamics.com
You could try to create a language specific KTD file and place it on development environments manually. Bu not on STAGING and PRODUCTION environments.
Hi Andre,
Thank you for your post.
I was able to load Hebrew language files. But it seems the built in form buttons are not translated (New, Delete, Edit). Can you maybe explain how to translate them?
Thanks,
Shimrit.
Hi Shimrit,
The buttons you are referring to, might be using some default labels from your operating system. Is your OS setup to use the English language? If not, you can create a question on the Dynamics community and provide some more details or screenshots to clarify which exact buttons you are referring to.
Hi Andre,
I am facing one issue. I have created unique label for one of my error message and gave label and description but when I am trying to assign same in any code it is showing @ABC12345 only on front end instead of whole description. Can you suggest me which part i may have missed?
Regards,
Smit Patel
Twitter : @smitjpatel31
Hi Smit,
Try to find out if the reference is set correctly. Are you using the legacy patterns like @ABC12345 or do you have labels like @ABC:MyErrorMessage? Did the solution build correctly? Was the synchronization completed without errors? Did you perform an IISReset? Are you using the correct language?
thank you for sharing this post..
Hello André,
Many thanks for sharing your insight on this topic and in general.
On a slightly different note, although closely related to labels and languages, have you ever come across the situation where a customer wants all reports printed in two languages? For instance in Canada where dual-language customers require reports in both English and French, or in some parts of the USA where dual-language customers want all reports in English and Spanish? If so, what was your approach here? My own suggestion would be a secondary language on the customer, but very interested in hearing your thoughts on the matter.
Kind regards,
GSK
There are indeed several countries where documents needs to be in a dual language. I have seen it at an international implementation for several countries. This was on an AX2012 environment. The data provider class for e.g. the invoices were customized to be able to hold information in two languages. I have no details as I’m not active at this customer anymore. The labels on the document like “Invoice”, “Due date”, etc were in two languages as well as the invoice description of goods/services. As far as I can remember there was an English language as well as the local language used.
Hello André,
Many thanks for taking the time to reply, that is greatly appreciated.
The scenario I am looking at in this particular situation will investigate the effort, and feasibility, in defining a secondary language on the Customer master and perform a reprint of the document to the selected destination in this language, be that as a PDF attachment to an e-mail or as a hard copy.
If you don’t mind, I will send you an update with the outcome to let you know how it went. Thanks again for your feedback!
Kind regards,
GSK
Hi André, thanks for the article, still the best resource I could find on the topic.
I was able to add a new language following this guide and it became available in the language selection in the user options.
However, it did not become available in other language selections, for example the language setting in the customer master data. I was able to find out that this is controlled by the invisible field LabelFile in the LanguageTable table. While that table lists all languages, only the languages where label files exist in the standard application have LabelFile set to 1.
Did you ever come across this and know how to enable the LabelFile field for a language? Obviously I can enable it directly in the database or with a custom x++ code. But when I do that an run a report for a customer set to the previously not available language, the report runs into a internal server error.
Hi Florian,
Thanks for reading the blog and your question. It has been a long time ago that I wrote the blog. Do you have label file extensions for the standard labels or only added a new language for a customer label file? Do you see this in a development environment or also other environments? In case you have this in a development environment, try a full database synchronization.
I don’t have an environment with an added language. I would need to add one to see the behavior in my environment.