添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

MAUI - Error on iOS when targeting .NET 8 (in CoreArcGISRuntimeEnvironment.SetInstallDirectory)

Subscribe Jump to solution
10-23-2023 09:01 PM
Labels (2)

Hello!

Is .NET 8 (net8.0-ios) supported as a target framework for the .NET Maps SDK for MAUI?

I'm using Microsoft Visual Studio Professional 2022 (64-bit) - Preview Version 17.8.0 Preview 3 on Windows OS and deploying/debugging to an iPhone using HotReload.

If I create a new project using the ArcGIS Maps SDK .NET MAUI App (Esri) template, the app builds and runs fine when deployed to iOS and Windows (targeting .NET 7).  However, when I edit the project settings and change the target framework to .NET 8, it stops working on iOS (it still runs on Windows though).  It crashes right away during the builder call to .UseArcGISRuntime()

Any ideas?  Thanks in advance!

-David

Here's the exception call stack:

[0:] An error occurred: '__Internal'. Callstack: ' at RuntimeCoreNet.GeneratedWrappers.CoreArcGISRuntimeEnvironment.SetInstallDirectory(String installPath)
at Esri.ArcGISRuntime.ArcGISRuntimeEnvironment.InitNative()
at Esri.ArcGISRuntime.ArcGISRuntimeEnvironment.InitializeRuntimeCore()
at Esri.ArcGISRuntime.ArcGISRuntimeEnvironment.Initialize(Action`1 configure)
at Esri.ArcGISRuntime.Maui.AppHostBuilderExtensions.UseArcGISRuntime(MauiAppBuilder builder, Action`1 configure)
at MauiArcGISApp1.MauiProgram.CreateMauiApp() in C:\Users\dschuster\source\GitHub\MauiArcGISApp1\MauiArcGISApp1\MauiProgram.cs:line 29
at MauiArcGISApp1.AppDelegate.CreateMauiApp() in C:\Users\dschuster\source\GitHub\MauiArcGISApp1\MauiArcGISApp1\Platforms\iOS\AppDelegate.cs:line 8
at Microsoft.Maui.MauiUIApplicationDelegate.WillFinishLaunching(UIApplication application, NSDictionary launchOptions)
at UIKit.UIApplication.UIApplicationMain(Int32 argc, String[] argv, IntPtr principalClassName, IntPtr delegateClassName) in /Users/builder/azdo/_work/1/s/xamarin-macios/src/UIKit/UIApplication.cs:line 58
at UIKit.UIApplication.Main(String[] args, Type principalClass, Type delegateClass) in /Users/builder/azdo/_work/1/s/xamarin-macios/src/UIKit/UIApplication.cs:line 94
at MauiArcGISApp1.Program.Main(String[] args) in C:\Users\dschuster\source\GitHub\MauiArcGISApp1\MauiArcGISApp1\Platforms\iOS\Program.cs:line 13
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr)'
2023-10-23 22:36:40.873 Xamarin.PreBuilt.iOS[1723:8025329] You've implemented -[<UIApplicationDelegate> application:performFetchWithCompletionHandler:], but you still need to add "fetch" to the list of your supported UIBackgroundModes in your Info.plist.

When building an application that uses native references and deploying via Hot Restart, the application will crash the moment you make a call to a native library. Steps to Reproduce Make sure you're using the .NET 8 RC2 SDK (vs preview, ...

Are you remote-deploying from Windows via a Mac, or with an iPhone connected directly to Windows using Hot Restart?
Remote deploy works for me with 200.2 - just note that xcode 15 currently doesn't work due to this issue: https://github.com/xamarin/xamarin-macios/issues/19157 (workaround in issue, or downgrade to xcode 14).

v200.3 will have official support for .NET 8.

Steps to Reproduce Create a new .NET MAUI App (net8 rc2) Add package Esri.ArcGISRuntime v200.2.0 &lt;PackageReference Include="Esri.ArcGISRuntime" Version="200.2.0" /&gt; Build ...

Hi Morten, thanks for your reply.

I'm using Hot Restart with an iPhone connected directly to my Windows machine (my apologies - I typed "Hot Reload" earlier when I meant "Hot Restart").

