webForumDet fria alternativet

Applications variablar?

27 svar · 707 visningar · startad av jimpa

jimpaMedlem sedan jan. 2001361 inlägg
#1

Hej,
Jag provade att använda applications variablar för att byta språk i en application. Varje applications variabel innehåller i princip ett ord eller en kortare fras. Nu funderar jag på om det finns en gräns om hur många applications variablar man kan använda utan att det anses vara att för mycket rent prestandamässigt. Applications variablar tillsätts ju ett värde bara en gång sen finns dom ju där. Känns inte som det spelar någon roll hur många man använder, eller?

Jesper TMedlem sedan nov. 20017 144 inlägg
#2

Det finns ett nyligen startat inlägg om detta:
http://www.webforum.nu/showthread.php?s=&threadid=104593&forumid=22

jimpaMedlem sedan jan. 2001361 inlägg
#3

Jag valde Applicationsvariablar för att jag tror att det är mest prestandavänligt, samtidigt som meningen inte är att språket ska bytas hursomhelst.
Men okej, säg att varje användare skulle kunna byta språk skulle man då kunna använda sig av 300-350 värden utan att det skulle sega ner hela applicationen för mycket och tjänar man på att använda sig av konstanter när man anger ett värde? Hur fungerar igenligen konstanter?

Någon prestandaskillnad?

Const strTxt = "Min sträng"

strTxt = "Min sträng"

jimpaMedlem sedan jan. 2001361 inlägg
#4

Jag upptäckte precis att det finns en version av Snitz forum som supportar fler språk. Jag laddade hem det för att se hur dom har löst språk-modulen där. Som jag kan förstå det så används en vanlig .inc fil med ca:1900 variablar (blandat ord och fraser) för varje språk. Dock rekommenderas det att inte använda sig av mer än max 2 olika språk av just prestandaskäl (3800 variablar).
Detta skulle innebära att om jag med min application som översätts med ca.350 variablar kan få den översatt till nästan 11 språk för att komma upp i samma mängd variablar som Snitz. Nu ska jag även tillägga att jag inte har lyckats luskat ut exakt hur deras språkmodul fungerar, men som jag kan se det används en .inc fil för varje språk.

Om man istället för att använda sig av en separat .inc fil för varje språk och istället använder en .inc fil med alla språk-variablar och en if-sats.
Alltså, istället för:
<!--#INCLUDE FILE="inc_language_eng.asp" -->
<!--#INCLUDE FILE="inc_language_sv.asp" -->
<!--#INCLUDE FILE="inc_language_no.asp" -->
<!--#INCLUDE FILE="inc_language_dk.asp" -->

Så har man alla språk-variablar i en .inc fil med en if sats, typ:
<!--#INCLUDE FILE="inc_languages.asp" -->
if Session("Languages") = "eng" then
'Radda upp alla språk-variablar på engelska
Elseif Session("Languages") = "sv" then
'Radda upp alla språk-variablar på svenska
osv....

Borde det inte bli lite mer prestandavänligare då eftersom bara 350 variablar måste raddas upp oavsett av hur många olika språk som finns?

För den som är intresserad och även kanske kan hjälpa mig luska ut exakt hur det funkar på snitz forum kan ladda hem det här:
http://www.forums2001.com/forum/

Dessutom finns ju även möjlighet att byta utseende på forumet, kan ju också vara intressant att veta hur dom har löst!

Alla tipps och synpunkter uppskattas!

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#5

Att lagra det i Application är inte helt dumt. Du kan ju räkna lite på hur stora dina strängar är och se hur många Kilobytes det kommer ta.
Att hämta upp värden ur application blir förstås lite tyngre ju mer strängar det är, men inte nämnvärt eftersom att de kör med en schysst hashalgortim. (förutsätter jag)

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#6

Ses så lagrar man ju så klart vilket språk man valt i en Sessionsvariabel eller i en cookie. Så folk inte får samma språk som någon annan valt.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#7

