Supporting multiple languages for corporations is a reality. It may be an organization operating in multilingual countries, such as Canada, Belgium, Italy, or others, or having a workforce that that is distributed across the globe. One common challenge in building solutions to support multilingualism is the creation and maintenance of such solutions as they evolve and more languages are added. In this article, I’ll be discussing an architecture to create enterprise-wide multilingual PowerApps.
The challenges that are often encountered with multilingual solutions stem from the fact that business needs evolve over time. This could mean that an existing application needs to be altered to include additional content. Another common need that arises is that a new language may have to be added to an application.
Back in 2017, Anh-Thu Chang wrote a blog on Building multilingual apps in PowerApps. Some of the things discussed in this article relate to her blog post and build on the general concept.
Overview
- Language Determination
- Central Label Repository
- Central List Repository
- Performance
Language Determination
Language settings are made up of two components. The first two letters, representing the language, a hyphen, and then two more letters representing the locale. For example, English for Canada is represented as en-ca, while English for US is en-us. In my case, I only care about the language and not the locale.
If you choose to capture both, you can definitely do so. However, keep in mind that users within the same region may not pay attention to the locale and only pick the language. If that is the case, then they may not experience the PowerApp in the language that they expect to.
When the app is launched, the following expression is added to the OnStart() property for the app:
Central Label Repository
There are four pieces of information that are needed for each label:
- Title – a group for the label. For this, I typically use the App name
- Field Name – the name of the control that this label applies to.
- Label – what is the string that should actually appear
- Lang – the two-letter language code
Reuse of Labels
There are often labels that are commonly used across numerous forms, such as OK, Cancel, Yes, No, etc. Rather than defining them for each form, you can create a general group and put them in there. This will ensure consistency between the labels used across the various forms and reduce the overall SharePoint list size.
Loading the labels
Loading of the strings from SharePoint into the app can be done by either loading the entire SharePoint list and then filtering the values during run-time or using a Flow to filter out the specific labels required and returning those to the PowerApp. When the list of items gets long, as in the case of defining labels for an entire organization, loading and filtering the entire list within the app may have an implication on performance. This is why I elected to go with the latter method. In the expression shown above, I have a Flow called Get String Labels to which I pass the name of the label group (e.g. Update My Profile) and the language. The Flow then filters the list on these two columns and returns all relevant items
Setting Control Labels
Once the labels have been loaded into a collection, you can now use them to set the text of your controls. For example, if I have a label called lblCity, then I set the Text property as follows:
Coalesce(LookUp(StringLabels,FieldName = “lblCity”,Label), “lblCity”)
The Lookup expression searches for an item, where the FieldName is lblCity and returns the Label value. Coalesce is used to provide a default value in case the label has not been defined for the specific language. In my case, I make the default Coalesce value the same name of the label as it makes it easier to visually know what labels are missing in my SharePoint list.
Central List Repository
- Title – a group for the list item
- Field Name – the name of the control that this list applies to
- Label – what is the string that should actually appear for the list entry
- Field Order – in what order should the labels appear in the app
- Lang – the two-letter language code
Loading the list items
Setting List Items
Once the list items have been loaded loaded into a collection, all you need to do is make that collection the source of your list control. For my drpCurtain field, the :
Distinct(drpCurtain,Label)
The Distinct ensure that there are no duplicate fields in my list. Label indicates that from within the collection, the Label field values should be displayed in the list.
Performance
One way to implement such a check is to keep a timestamp of the last update for the list and before loading the labels check if there were any additions or changes before that date.



