{"id":221,"date":"2022-01-07T11:42:25","date_gmt":"2022-01-07T11:42:25","guid":{"rendered":"https:\/\/blog.citrus-lime.com\/crmc\/?p=221"},"modified":"2022-01-07T11:42:25","modified_gmt":"2022-01-07T11:42:25","slug":"creating-a-multi-lingual-powerapps-portal","status":"publish","type":"post","link":"https:\/\/blog.citrus-lime.com\/crmc\/creating-a-multi-lingual-powerapps-portal\/","title":{"rendered":"Creating a Multi-Lingual PowerApps Portal"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/license.citruslime.com\/cs\/blogs\/crmcs\/Untitled-design-11_1E7C9028.png\" alt=\"Untitled design (11)\" \/><\/figure><\/div>\n\n\n\n<p>PowerApps Portals provide you with the tools to allow external users to view and interact with your CDS data in their local language. Using Microsoft&#8217;s vast array of language packs and a bit of extra customisation detailed in this article, you can open up possibilities for connecting with more people, from more places.<br><\/p>\n\n\n\n<p><strong>1. Enable your language in Dynamics<\/strong><\/p>\n\n\n\n<p>First, we need to enable our new language in our Dynamics\/PowerApps environment. Microsoft supports a host of standard language packs, and will provide translations for all OOTB entities and fields for these languages.<\/p>\n\n\n\n<p>To enable a new language, go to the advanced settings are of Dynamics, select Settings \u00e0 Administration then select the Languages section. Scroll to your desired language, tick the box, and click apply. This is all you need to do here, but note that it can take 5-10 mins to fully apply all the required settings.<br><br><img loading=\"lazy\" decoding=\"async\" alt=\"image\" src=\"https:\/\/license.citruslime.com\/cs\/blogs\/crmcs\/image_0D717A7B.png\" width=\"485\" height=\"238\"><br><\/p>\n\n\n\n<p><strong>2. Export translations from your solution<\/strong><\/p>\n\n\n\n<p>First select the solution you\u2019ve been working in, then click export translations on the navigation bar. This will download a ZIP file with two XMLs inside, the one we want to use is titled \u2018CrmTranslations\u2019. Extract the ZIP file and open the \u2018CrmTranslations\u2019 XML in Excel. This has a tab called \u2018Localized Labels\u2019 \u2013 here you get a list of all entity names, field names, labels, and descriptions that are included within the solution. We get this with the first language column showing our environments default language, and then a new column for each new language we have enabled.<\/p>\n\n\n\n<p>You will notice here that any OOTB field rows already have the newly enabled language columns populated. Now you can use your preferred method to translate the custom rows. I used Google Translate\u2019s document translation functionality. The benefit of this is that it\u2019s free and quick to do, the negative being that it\u2019s not the most advanced translation software, so if you\u2019re going down this route it\u2019s best to schedule in some time for someone to go in and sense check the translations before publishing for all users.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/license.citruslime.com\/cs\/blogs\/crmcs\/image_29160671.png\" alt=\"image\" title=\"image\" \/><\/figure>\n\n\n\n<p>N.B. For the purpose of the project I am working on, we only need to enable new languages for external portal users, not for internal CRM users. Therefore, we only need to think about translating entity information that is included in the client facing portal. I therefore ensured that the solution I exported translations for only included the entity forms and views that we use in the portal, so as not to be doing lots of unnecessary work.<br><\/p>\n\n\n\n<p><strong>3. Upload translations into your environment<\/strong><\/p>\n\n\n\n<p>When you\u2019ve made all the required translations in your CrmTranslations file, you need to save this back into an XML file with the same name, and zip it back up with the other file extracted (at the time of writing, the only two files you get from the export are the CrmTranslations and another XML called [Content_Types].<\/p>\n\n\n\n<p>Then, you can go back to the solutions area of the advanced settings, and click \u2018upload translations\u2019 on the navigation bar. Then select the edited ZIP folder, and wait for thew new translations to import, this again can take a few minutes to process.<br><br><img loading=\"lazy\" decoding=\"async\" alt=\"image\" src=\"https:\/\/license.citruslime.com\/cs\/blogs\/crmcs\/image_68DFECF6.png\" width=\"487\" height=\"74\"><br><\/p>\n\n\n\n<p><strong>4. Edit portal specific text<\/strong><\/p>\n\n\n\n<p>While some areas of the portal are driven off CRM data, fields, and labels, there are some that totally driven through the portal. These will not be affected by the upload of the translations file in CRM. I will show you the<\/p>\n\n\n\n<p><strong><em>a. Content Pages<\/em><\/strong><\/p>\n\n\n\n<p>Any web page that you create on your portal will automatically create a subsidiary \u2018localized content\u2019 page that houses the actual page content. This can be viewed in a subgrid on the web page form. When you enable a new language, a new localized content page will be automatically created in that language. However this won\u2019t be automatically translated, so you must go to each web page that your portal uses, and go into the newly created localized content page, and translate any text in the Copy (HTML) field, the Summary (HTML) field, and don\u2019t forget the Content: Title field.<br><br><img loading=\"lazy\" decoding=\"async\" alt=\"image\" src=\"https:\/\/license.citruslime.com\/cs\/blogs\/crmcs\/image_249F85AA.png\" width=\"475\" height=\"182\"><br><br><\/p>\n\n\n\n<p><strong><em>b. Web Link Sets<\/em><\/strong><\/p>\n\n\n\n<p>When you create a new web link set, there will be a version created for each language enabled. Likewise, when you enable a new language, a new version of existing web link sets will be created. When you view your web link sets, you will see this with the language column specified. You need to go into each web link set for your new language and edit the title for each web link within this web link set to be in that language.<br><br><img loading=\"lazy\" decoding=\"async\" alt=\"image\" src=\"https:\/\/license.citruslime.com\/cs\/blogs\/crmcs\/image_1D804932.png\" width=\"471\" height=\"212\"><br><br><br><\/p>\n\n\n\n<p><strong>5. How to test, and use your new language capabilities in the portal<\/strong><\/p>\n\n\n\n<p>Now that you\u2019ve enabled and edited all the relevant areas, your users will see the option to switch between languages when they log into the portal, this will appear as a dropdown to the left of the profile navigation button.<\/p>\n\n\n\n<p>The best way I found to test this is to switch languages and click through every possible page in your portal, scanning all the text ensuring there hasn\u2019t been anything missed.<br><br><img loading=\"lazy\" decoding=\"async\" alt=\"image\" src=\"https:\/\/license.citruslime.com\/cs\/blogs\/crmcs\/image_444E5F72.png\" width=\"459\" height=\"181\"><br><\/p>\n\n\n\n<p>One thing to make sure when testing every page, is that you\u2019ve considered all pages shown to different web roles\/to anonymous web roles.<\/p>\n\n\n\n<p>Another easy one to forget to look at is the footer \u2013 make sure you\u2019ve edited the footer web page localized content!<br><\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<p><strong><br>FURTHER READING &#8211;&nbsp;<a href=\"https:\/\/www.crmcs.co.uk\/content\/power-apps-portals.aspx:93:4:93:4:66:7:93:4:66:7:66:7:93:4:93:4:93:4:93:4:66:7:93:4:93:4\">Designing and Developing Microsoft Power Apps Portals<\/a>&nbsp; \/&nbsp;&nbsp;<a href=\"https:\/\/www.crmcs.co.uk\/what-we-do\/powerapps-portals\/\">VISIT: Open Up New Possibilities with Power Apps Portals<\/a><\/strong><\/p>\n\n\n\n<p><strong>If you have any questions for&nbsp;<a href=\"https:\/\/www.crmcs.co.uk\/\">CRMCS<\/a>&nbsp;you can contact us on 0161 348 7360 or&nbsp;<a>contact@crmcs.co.uk<\/a>&nbsp;<\/strong><strong><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PowerApps Portals provide you with the tools to allow external users to view and interact with your CDS data in their local language. Using Microsoft&#8217;s vast array of language packs and a bit of extra customisation detailed in this article, you can open up possibilities for connecting with more people, from more places. 1. Enable<\/p>\n","protected":false},"author":43,"featured_media":43,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_tribe_ticket_capacity":"0","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":""},"categories":[3],"tags":[],"class_list":{"0":"post-221","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-crm"},"featured_image_src":"https:\/\/blog.citrus-lime.com\/crmc\/wp-content\/uploads\/sites\/30\/2021\/11\/Untitled-design-41.png","author_info":{"display_name":"jadesmith","author_link":"https:\/\/blog.citrus-lime.com\/crmc\/author\/jadesmith\/"},"_links":{"self":[{"href":"https:\/\/blog.citrus-lime.com\/crmc\/wp-json\/wp\/v2\/posts\/221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.citrus-lime.com\/crmc\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.citrus-lime.com\/crmc\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.citrus-lime.com\/crmc\/wp-json\/wp\/v2\/users\/43"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.citrus-lime.com\/crmc\/wp-json\/wp\/v2\/comments?post=221"}],"version-history":[{"count":1,"href":"https:\/\/blog.citrus-lime.com\/crmc\/wp-json\/wp\/v2\/posts\/221\/revisions"}],"predecessor-version":[{"id":222,"href":"https:\/\/blog.citrus-lime.com\/crmc\/wp-json\/wp\/v2\/posts\/221\/revisions\/222"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.citrus-lime.com\/crmc\/wp-json\/wp\/v2\/media\/43"}],"wp:attachment":[{"href":"https:\/\/blog.citrus-lime.com\/crmc\/wp-json\/wp\/v2\/media?parent=221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.citrus-lime.com\/crmc\/wp-json\/wp\/v2\/categories?post=221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.citrus-lime.com\/crmc\/wp-json\/wp\/v2\/tags?post=221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}