webForumDet fria alternativet

[.NET 2.0] Flerspråksstöd m.m.

.NET

10 svar · 662 visningar · startad av aleborg

Medlem sedan jan. 20013 341 inlägg
Frågan#1

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.

Medlem sedan juli 200012 978 inlägg
#2

Du tänker helt rätt, men jag kommer inte heller ihåg hur det var.
Men visst är det jätteviktigt att tänka om och göra rätt från början.

Medlem sedan dec. 19996 522 inlägg
#3

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.

Medlem sedan jan. 20013 341 inlägg
#4

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#

Medlem sedan dec. 19996 522 inlägg
#5

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?

Medlem sedan mars 20002 836 inlägg
#6

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

cya,
/PatrikB

Medlem sedan dec. 19996 721 inlägg
#7

PatrikB skrev:

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)

Medlem sedan jan. 20013 341 inlägg
#8

emission skrev:

ASP.Net Forums har en intressant tråd i ämnet, och det finns mer matnyttigt i själva forumsektionen (för ovanlighetens skull)

Vilken djungel :o
Blev bara ännu mer förvirrad :x :r

Medlem sedan dec. 19996 522 inlägg
#9

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.

Medlem sedan jan. 20013 341 inlägg
#10

Så här gjorde jag:

Jag laddade ner och konverterade den här till .NET 2.0:
http://www.codeproject.com/aspnet/MultilingualWebsites3.asp

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.

Medlem sedan sep. 20011 914 inlägg
#11

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
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
146 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)