This Hot Restart option is the most practical for our dev team due to some current hardware and network policy limitations.  Do you think this issue might be resolved in the 200.3 release?

Thank you for your work on the MAUI Maps SDK - we're really excited about this cross-platform technology!

-David

Steps to Reproduce Create a new .NET MAUI App (net8 rc2) Add package Esri.ArcGISRuntime v200.2.0 &lt;PackageReference Include="Esri.ArcGISRuntime" Version="200.2.0" /&gt; Build ...
When building an application that uses native references and deploying via Hot Restart, the application will crash the moment you make a call to a native library. Steps to Reproduce Make sure you're using the .NET 8 RC2 SDK (vs preview, ...
var data = div.getElementsByClassName("video-js"); var script = document.createElement('script'); script.src = "https://players.brightcove.net/" + data_account + "/" + data_palyer + "_default/index.min.js"; for(var i=0;i< data.length;i++){ videodata.push(data[i]); for(var i=0;i< videodata.length;i++){ document.getElementsByClassName('lia-vid-container')[i].innerHTML = videodata[i].outerHTML; document.body.appendChild(script); catch(e){ /* Re compile html */ $compile(rootElement.querySelectorAll('div.lia-message-body-content')[0])($scope); if (code_l.toLowerCase() != newBody.getAttribute("slang").toLowerCase()) { /* Adding Translation flag */ var tr_obj = $filter('filter')($scope.sourceLangList, function (obj_l) { return obj_l.code.toLowerCase() === newBody.getAttribute("slang").toLowerCase() if (tr_obj.length > 0) { tr_text = "Esri may utilize third parties to translate your data and/or imagery to facilitate communication across different languages.".replace(/lilicon-trans-text/g, tr_obj[0].title); try { if ($scope.wootMessages[$rootScope.profLang] != undefined) { tr_text = $scope.wootMessages[$rootScope.profLang].replace(/lilicon-trans-text/g, tr_obj[0].title); } catch (e) { } else { //tr_text = "This message was translated for your convenience!"; tr_text = "Esri may utilize third parties to translate your data and/or imagery to facilitate communication across different languages."; try { if (!document.getElementById("tr-msz-" + value)) { var tr_para = document.createElement("P"); tr_para.setAttribute("id", "tr-msz-" + value); tr_para.setAttribute("class", "tr-msz"); tr_para.style.textAlign = 'justify'; var tr_fTag = document.createElement("IMG"); tr_fTag.setAttribute("class", "tFlag"); tr_fTag.setAttribute("src", "/html/assets/langTrFlag.PNG"); tr_fTag.style.marginRight = "5px"; tr_fTag.style.height = "14px"; tr_para.appendChild(tr_fTag); var tr_textNode = document.createTextNode(tr_text); tr_para.appendChild(tr_textNode); /* Woot message only for multi source */ if(rootElement.querySelector(".lia-quilt-forum-message")){ rootElement.querySelector(".lia-quilt-forum-message").appendChild(tr_para); } else if(rootElement.querySelector(".lia-message-view-blog-topic-message")) { rootElement.querySelector(".lia-message-view-blog-topic-message").appendChild(tr_para); } else if(rootElement.querySelector(".lia-quilt-blog-reply-message")){ rootElement.querySelector(".lia-quilt-blog-reply-message").appendChild(tr_para); } else if(rootElement.querySelector(".lia-quilt-tkb-message")){ rootElement.querySelector(".lia-quilt-tkb-message").appendChild(tr_para); } else if(rootElement.querySelector(".lia-quilt-tkb-reply-message")){ rootElement.querySelector(".lia-quilt-tkb-reply-message").insertBefore(tr_para,rootElement.querySelector(".lia-quilt-row.lia-quilt-row-footer")); } else if(rootElement.querySelector(".lia-quilt-idea-message")){ rootElement.querySelector(".lia-quilt-idea-message").appendChild(tr_para); }else if(rootElement.querySelector(".lia-quilt-column-alley-left")){ rootElement.querySelector(".lia-quilt-column-alley-left").appendChild(tr_para); else { if (rootElement.querySelectorAll('div.lia-quilt-row-footer').length > 0) { rootElement.querySelectorAll('div.lia-quilt-row-footer')[0].appendChild(tr_para); } else { rootElement.querySelectorAll('div.lia-quilt-column-message-footer')[0].appendChild(tr_para); } catch (e) { } else { /* Do not display button for same language */ // syncList.remove(value); var index = $scope.syncList.indexOf(value); if (index > -1) { $scope.syncList.splice(index, 1); angular.forEach(mszList_l, function (value) { if (document.querySelectorAll('div.lia-js-data-messageUid-' + value).length > 0) { var rootElements = document.querySelectorAll('div.lia-js-data-messageUid-' + value); }else { var rootElements = document.querySelectorAll('div.message-uid-' + value); angular.forEach(rootElements, function (rootElement) { if (value == '1340777' && "ForumTopicPage" == "TkbArticlePage") { rootElement = document.querySelector('.lia-thread-topic'); /* V1.1 Remove from UI */ if (document.getElementById("tr-msz-" + value)) { document.getElementById("tr-msz-" + value).remove(); if (document.getElementById("tr-sync-" + value)) { document.getElementById("tr-sync-" + value).remove(); /* XPath expression for subject and Body */ var lingoRBExp = "//lingo-body[@id = "+"'lingo-body-"+value+"'"+"]"; lingoRSExp = "//lingo-sub[@id = "+"'lingo-sub-"+value+"'"+"]"; /* Get translated subject of the message */ lingoRSXML = doc.evaluate(lingoRSExp, doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for(var i=0;i 0){ angular.forEach(document.querySelectorAll(".PageTitle"), function(subEle) { subEle.textContent = sub_L; // Label translation var labelEle = document.querySelectorAll(".LabelsList .lia-list-standard-inline"); if(!labelEle){ labelEle = document.querySelector(".LabelsList"); for(var i = 0; i < labelEle.length; i++){ var listContains = labelEle[i].querySelector('.label'); if (listContains) { /* Commenting this code as bussiness want to point search with source language label */ // var tagHLink = labelEle.querySelectorAll(".label")[0].querySelector(".label-link").href.split("label-name")[0]; var lingoLabelExp = "//lingo-label/text()"; trLabels = []; trLabelsHtml = ""; /* Get translated labels of the message */ lingoLXML = doc.evaluate(lingoLabelExp, doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); var labelsLength = labelEle[i].querySelectorAll(".label").length; var labelSnapshotLength = lingoLXML.snapshotLength; if (labelsLength == labelSnapshotLength){ for (var k = 0; k < lingoLXML.snapshotLength; k++) { //trLabels.push(lingoLXML.snapshotItem(i).textContent); if (k != 0) { //trLabelsHtml = trLabelsHtml + '
  • ,
  • '; //diffVariable = kValue if(labelEle[i].querySelectorAll(".label")[k]){ tagHLink = labelEle[i].querySelectorAll(".label")[k].querySelector(".label-link").href; if ("ForumTopicPage" == "BlogArticlePage") { trLabelsHtml = trLabelsHtml + '
  • ' + lingoLXML.snapshotItem(k).textContent + '
  • '; else { // trLabelsHtml = trLabelsHtml + '
  • ' + lingoLXML.snapshotItem(k).textContent + '

  • '; trLabelsHtml = trLabelsHtml + '
  • ' + lingoLXML.snapshotItem(k).textContent + '
  • '; catch(e){ if (newSub.getAttribute("slang").toLowerCase() != code_l.toLowerCase()) { if (trLabelsHtml != "") { var labelSname = ""; if(labelEle[i].querySelector("ul li:nth-child(1)").getAttribute("aria-hidden")){ labelSname = labelEle[i].querySelector("ul li:nth-child(1)").outerHTML; labelEle[i].innerHTML = ""; labelEle[i].innerHTML = labelSname + trLabelsHtml; catch(e){ /* V 2.0:3 = Store not translated reply id */ if(lingoRSXML.snapshotLength == 0){ if($scope.falseReplyID == "") { $scope.falseReplyID = value; /* Get translated Body of Replies/Comments */ var lingoRBXML = doc.evaluate(lingoRBExp, doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for(var i=0;i 0) { var attachDiv = rootElement.querySelector('div.lia-quilt-row-main').querySelector('div.custom-attachments'); if (attachDiv) { attachDiv = attachDiv.outerHTML; else if(rootElement.querySelector('div.lia-quilt-row-main').querySelectorAll('#attachments').length > 0){ if ("ForumTopicPage" == "BlogArticlePage") { attachDiv = rootElement.querySelector('div.lia-quilt-row-main .lia-message-body-content').querySelector('#attachments'); if (attachDiv) { attachDiv = attachDiv.outerHTML; else{ attachDiv = ""; }else{ attachDiv = rootElement.querySelector('div.lia-quilt-row-main').querySelector('#attachments').outerHTML; else { attachDiv = ""; /* Feedback Div */ var feedbackDiv = ""; var feedbackDivs = rootElement.querySelector('div.lia-quilt-row-main').querySelectorAll('div.lia-panel-feedback-banner-safe'); if (feedbackDivs.length > 0) { for (var k = 0; k < feedbackDivs.length; k++) { feedbackDiv = feedbackDiv + feedbackDivs[k].outerHTML; else { var attachDiv = rootElement.querySelector('div.lia-message-body-content').querySelector('div.Attachments.preview-attachments'); if (attachDiv) { attachDiv = attachDiv.outerHTML; } else { attachDiv = ""; /* Everyone tags links */ if (document.querySelectorAll("div.TagList").length > 0){ var everyoneTagslink = document.querySelector('div.lia-quilt-row-main').querySelector(".MessageTagsTaplet .TagList"); if ((everyoneTagslink != null)||(everyoneTagslink != undefined)){ everyoneTagslink = everyoneTagslink.outerHTML; else{ everyoneTagslink = ""; /* Feedback Div */ var feedbackDiv = ""; var feedbackDivs = rootElement.querySelector('div.lia-message-body-content').querySelectorAll('div.lia-panel-feedback-banner-safe'); if (feedbackDivs.length > 0) { for (var m = 0; m < feedbackDivs.length; m++) { feedbackDiv = feedbackDiv + feedbackDivs[m].outerHTML; } catch (e) { if (body_L == "") { /* V 2.0:7 Replacing translated video data with source video data */ var newBodyVideoData = newBody.querySelectorAll('div[class*="video-embed"]'); angular.forEach($scope.videoData[value], function (sourceVideoElement, index) { if (index <= (newBodyVideoData.length - 1)) { newBodyVideoData[index].outerHTML = sourceVideoElement.outerHTML /* V 2.0:7 = Replacing translated image data with source data */ var newBodyImageData = newBody.querySelectorAll('[class*="lia-image"]'); angular.forEach($scope.imageData[value], function (sourceImgElement, index) { if (index <= (newBodyImageData.length - 1)) { newBodyImageData[index].outerHTML = sourceImgElement.outerHTML; /* V 2.0:7 = Replacing translated pre tag data with source data */ var newBodyPreTagData = newBody.querySelectorAll('pre'); angular.forEach($scope.preTagData[value], function (sourcePreTagElement, index) { if (index <= (newBodyPreTagData.length - 1)) { newBodyPreTagData[index].outerHTML = sourcePreTagElement.outerHTML; var copyBodySubject = false; if (body_L == "") { copyBodySubject = true; body_L = newBody.innerHTML; /* This code is written as part of video fix by iTalent */ /* try{ var iframeHTMLText = body_L; var searchIframeText = "<IFRAME"; var foundiFrameTag; if (iframeHTMLText.indexOf(searchIframeText) > -1) { foundiFrameTag = decodeHTMLEntities(iframeHTMLText); foundiFrameTag = foundiFrameTag.split('src=" ')[1]; body_L = foundiFrameTag; catch(e){ /* This code is placed to remove the extra meta tag adding in the UI*/ body_L = body_L.replace('<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />',''); catch(e){ /** We should not replace the source content if user profile language and selected target language matches with source language **/ if(showTrContent) { var compiled = false; rootElement.querySelectorAll('div.lia-message-body-content')[0].innerHTML = null if("ForumTopicPage"=="IdeaPage"){ // var customAttachDiv = '
    '; rootElement.querySelectorAll('div.lia-message-body-content')[0].innerHTML = body_L + feedbackDiv ; $compile(rootElement.querySelectorAll('div.lia-message-body-content')[0])($scope); compiled = true; /* Attach atttach div */ // document.querySelector("div.translation-attachments-"+value).innerHTML = attachDiv; rootElement.querySelectorAll('div.lia-message-body-content')[0].insertAdjacentHTML('afterend',attachDiv); if(rootElement.querySelectorAll('div.lia-quilt-idea-message .lia-message-body .lia-attachments-message').length > 1){ rootElement.querySelectorAll('div.lia-quilt-idea-message .lia-message-body .lia-attachments-message')[1].remove(); } else { if("ForumTopicPage"=="TkbArticlePage"){ rootElement.querySelectorAll('div.lia-message-body-content')[0].innerHTML = body_L + feedbackDiv ; }else{ rootElement.querySelectorAll('div.lia-message-body-content')[0].innerHTML = body_L + feedbackDiv + attachDiv; compiled = true; /* Destroy and recreate OOyala player videos to restore the videos in target languages which is written by iTalent as part of iTrack LILICON-79 */ /* Destroy and recreate OOyala player videos */ // $scope.videoData[value][0].querySelector("div").getAttribute("id"); for(var vidIndex=0; vidIndex (view in my videos) ' var data = div.getElementsByClassName("video-js"); var script = document.createElement('script'); script.src = "https://players.brightcove.net/" + data_account + "/" + data_palyer + "_default/index.min.js"; for(var i=0;i< data.length;i++){ videodata.push(data[i]); for(var i=0;i< videodata.length;i++){ document.getElementsByClassName('lia-vid-container')[i].innerHTML = videodata[i].outerHTML; document.body.appendChild(script); catch(e){ if(!compiled){ /* Re compile html */ $compile(rootElement.querySelectorAll('div.lia-message-body-content')[0])($scope); if (code_l.toLowerCase() != newBody.getAttribute("slang").toLowerCase()) { /* Adding Translation flag */ var tr_obj = $filter('filter')($scope.sourceLangList, function (obj_l) { return obj_l.code.toLowerCase() === newBody.getAttribute("slang").toLowerCase() if (tr_obj.length > 0) { tr_text = "Esri may utilize third parties to translate your data and/or imagery to facilitate communication across different languages.".replace(/lilicon-trans-text/g, tr_obj[0].title); try { if ($scope.wootMessages[$rootScope.profLang] != undefined) { tr_text = $scope.wootMessages[$rootScope.profLang].replace(/lilicon-trans-text/g, tr_obj[0].title); } catch (e) { } else { //tr_text = "This message was translated for your convenience!"; tr_text = "Esri may utilize third parties to translate your data and/or imagery to facilitate communication across different languages."; try { if (!document.getElementById("tr-msz-" + value)) { var tr_para = document.createElement("P"); tr_para.setAttribute("id", "tr-msz-" + value); tr_para.setAttribute("class", "tr-msz"); tr_para.style.textAlign = 'justify'; var tr_fTag = document.createElement("IMG"); tr_fTag.setAttribute("class", "tFlag"); tr_fTag.setAttribute("src", "/html/assets/langTrFlag.PNG"); tr_fTag.style.marginRight = "5px"; tr_fTag.style.height = "14px"; tr_para.appendChild(tr_fTag); var tr_textNode = document.createTextNode(tr_text); tr_para.appendChild(tr_textNode); /* Woot message only for multi source */ if(rootElement.querySelector(".lia-quilt-forum-message")){ rootElement.querySelector(".lia-quilt-forum-message").appendChild(tr_para); } else if(rootElement.querySelector(".lia-message-view-blog-topic-message")) { rootElement.querySelector(".lia-message-view-blog-topic-message").appendChild(tr_para); } else if(rootElement.querySelector(".lia-quilt-blog-reply-message")){ rootElement.querySelector(".lia-quilt-blog-reply-message").appendChild(tr_para); } else if(rootElement.querySelector(".lia-quilt-tkb-message")){ rootElement.querySelector(".lia-quilt-tkb-message").appendChild(tr_para); } else if(rootElement.querySelector(".lia-quilt-tkb-reply-message")){ rootElement.querySelector(".lia-quilt-tkb-reply-message").insertBefore(tr_para,rootElement.querySelector(".lia-quilt-row.lia-quilt-row-footer")); } else if(rootElement.querySelector(".lia-quilt-idea-message")){ rootElement.querySelector(".lia-quilt-idea-message").appendChild(tr_para); } else if(rootElement.querySelector('.lia-quilt-occasion-message')){ rootElement.querySelector('.lia-quilt-occasion-message').appendChild(tr_para); else { if (rootElement.querySelectorAll('div.lia-quilt-row-footer').length > 0) { rootElement.querySelectorAll('div.lia-quilt-row-footer')[0].appendChild(tr_para); } else { rootElement.querySelectorAll('div.lia-quilt-column-message-footer')[0].appendChild(tr_para); } catch (e) { } else { /* Do not display button for same language */ // syncList.remove(value); var index = $scope.syncList.indexOf(value); if (index > -1) { $scope.syncList.splice(index, 1); /* V 1.1:2 = Reply Sync button for multi source translation */ } catch(e){ console.log(e); if((rContent != undefined) && (rContent != "")) { drawCanvas(decodeURIComponent(rContent)); /** Update variable with selected language code **/ $scope.previousSelCode = code_l; * @function manageTranslation * @description Managess the translation of given language for the thread * @param {string} langCode - Language Code * @param {string} tid - Thread ID $scope.manageTranslation = function (langCode, tid) { //debugger; $scope.showTrText = false; /* V 2.0:5 = actualStatus variable introduced to indicate detailed connector status on UI. This variable holds the actual translation percentage */ $scope.transPercent = ""; $scope.actualStatus = ""; if (tid != "") { var bulkTranslation = lithiumPlugin.bulkTranslation(langCode, tid); bulkTranslation.then(function (trContent) { if(trContent.body != "") { $scope.showPreview(trContent.body, $scope.mszList, langCode); if(langCode != "en-US") { $scope.showTrText = true; if((trContent.status != "NA") && trContent.status != null) { // $scope.transPercent = String(trContent.status); $scope.actualStatus = String(trContent.status); } else { // $rootScope.errorMsg = "Translation is in progress. Please check again a few minutes." $rootScope.errorMsg = "Translation is in progress. Please retry in a few minutes." $scope.workbench = trContent.wb; /* V 2.0:4 = Trigger uncalled or delayed callbacks (documnet uploaded/translation completed from lithium).*/ if(trContent.callback == 'true') { var trCompletCallback = lithiumPlugin.trCompletCallback(langCode, trContent.docID); trCompletCallback.then(function (callback){ // $rootScope.errorMsg = "Downloading Translated content in " + langCode + " now. Please check again in a few minutes." $rootScope.errorMsg = "Uploading content to translate. Please check again in a few minutes." } else if (trContent.callback == 'upload') { var trCompletUpload = lithiumPlugin.trCompletUpload(langCode, trContent.docID); trCompletUpload.then(function (callback) { //$rootScope.errorMsg = "Uploading content to translate. Please check again in a few minutes." $rootScope.errorMsg = "Uploading content to translate. Please check again in a few minutes." } else if ("many" == "one") { $scope.updateOOS(); } else if("SmartConx" == "SmartConx"){ if ("many" == "many"){ $scope.updateOOS(); }else if ((trContent.status != null) && trContent.status.includes("100")) { /* If everything fine then only check Out of Sync status */ $scope.updateOOS(); } else { /* If translation perccent is less than 100 then show the percentage on UI */ $scope.transPercent = $scope.actualStatus; * @function selectThisLang * @description Called on select dropdown. * @param {string} lang - Language code $scope.selectThisLang = function (lang, anonymousFlag) { /* 1.4:3 Update Analytics on language selection */ try { setTimeout(()=>{ lingoThreadLangSelected(lang, '1340777'); console.log("Language",lang); },5000) } catch (e) { console.log(e); /** Display Translated content **/ var getTranslation = lithiumPlugin.getTranslation(lang, "1340777"); getTranslation.then(function (trContent) { if (trContent.body != "") { $scope.showPreview(trContent.body, $scope.mszList, lang); } else { //$rootScope.errorMsg = "Translation is in progress. Please check again in a few minutes." $rootScope.errorMsg = "Translation is in progress. Please retry in a few minutes." var decodeEntities = (function() { // this prevents any overhead from creating the object each time var element = document.createElement('div');