Sto lavorando su un sito MVC con più traduzioni. Stiamo cercando di farlo attraverso sottodomini come http://en.domain.com
o http://fr.domain.com
. Vogliamo anche supportare il dominio regolare http://domain.com
.Ottieni sottodominio in MVC per l'internazionalizzazione
Le traduzioni funzionano purché si modifichi manualmente il sottodominio, ma sto cercando un modo per automatizzarlo e mantenere l'intero URL corrente per consentire a un utente che trova http://en.domain.com/product
di fare clic sul collegamento e ottenere un'altra versione della lingua di la stessa pagina. Sembra semplice isolare il sottodominio se esiste, eliminarlo dall'url corrente e sostituirlo con la versione della lingua specificata.
In sostanza:
http://en.domain.com/product
(originale)
http://domain.com/product
(pulite)
http://fr.domain.com/product
o http://de.domain.com/product
ecc ... (uscita)
ho iniziato alla ricerca di costruito in funzionalità come Request.Url.Subdomain
ma hai concluso che non esiste una creatura magica del genere. Poi passai alla manipolazione delle stringhe di base, ma sembrava davvero convuluto, quindi partii per trovare una soluzione regex.
Ho provato questo regex con alcuni regex tester online che normalmente funzionano per me e stanno identificando correttamente il sottodominio quando esiste, ma non riesce a trovare un risultato quando il codice viene effettivamente eseguito.
Io uso solo le espressioni regolari un po 'e spero che ci sia qualcosa di veramente ovvio che sto sbagliando qui. Se c'è una soluzione migliore sono aperto ad altre implosioni.
C#
string url = Request.Url.AbsoluteUri; //http://en.domain.com/
Regex regex = new Regex(@"/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/", RegexOptions.IgnoreCase);
GroupCollection results = regex.Match(url).Groups;
Group result = results[0];
ecco la soluzione che ho per ora. Non elegante come vorrei, ma per qualcosa che ha mangiato troppo tempo, ora funziona come previsto.
View
<a href="@Html.Action("ChangeLanguage", new { lang = "en" })">English</a>
<a href="@Html.Action("ChangeLanguage", new { lang = "fr" })">French</a>
azione
public string ChangeLanguage(string controller, string lang)
{
string url = Request.Url.AbsoluteUri;
Regex regex = new Regex(@"(?:https*://)?.*?\.(?=[^/]*\..{2,5})", RegexOptions.IgnoreCase);
GroupCollection results = regex.Match(url).Groups;
Group result = results[0];
if (result.Success)
{
string[] resultParts = result.Value.Split('/');
string newSubDomain = resultParts[0] + "//" + lang + ".";
url = url.Replace(result.Value, newSubDomain);
}
else
{
string[] urlParts = url.Split('/');
string oldParts = urlParts[0] + "//";
string newParts = urlParts[0] + "//" + lang + ".";
url = url.Replace(oldParts, newParts);
}
return url;
}
cosa ovvia: non avete bisogno di delimitatori regex in C#. Prova '@" (?: Https *: //)?. *? \. (? = [^ /] * \ .. {2,5}) '. –
Hai considerato di utilizzare qualcosa di diverso dai sottodomini? Http : // domain.com/fr/product' funziona altrettanto bene, e non richiede ogni nuova "traduzione" per essere registrato come voce DNS –
@stribizhev Questo è tutto io non sono sicuro al 100% perché il.. parte centrale funziona, ma sembra dai test –