Jag sitter och funderar på hur jag ska göra en webbplats med:
1. Flerspråksstöd.
Till viss del kan man ju använda resource-filer, men sen har vi ju alla saker som är placerade i databasen, nyheter, produkter m.m.
Jag hade tänkt att skapa en tabell som heter Languages
-ID
-Name
-ISO
-Active
Och i t ex tabellen nyheter har man LangID som hänvisar till ett språk
Men hur ska man gå till väga rent praktiskt? Hur samkör man dessa 2 olika sätt?
2. Databashanteringen
Jag var på ett seminarium om VS2005 där dom gick igenom en hel del om databashanteringen och hur enkelt det skulle vara att byta databas. Men minnet är lika kort som dåligt. Någon som kan skicka en på rätt spår?
Det är ju ganska mycket som är nytt i .NET2.0 och det är ganska idiotiskt att fortsätta programmera på samma sätt man gjorde i .NET1.1, känns som om man måste tänka om på ganska många plan. Känner mig snudd på korkad efter att ha suttit med VS2003 i 2 år och nu ska börja med VS2005 :e
Siten är tänkt att den ska vara en grund som ska kunna återanvändas, nästan som ett CMS med flerspråksstöd och stöd för MS SQL, MySQL och Access.
1. Ja du tänker rätt :) Hur menar du med gå till väga rent praktiskt, förstår inte vad du menar med samkör man dessa 2 olika sätt, exemplifiera gärna. Vilket språk kan du ju antingen styra manuellt eller automatiskt kolla vad besökaren kommer ifrån.
På båda frågorna är det väl mer exempel på hur man får det att fungera, har inte använt resource filerna tidigare. Någon som har länkar till webbplatser som tar upp ämnena resource-filer och databashanterare i ASP.NET 2.0, helst för C#
resource-filer innebär ju att du måste kompilera om varje gång du gör en ändring, tex ändra en text på något språk. Varför inte lösa det med en multi-language XML-fil eller en XML-fil för varje språk?
I min web.config fil skulle jag ha flera conn-string, en för varje databas (en db per språk)
i ConnectionStrings så kan man prefixa conn-stringen med <lang-id>ConnString
Alt. göra som du sa ... ha ett fält för Lang-id och ha alla språk i samma databas.
För MySQL/ODBC och Access får du lov att skriva egna Membership- och Role- providers OM! du ska kunna använda samma applikation med olika db och för att kunna nyttja de nya fina kontrollerna som Login, LoginView, LoginStatus osv ...
För att kunna återanvända applikationen, så skriv den med så lite innehåll som möjligt i den. Allt "innehåll" ska vara dynamiskt. Då kan man med fördel använda funktionen för att skapa Templates över en hel "applikation". När man sedan ska återanvända den så är det ju bara att skapa den nya webbplatsen från Templaten
I min web.config fil skulle jag ha flera conn-string, en för varje databas (en db per språk)
Att ha olika databaser för olika språk är måhända enkelt, men man tappar ju allt vad "samordningsvinster" heter, om man nu vill ha det (och det vill man väl? :) ).
PatrikB skrev:
i ConnectionStrings så kan man prefixa conn-stringen med <lang-id>ConnString
I så fall bör man definiera språken på samma sätt, eller ännu hellre i samma konfigurationselement (genom en egen IConfigurationHandler), så att man inte hamnar i situationen att man efterfrågar ett språk som inte har en motsvarande databas. Det blir dock inte riktigt 2.0-aktigt, eftersom man då hoppar över ConnectionStrings-sektionen i web.config
Resource-filer tycker jag inte fungerar särskilt bra i web-projekt, i synnerhet inte CMS-liknande system, eftersom de ofta är mer dynamiska än t.ex. windows forms-applikationer. En cachad uppslagstabell av någon variant (Hashtable, DataTable, XML etc.) brukar göra susen.
ASP.Net Forums har en intressant tråd i ämnet, och det finns mer matnyttigt i själva forumsektionen (för ovanlighetens skull)
Att ha enskilda databaser för språk är ju inte direkt något jättelysande oftast, kör så som du hade tänkt tycker jag. hade jag kör med multilingual-xmlfiler för en del konstanter som inte ska hämtas från databas, bygg en liten klass med en metod som du skickar in ett textId samt langId som returnerar din text. Släng in den i cachen, och innan du hämtar en text kollar du om den finns i cachen.
Jag skapade en tabell i databasen som heter Languages:
-ID
-Name
-Code (t ex "sv-SE")
-Active (true/false)
-DefaultLanguage (true/false)
Till det skapade jag en TableAdapter.
I Global.asax la jag följande:
void Application_OnPreRequestHandlerExecute(Object sender, EventArgs e)
{
string requestPath = string.Empty,
userLang = string.Empty;
try
{
if (Session["Globalization"] == null || Request.QueryString["Globalization"] != null)
{
//Get the users language
if(Request.QueryString["Globalization"] != null)
userLang = Request.QueryString["Globalization"].ToLower();
else
userLang = Request.UserLanguages[0].ToLower();
//get all languages
LanguagesTableAdapters.LanguagesTableAdapter lang = new LanguagesTableAdapters.LanguagesTableAdapter();
System.Data.DataTable dtLang = lang.GetData();
if (dtLang.Rows.Count > 0)
{
//loop them
foreach (System.Data.DataRow dr in dtLang.Rows)
{
//get the default language if users language don't exists
if (Convert.ToBoolean(dr["DefaultLanguage"].ToString()))
requestPath = dr["Code"].ToString();
//does the users language exists?
if (dr["Code"].ToString().ToLower().Equals(userLang) && Convert.ToBoolean(dr["Active"].ToString()))
{
requestPath = dr["Code"].ToString();
break;
}
}
//set the new session
if (requestPath != string.Empty)
Session["Globalization"] = requestPath;
else
throw new Exception("Error: No default language selected!");
}
}
else
requestPath = Session["Globalization"].ToString();
Localization.LocalizationHttpModule l = new Localization.LocalizationHttpModule();
l.LoadCulture(ref requestPath);
}
catch
{
throw new Exception("Error while loading language!");
}
}
Sen skickar jag in Session["Globalization"].ToString() varje gång jag hämtar från databasen så att jag får t ex nyheter på rätt språk.
Vissa delar som t ex rubriken "Nyheter" sparas i xml-filer(kan även sparas i databas) och hämtas av Localization.
Det här går säkert att snygga till ordentligt, just nu är det bara ihopslängt för att ha nått att utgå från. Förslag emottages gärna.
Angående Code kolumnen så är det bättre att spara endast sv för svenska istället för sv-SE. Annars missar du de med sv-FI. Mer tydligt blir det med till exempel engelska. en-US är ju engelskan i USA och då missar du ju 12 andra en-??.
275 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e