Hejsan Använd ResourceMangers konstruktor istället Får verkligen inte det att funka. Pelles artikel fungerar, men det är inte riktigt så det är tänkt att det ska fungera i ASP.Net. ASP.Net kan nämligen automatiskt hitta rätt resursfil för en användare. Detta var ju kanon, men kan jag på något sätt få användaren att själv välja språk >Detta var ju kanon, men kan jag på något sätt få användaren att själv välja språk så här har jag gjort Aha, fel i min instruktion sorry, när du har valt svenska som ditt första alternativ i IE under Languages, så blir koden sv. Det innebär att den inte hittar din sv-SE fil. Det är nämligen så att .Net letar sig upp till rätt kultur, så har du tex valt sv-SE men det finns ingen sådan resursfil så letar den automatikst efter en med enbart sv. Finns den filen så tar den den, annars den default filen (som i ditt fall är strings). Nu är det så att du har en resursfil som heter sv-SE som och denna ligger under sv i kultur kedjan. Så eftersom du får sv så letar .Net enbart uppåt i kedjan, vilket leder till att den tar standardfilen som är strings on inte sv-Se som ligger under sv i kedjan. skulle du kunna summera koden nu, för jag får fortfarande inte rätt på det. <code> den klagar på raden i global.asax Aha, sorry, det ska vara: nu säger den fick rätt på det genom att skriva sv-se istället för se, fast min rescource fil heter string.sv.resx hmm, tesa och tabort raden som ger fel och se om det fungerar.multilanguage i asp.net
Jag håller på att göra så att mina sidor kan ha olika språk.
Så här har jag gjort
<code>
CultureInfo ci;
ci = CultureInfo.CurrentCulture;
Response.Write(ci); //skriver ut att det är sv-SE
ci = new CultureInfo("en-GB");
Response.Write(ci); //skriver ut att det är en-GB
</code>
nu vet jag inte riktigt hur jag ska göra
jag har gjort en rescource fil som heter sprak.resx och den ser ut så här.
name value comment type mimetype
label hejsan (null) (null) (null)
<code>
ResourceManager x;
x = ResourceManager.CreateFileBasedResourceManager("Sprak", ".", Nothing);
Label1.Text=x.GetString("label");
</code>
så här trodde jag att man skulle göra. Men den klagar på Nothing.
Sen så undrar jag, var jag skriver in de andra språken. I min resouce fil så har jag ju bara skrivit in "label hejsan" var skriver jag "label Hello".Sv: multilanguage i asp.net
här är ett exempel:
<code>
protected ResourceManager rs = new
ResourceManager("projectname.strings", typeof(WebForm1).Assembly);
</code>
Tips, läs detta:
http://www.dotnetjunkies.com/quickstart/aspplus/doc/resourcefiles.aspx
/Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: multilanguage i asp.net
jag har använt resgen och nu ligger två filer i min mapp som heter
'dessa filer ligg
sprak_se.resources
sprak_en.resources
i dessa finns message hej och message hello
i koden skiver jag såhär
<code>
private void Page_Load(object sender, System.EventArgs e)
{
ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("sprak_se", ".",Nothing);
Label1.Text = rm.GetString("message");
}
</code>
men det går inte så bra för den klagar på Nothing fortfarande. Vad mer behöver jag göra.Sv: multilanguage i asp.net
När du skapar .resx filer i VS.Net så kommer dessa automatikst att kompileras till något som kallas för sattelites assemlies (.dll:er). Använder du resgen för att generera .resoruces filer och vill använda dig av dom så får du ett problem. Det är nämligen så att ResourceManager låser de .resource filer du läser in. Skulle du då behöva ändra i dom så måste du starta om hela din applikation. Men det slipper du med sattelities assemblies. Jag skulle rekommendera dig att läsa det som står på denna site:
http://www.dotnetjunkies.com/quickstart/aspplus/doc/resourcefiles.aspx
där får du en 100% koll på hur resursfiler fungerar i ASP.Net.
eller följer dessa instruktioner:
1) Skapa ett webb projekt.
2) Välj lägg till item. Välj "Assembly resource files", döp den tex till strings.resx
Markera filen .resx och välj properties, se till att Build Action är satt till Embedded Resources (detta är standard).
3) Skriv in dina names och values i filen och spara.
4) Skapa en .resx fil till. Döp den till följande strings.sv-SE.resx.
Se även till att den är "Embedded ..."
När du sedan kompilerar din kod så kommer automatiskt dessa .resx filer skapa upp sattelites assemblies åt dig. Sattelites assemblies lägger sig i din \bin mapp. Varje ny resursfil du skapar och anger en kulturkod för tex sv-SE får sin egna
mapp under \bin. tex \bin\sv-SE. Du behöver inte anvädna resgen för att generera resources filer och inte al.exe för att sedan skapa upp dina sattelites assemblies.
När du sedan ska använda dig av dina sattelites assemblies i din applikation så skriver du följande:
VB.Net:
protected rs As New ResourceManager("projectname.strings", _
GetType(WebForm1).Assembly)
Visual C#
protected ResourceManager rs = new
ResourceManager("projectname.strings", typeof(WebForm1).Assembly);
projectname = Namnet på ditt projekt.
.Net kommer automatiskt att leta upp rätt resursfil åt dig. Det gör den genom att se efter vad du har angivit för kultur till trådens CurrentUICulture.
Här kommer ett exempel på hur du kan läsa av det språk som finns på klienten använda det i en applikation.
VB.Net
private sub Page_Load(Dim sender As Object,Dim e As System.EventArgs)
If Not IsPostBack Then
Dim lang As String = Request.UserLanguages(0)
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang)
' Set threads UICulture för att ladd resources från satellite assembly.
Thread.CurrentThread.CurrentUICulture = New CultureInfo(lang)
End If
End Sub
Visual C#
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
string lang = Request.UserLanguages[0];
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
}
Request.UserLanguages(0), hämtar det första språket som ligger valt i IE under Tools/Internet Options/Languages.
Thread.CurrentThread.CurrentCulture, används för att se till så sortering och datum format visas efter det språk användren har valt. (ASP.Net sätter UICulture och Culture automatiskt till tården om du sätter Session.LCID till en kulture).
Om nu CurrentUICulture har en kultur som inte finns i dina sattelites assemblies. Så kommer .Net automatiskt leta upp den sattelites assemblies som ligger närmast kulturen.
Alltså om du tex har en sattelites assemblies som tillhör kulturen SV och ingen för sv-SE, men har satt UICulture till sv-SE så kommer SV att användas.
Om inte SV finns så tar den den sattelites assemblies som är default (Det är den fil som inte har en kultur i filnamnet, tex strings.resx är default språket).
Mvh Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: multilanguage i asp.net
Label1.Text = rs.GetString("message"); när jag kör detta skriver den ut "hello" trots att "lang" = "se"Sv: multilanguage i asp.net
Självklart går det. Jag skulle rekommendera dig att sätta kulturen på tråden som beskrevs i mitt föregående meddelande i global.asax under Application_BeginRequest.
Du kan göra så som Pelle, spara ner språket i en Session som du sedan använder för att sätta rätt kultur på tråden.
Det är svårt att veta varför du får engelska när du har satt att språket ska vara svenska, men ofta beror det på att kulturen på filerna du skapar inte följer den standard som ASP.Net vill ha. Skulle du kunna skriva ner filernas namn samt koden där du laddar resursfilerna och där du även sätter kulturen, så kan jag se om du har gjort något fel.
/Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: multilanguage i asp.net
strings.resx
detta är min engelska
strings.sv-SE.resx
detta är min svenska
jag har skrivit Sprak.strings som projektnamn, mitt projekt heter Sprak
<Code>
protected ResourceManager rs = new ResourceManager("Sprak.strings", typeof(WebForm1).Assembly);
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
string lang = Request.UserLanguages[0];
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
Response.Write(lang);
}
Label1.Text = rs.GetString("message");
}
</code>
av detta får jag engelska, den tar alltså från strings.resx fast lang variablen innehåller "sv"
sen ville jag ha något sådan här
<code>
private void Button1_Click(object sender, System.EventArgs e)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
}
</code>
men det är kanske bättre att göra något i global.asax?Sv: multilanguage i asp.net
Så döp om din strings.sv-SE.resx till strings.sv.resx och testa.
>sen ville jag ha något sådan här
>private void Button1_Click(object sender, System.EventArgs e)
>{
>Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
>}
>
>men det är kanske bättre att göra något i global.asax?
Japp.
För när du startar ett request så skapas en tråd, denna dör när sidan har processats. Nästa gång du requestar sidan så får du en ny tråd som inte har den kultur som du har specifierat i ditt tidigare request. För att sätta trådens kultur innan din sida processas så kan du göra det i BeginRequest eventent i global.asax. Du kan tex använda dig av en cookie som sätter kulturen.
ex:
<code>
private void Button1_Click(object sender, System.EventArgs e)
{
....
Response.Cookies["language"].Value = lang;
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
</code>
global.asax:
<code>
Application_BeginRequest(......)
{
string lang = Request.Cookies["language"] as string;
if( lang != null && lang != string.Empty )
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
</code>
/Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: multilanguage i asp.net
vad ska det stå i
page_load
button_click
global.asaxSv: multilanguage i asp.net
protected ResourceManager rs = null;
private void Page_Load(object sender, System.EventArgs e)
{
rs = new ResourceManager("Sprak.strings", typeof(WebForm1).Assembly);
Label1.Text = rs.GetString("message");
}
private void Button1_Click(object sender, System.EventArgs e)
{
string lang = "sv"; <-- Här skulle du kunna hämta spårket från en listbox kanske??
Response.Cookies["language"].Value = lang;
Thread.CurrentThread.CurrentCulture = new CultureInfo(lang);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
</code>
global.asax:
<code>
protected void Application_BeginRequest(......)
{
string lang = Request.Cookies["language"] as string;
//Har användaren inte valt ett språk så hämta det som finns inställt i IE.
if( lang == null || lang.Length == 0 )
lang = Request.UserLanguages[0];
Thread.CurrentThread.CurrentCulture = new CultureInfo(lang)
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
</code>
Tips:
CurrentCulture, används för datumformat och sortering mm.
Medans CurrentUICulture, används för språk. Det innebär att du skulle kunna göra
det möjligt att ha engelska som språk och datum format på svenska.
/Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: multilanguage i asp.net
<code>
string lang = Request.Cookies["language"] as string;
</code>
c:\inetpub\wwwroot\Sprak\Global.asax.cs(41): Cannot convert type 'System.Web.HttpCookie' to 'string' via a built-in conversionSv: multilanguage i asp.net
<code>
protected void Application_BeginRequest(......)
{
string lang = "en-US"; //<--- Här anger du det spårk som ska vara
//standard om varjen cookien eller UserLanguages
//Innehåller något värde
if( Request.Cookies["language"] != null &&
Request.Cookies["language"].Value != string.Empty )
{
lang = Request.Cookies["language"].Value;
}
else if(Request.UserLanguages[0] != null )
{
//Har användaren inte valt ett språk så hämta det som finns inställt i IE.
lang = Request.UserLanguages[0];
}
Thread.CurrentThread.CurrentCulture = new CultureInfo(lang)
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
</code>Sv: multilanguage i asp.net
Culture "sv" is a neutral culture. It can not be used in formatting and parsing and therefore cannot be set as the thread's current culture.
klagar på i global.asax
<code>
Thread.CurrentThread.CurrentCulture = new CultureInfo(lang); //denna raden
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
</code>Sv: multilanguage i asp.net
ett annat problem som dock kom var att man måste trycka två gånger på knappen innan den ändrar språket.Sv: multilanguage i asp.net
/Fredrik Normén N2