Men kanske ska du ha det i en databas eller i en XML-fil från början och sen ladda in det i Application i Application_OnStart.
Lite jobbigt att skicka över en global.asa fil till översättare. :)

jimpaMedlem sedan jan. 2001361 inlägg
#8

Ses så lagrar man ju så klart vilket språk man valt i en Sessionsvariabel eller i en cookie. Så folk inte får samma språk som någon annan valt.

Menar du att man kan spara alla variablar i Application fast ändå få olika språk för varje användare?

Att hämta upp värden ur application blir förstås lite tyngre ju mer strängar det är, men inte nämnvärt eftersom att de kör med en schysst hashalgortim. (förutsätter jag)

Vad är schysst hashalgortim?

Men kanske ska du ha det i en databas eller i en XML-fil från början och sen ladda in det i Application i Application_OnStart.

Kan du inte visa med lite kod hur man med en XML fil kan ladda in det i application?

Tack på förhand!

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#9

1. Ja, lagra bara varje sträng med ett språkprefix. Typ: Application("sv_123")
123 Är ID:t på strängen.

2. En checksumma skapas med hjälp av namnet och när man kör modulu på den så får man veta var i en vector man ska leta. Typ... :)

3. Inte nu, har lite kod på jobbet jag nog kan copy/pastea. :)

jimpaMedlem sedan jan. 2001361 inlägg
#10

Okey,
Jag kanske skulle prova att göra som du säger ;) , och om ingen annan vet så avaktar jag och väntar på ditt kod-exempel (förutsätter att du inte har semester nu :l )

jimpaMedlem sedan jan. 2001361 inlägg
#11

Jag kom på att jag inte alls förstår :l

1. Ja, lagra bara varje sträng med ett språkprefix. Typ: Application("sv_123")

Ok men hur hämtar jag och skriver ut rätt värde på sidan då? Hur vet jag vilken application som gäller?

Ska man köra en function varje gång något ska skrivas ut på sidan, typ:

Response.Write getLangApp('123')

function getLangApp(123)
Dim app
if Session("Language") = "sv" then
app = application("sv_123")
elseif Session("Language") = "eng" then
app = application("eng_123")
end if
getLangApp = app
end function

Eller tänker jag helt fel nu?

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#12

Menar mer så här:

Function GetLangString(lStrNo)
	Dim sLanguage
	sLanguage = Session("Language") = "sv"
	If Len(sLanguage) = 0 Then sLanguage = "sv"
	
	GetLangString = Application(sLanguage & "_" & lStrNo)
End Function

Så anropar du GetLangString varje gång du vill ha en sträng. Kan ju även korta ner funktionsnamnet till bara Str. :)

jimpaMedlem sedan jan. 2001361 inlägg
#13

ok, jag löste det så här!

Skriver ut så här:

=Application(getSelectedLang() & "_str0010")

Funktionen:

function getSelectedLang()
Dim a
a = Request.Cookies("lang")("uLanguage")
if a = "" then a = Session("uLanguage")
if a = "" then a = Application("Settings_DefaultLanguage")
getSelectedLang = a
end function

Någon som vet en smidigare/snabbare kod att ersätta funktionen ovan?

För tillsätta alla applicationsvariablar ett värde har jag en inkluderat en sida typ:


If Application("HasValue") <> "True" Then

'Svenska
Application("sv_str0010") = "Spara"
Application("sv_str0020") = "Ändra"
Application("sv_str0030") = "Ta bort"

'Enkelska
Application("eng_str0010") = "Save"
Application("eng_str0020") = "Edit"
Application("eng_str0030") = "Delete"

Application("HasValue") = "True"

End If

Är detta ett bra sätt?
Erik, du skrev något om XML...

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#14

Smartast är väl att först kolla i Session, sen i Cookies och i sista hand i Application. Kanske även skippa Session eller Cookies beroende på om man vill att språkinställningen ska behållas mellan besöken.

