message: Add LocaleIdentifier to connectionstring
  Added LocaleIdentifier param to the connection string to avoid a CultureNotFoundException when the param is not provided and the ADOMD.NET provider uses the CurrentThread.CurrentUICulture.LCID. If the CurrentThread.CurrentUICulture.LCID is a LOCALE_CUSTOM_UNSPECIFIED locale then the CultureNotFoundException is raised
diff: using System;
  using System.Data.OleDb;
  using System.Diagnostics.CodeAnalysis;
  + using System.Globalization;
  using System.Net;
  + using System.Threading;
  internal static class ConnectionStringHelper
  {
  //private const string UseEncryptionForDataKey = "Use Encryption for Data";
  private const string ApplicationNameKey = "Application Name";
  private const string ConnectTimeoutKey = "Connect Timeout";
  + private const string LocaleIdentifierKey = "LocaleIdentifier";
  private const string ProviderMsolapValue = "MSOLAP";
  private const string IntegratedSecuritySspiValue = "SSPI";
  private const string IntegratedSecurityClaimsTokenValue = "ClaimsToken";
  private const string PersistSecurityInfoValue = "False"; // 'False' here is used as a best practice in order to discard security-sensitive information after the connection has been opened
  + private static readonly Lazy<int> _localeIdentifier = new(() => GetLocaleIdentifier());
  +
  public static string BuildFor(IPEndPoint endPoint)
  {
  // PBIDesktop relies on a local Analysis Services instance that is binded to the loopback interface.
  { ConnectTimeoutKey, connectTimeout },
  { IntegratedSecurityKey, IntegratedSecuritySspiValue },
  { PersistSecurityInfoKey, PersistSecurityInfoValue },
  + { LocaleIdentifierKey, _localeIdentifier.Value },
  { ApplicationNameKey, AppEnvironment.ApplicationInstanceUniqueName }
  };
  { InitialCatalogKey, report.DatabaseName },
  { IntegratedSecurityKey, IntegratedSecuritySspiValue },
  { PersistSecurityInfoKey, PersistSecurityInfoValue },
  + { LocaleIdentifierKey, _localeIdentifier.Value },
  { ApplicationNameKey, AppEnvironment.ApplicationInstanceUniqueName }
  };
  { InitialCatalogKey, databaseName },
  { IntegratedSecurityKey, IntegratedSecurityClaimsTokenValue },
  { PersistSecurityInfoKey, PersistSecurityInfoValue },
  + { LocaleIdentifierKey, _localeIdentifier.Value },
  { PasswordKey, accessToken }, // The Analysis Services client libraries automatically add the auth-scheme value "Bearer" to the access token
  { ApplicationNameKey, AppEnvironment.ApplicationInstanceUniqueName }
  };
  return false;
  }
  +
  + private static int GetLocaleIdentifier()
  + {
  + // See https://github.com/sql-bi/Bravo/issues/324 and Microsoft.AnalysisServices.XmlaReader.ClientLocaleHelper.ClientLocaleHelper
  +
  + var lcid = Thread.CurrentThread.CurrentUICulture.LCID;
  + try
  + {
  + _ = CultureInfo.GetCultureInfo(lcid);
  + }
  + catch (CultureNotFoundException)
  + {
  + lcid = Thread.CurrentThread.CurrentUICulture.Parent.LCID;
  + try
  + {
  + _ = CultureInfo.GetCultureInfo(lcid);
  + }
  + catch (CultureNotFoundException)
  + {
  + var fallbackCulture = CultureInfo.GetCultureInfo("en-US");
  + lcid = fallbackCulture.LCID;
  + }
  + }
  +
  + return lcid;
  + }
  }
  }
  \ No newline at end of file
  