public partial class XYZVariationRootLanding : System.Web.UI.UserControl
{
private const string QualityValuePrefix = ";q=";
private enum PropertiesOnLabelToUse
{
Language,
Locale
}
private enum MatchingPreference
{
ImpreciseOrderFirst,
PreciseMatch
}
private PropertiesOnLabelToUse PropertyOnLabelToUse
{
get { return this.propertyOnLabelToUse; }
set { this.propertyOnLabelToUse = value; }
}
private PropertiesOnLabelToUse propertyOnLabelToUse = PropertiesOnLabelToUse.Locale;
private MatchingPreference PreferenceOrder
{
get { return this.preferenceOrder; }
set { this.preferenceOrder = value; }
}
private MatchingPreference preferenceOrder = MatchingPreference.ImpreciseOrderFirst;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
string targetUrl = this.GetRedirectTargetUrl();
if (!string.IsNullOrEmpty(targetUrl))
{
SPUtility.Redirect(targetUrl, SPRedirectFlags.Default, Context);
}
}
private string GetRedirectTargetUrl()
{
try
{
ReadOnlyCollection spawnedLabels = Variations.Current.UserAccessibleLabels;
LoggedInUser loggedInUser = new LoggedInUser();
string ReturnURL = string.Empty;
string XYZURL = string.Empty;
loggedInUser.LoginName = SPContext.Current.Web.CurrentUser.LoginName;
if (spawnedLabels.Count > 0)
{
string sourceLabelUrl = string.Empty;
Dictionary cultureCodeToUrlMapping = new Dictionary();
Dictionary cultureCodeStrippedToUrlMapping = new Dictionary();
foreach (VariationLabel label in spawnedLabels)
{
if (label.IsSource)
{
sourceLabelUrl = label.TopWebUrl;
}
CultureInfo labelCultureInfo = this.GetLabelCultureInfo(label);
string labelCultureInfoName = labelCultureInfo.Name.ToUpperInvariant();
if (!cultureCodeToUrlMapping.ContainsKey(labelCultureInfoName) || label.IsSource)
{
cultureCodeToUrlMapping.Remove(labelCultureInfoName);
cultureCodeToUrlMapping.Add(labelCultureInfoName, label.TopWebUrl);
string strippedCode = labelCultureInfoName.Split('-')[0];
if (!cultureCodeStrippedToUrlMapping.ContainsKey(strippedCode) || label.IsSource)
{
cultureCodeStrippedToUrlMapping.Remove(strippedCode);
cultureCodeStrippedToUrlMapping.Add(strippedCode, label.TopWebUrl);
}
}
}
string matchedUrl;
if (MatchingPreference.ImpreciseOrderFirst == this.preferenceOrder)
{
matchedUrl = this.GetRedirectTargetUrlImpreciseOrderFirst(
cultureCodeToUrlMapping, cultureCodeStrippedToUrlMapping);
}
else
{
matchedUrl = this.GetRedirectTargetUrlPreciseMatch(
cultureCodeToUrlMapping, cultureCodeStrippedToUrlMapping);
}
ReturnURL = (string.IsNullOrEmpty(matchedUrl) ? sourceLabelUrl : matchedUrl);
XYZURL = GetXYZLanguageURL();
if (string.IsNullOrEmpty(XYZURL))
{
return ReturnURL;
}
else
{
return XYZURL;
}
}
}
catch (Exception ex)
{
LogUtility logUtility = new LogUtility();
logUtility.ManageException(ex.Message, ex);
Response.Redirect(SPContext.Current.Site.RootWeb.Url + "/Pages/Exception.aspx");
}
return null;
}
private string GetXYZLanguageURL()
{
// Logic for creating the redirection URL
}
private CultureInfo GetLabelCultureInfo(VariationLabel label)
{
if (PropertiesOnLabelToUse.Locale == this.propertyOnLabelToUse)
{
return new CultureInfo(Convert.ToInt32(label.Locale, CultureInfo.InvariantCulture));
}
else
{
return new CultureInfo(label.Language);
}
}
private string GetRedirectTargetUrlImpreciseOrderFirst(Dictionary cultureCodeToUrlMapping, Dictionary cultureCodeStrippedToUrlMapping)
{
string[] browserPrefLanguages = this.GetUserLanguages();
if (null == browserPrefLanguages)
return null;
string browserPrefLang;
string browserPrefLangStripped;
for (int i = 0; i <>
{
browserPrefLang = browserPrefLanguages[i].ToUpperInvariant();
if (cultureCodeToUrlMapping.ContainsKey(browserPrefLang))
{
return cultureCodeToUrlMapping[browserPrefLang];
}
browserPrefLangStripped = browserPrefLang.Split('-')[0];
if ((browserPrefLang != browserPrefLangStripped) &&
(cultureCodeToUrlMapping.ContainsKey(browserPrefLangStripped)))
{
return cultureCodeToUrlMapping[browserPrefLangStripped];
}
if (cultureCodeStrippedToUrlMapping.ContainsKey(browserPrefLangStripped))
{
return cultureCodeStrippedToUrlMapping[browserPrefLangStripped];
}
}
return null;
}
private string GetRedirectTargetUrlPreciseMatch(Dictionary cultureCodeToUrlMapping, Dictionary cultureCodeStrippedToUrlMapping)
{
string[] browserPrefLanguages = this.GetUserLanguages();
if (null == browserPrefLanguages)
return null;
for (int i = 0; i <>
{
string browserPrefLanguageName = browserPrefLanguages[i].ToUpperInvariant();
if (cultureCodeToUrlMapping.ContainsKey(browserPrefLanguageName))
{
return cultureCodeToUrlMapping[browserPrefLanguageName];
}
}
for (int i = 0; i <>
{
string browserPrefLanguageName = browserPrefLanguages[i].ToUpperInvariant();
if (cultureCodeStrippedToUrlMapping.ContainsKey(browserPrefLanguageName))
{
return cultureCodeStrippedToUrlMapping[browserPrefLanguageName];
}
}
string browserPrefLangStripped;
for (int i = 0; i <>
{
browserPrefLangStripped = browserPrefLanguages[i].Split('-')[0].ToUpperInvariant();
if (cultureCodeToUrlMapping.ContainsKey(browserPrefLangStripped))
{
return cultureCodeToUrlMapping[browserPrefLangStripped];
}
}
for (int i = 0; i <>
{
browserPrefLangStripped = browserPrefLanguages[i].Split('-')[0].ToUpperInvariant();
if (cultureCodeStrippedToUrlMapping.ContainsKey(browserPrefLangStripped))
{
return cultureCodeStrippedToUrlMapping[browserPrefLangStripped];
}
}
return null;
}
private string[] GetUserLanguages()
{
string[] browserPrefLanguages = Page.Request.UserLanguages;
if (null != browserPrefLanguages)
{
int qualityIndexPos = -1;
for (int i = 0; i <>
{
qualityIndexPos = browserPrefLanguages[i].IndexOf(QualityValuePrefix, StringComparison.Ordinal);
if (qualityIndexPos > 0)
{
browserPrefLanguages[i] = browserPrefLanguages[i].Substring(0, qualityIndexPos);
}
}
}
return browserPrefLanguages;
}
private string ConcatUrls(string firstPart, string secondPart)
{
if (firstPart.EndsWith("/"))
{
if (secondPart.StartsWith("/"))
{
firstPart = firstPart.TrimEnd('/');
}
return firstPart + secondPart;
}
else
{
if (secondPart.StartsWith("/"))
return firstPart + secondPart;
else
return firstPart + "/" + secondPart;
}
}
}