Function getSelectedLang()
	Dim sLang
	sLang = Session("uLanguage")
	If Len(sLang) = 0 Then
		sLang = Request.Cookies("lang")("uLanguage")
		
		If Len(sLang) = 0 Then
			sLang = Application("Settings_DefaultLanguage")
			Response.Cookies("lang")("uLanguage") = sLang
			Response.Cookies("lang").Expires = DateAdd("y", 1, Date)
		End If
		
		Session("uLanguage") = sLang
	End If
	
	getSelectedLang = sLang
End Function

Här så kollar den oftast bara i Session och är den tom så går den vidare till Cookies och sist till Application.

När det gäller att ladda in det så kan du göra det i Application_OnStart i global.asa. Men om du vill göra det på ditt sätt så använd ett riktigt booleanskt värde och inte ett sträng värde. Alltså jämför med If Not Application("HasValue") Then och lagra med Application("HasValue") = True. Jämför man med strängvärden så gör den det tecken för tecken. Alltså sämre prestandamässigt, men framförallt en inte lika fin kod. :)

XML, hmm... Får komma tillbaka med det. :)

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#15

XML då... Först har du en XML-fil med namnet lang.xml.

<?xml version="1.0" encoding="ISO-8859-1" ?>
<main>
	<language name="sv">
		<string id="0010" value="Spara"/>
		<string id="0020" value="Ändra"/>
		<string id="0030" value="Ta bort"/>
	</language>
	<language name="eng">
		<string id="0010" value="Save"/>
		<string id="0020" value="Edit"/>
		<string id="0030" value="Delete"/>
	</language>
</main>

Sen lite kod för att ladda in det i Application.

<%
Class XML
	Public Function loadxml()
		
		Dim fso, tso, sData
		Set fso = Server.CreateObject("Scripting.FileSystemObject")
		
		Set tso = fso.OpenTextFile(Server.MapPath("lang.xml"), 1, False)
		Set fso = Nothing
		sData = tso.ReadAll
		Set tso = Nothing
		
		Set loadxml = Server.CreateObject("MSXML.DOMDocument")
		
		loadxml.async = False
		
		loadxml.loadxml(sData)
		
	End Function
	
	Public Function GAV(ByVal n, ByVal an)
		
		If Not n Is Nothing Then
			Set n = n.Attributes.getNamedItem(an)
			If Not n Is Nothing Then
				GAV = n.nodeValue
			End If
		End If
		
	End Function
End Class

Sub SetString()
	Dim objXML, x, cx, i, j
	Dim lang
	
	Set objXML = New XML
	Set x = objXML.loadxml
	Set x = x.lastChild
	For i = 0 To x.childNodes.length - 1
		Set cx = x.childNodes.Item(i)
		lang = objXML.GAV(cx, "name")
		
		For j = 0 To cx.childNodes.length - 1
			Application(lang & "_str" & objXML.GAV(cx.childNodes.Item(j), "id")) = objXML.GAV(cx.childNodes.Item(j), "value")
		Next 'j
		
		Set cx = Nothing
	Next 'i
	Set objXML = Nothing
	Set x = Nothing
End Sub

SetString
Dim k
For Each k In Application.Contents
	Response.Write "<b>" & k & "</b> - " & Application(k) & "<br>"
Next 'k
%>

Tänk bara på att Server.MapPath inte fungerar i global.asa.

@ndersMedlem sedan juni 200032 969 inlägg
#16

Erik skrev:

Tänk bara på att Server.MapPath inte fungerar i global.asa.

Varför skulle det inte göra det? Jag använder det på över 100 ställen i min global.asa.

Mvh

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#17

Kanske är i Application_OnStart det var då. :)

Erik JuhlinMedlem sedan maj 200010 687 inlägg
@ndersMedlem sedan juni 200032 969 inlägg
#19

Det är i Application_OnStart jag använder det. :)

En sak som man ska ha i bakhuvudet är att beroende på vilken sida som körs för första gången per session eller efter omstart så kan det bli lite galet om man inte börjar sökvägen med / och utgår ifrån roten.

Edit: Aha, Erik, så var det. (y)

Mvh

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#20

Server.MapPath ska man ju egentligen försöka undvika helt.

141 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)