webForumDet fria alternativet

Femspråkig sajt, metod för översättning?

PHP

6 svar · 727 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Tjena
Håller på med en större sajt som i nuläget ska finnas på fem språk, med möjlighet att bli på, ja, hur många språk som helst.
Jag har gjort sidan i UTF-8 och använder MySQL för lagringen av data.

Nu sitter jag och funderar på hur jag ska översätta alla statiska texter (knappar, rubriker mm...).
Tidigare när jag gjort liknande saker, fast i ASP, har jag använt XML filer till det här och sen en funktion i ASP för att hämta "rätt" sträng från den fil som är vald.
Nu är jag ute efter nått liknande, men vet inte var jag ska börja.
Har sökt här på forumet men hittar inget som jag har direkt nytta av.

Jag har även googlat en hel del, men egentligen bara hittat liknande lösningar för mallsystem, där htmlkoden körs genom en funktion och allt mellan {} översätts.

Jag undrar om någon kan hjälpa mig med det här, en start iaf.för i nuläget står jag still och stampar och vet inte riktigt hur jag ska göra.

Tänkte från början hämta dessa strängar från databasen, men det känns onödigt att göra flera databasanrop på varje undersida, för prestandans skull.

Tackar för all hjälp jag kan få!

Medlem sedan jan. 20023 327 inlägg
#2

MickeA.com skrev:

Tackar för all hjälp jag kan få!

Eftersom du sa det så ;)

I Java brukar man använda sig av ResourceBundle och ha en properties-file för varje språk. En properties file är en fil med <nyckel, värde>-par. Tycker det borde finnas något liknande för .NET.

En språkfil för svenska:
welcome = Välkommen
message = Ett meddelande till dig

En språkfil för engelska:
welcome = Welcome
message = A message to you

Här är mer information om hur det fungerar i Java, är nog inte särskilt svårt att implementera en liknande lösning för .NET: http://java.sun.com/docs/books/tutorial/i18n/intro/steps.html

MickeA.com skrev:

Tänkte från början hämta dessa strängar från databasen, men det känns onödigt att göra flera databasanrop på varje undersida, för prestandans skull.

Håller med. Sedan tycker jag inte all data är lämplig att ha i en databas.

/r Ojdå, jag som inte läste ordentligt. Trodde det var ASP.net det gällde men nu såg jag att det gäller PHP. Du skulle kanske kunna implementera en lösning för PHP på samma sätt som Java? Dvs implementera din egna ResourceBundle klass :)

Eller så tittar du i denna tråden som visar ett sätt som man kan lösa det på: http://www.webforum.nu/showthread.php?t=65227

Medlem sedan feb. 20034 441 inlägg
#3

Compusa skrev:

Eller så tittar du i denna tråden som visar ett sätt som man kan lösa det på: http://www.webforum.nu/showthread.php?t=65227

Den tråden har jag redan sett, eftersom jag sökt en hel del innan jag skrev det här ;)
Tycker inte att det där är en särskilt fin lösning alls, det verkar krångligt medtanke på att min målsättning är att kunden själv ska kunna lägga till fler språk i efterhand och då ska det var enkelt och snyggt ;)

Är mest inne på en lösning med XML filer, men behöver alltså lite support på hur själva funktionen för läsning av XML fil samt sökning efter rätt fras ska se ut.

Tack!

Medlem sedan jan. 20023 327 inlägg
#4

Nej jag sa aldrig att den var snygg ;)

Men du kommenterade aldrig properties-file lösningen, måste vara ännu enklare en XML-filer. Men kör du vidare på XML om du nu är inne på det spåret, dock har jag själv inte pysslat alltför mycket med kombinationen PHP/XML.

Medlem sedan feb. 20034 441 inlägg
#5

Ska kolla mer på propertieslösningen lite senare, jag sitter paralellt och söker lite, det verkar inte finnas så mycket om XML lösningar, så jag kanske är på helt fel spår?

Jag vet att tex. vBulletin kör med XML och den administrationen dom har är klockren.
Nu hittade jag en sak på phpportalen, att göra med INI filer som man bygger upp med variabler:

[header]
page_title = "min hemsida"

[undersida1]
str_hello = "Hej"
str_bye = "Hejdå"
...

Sen anropar man "rätt" fil och sträng med tex.

$lang['undersida1']['str_hello']

Det är typ som att bygga upp med Define, eller med variabler i en PHP-fil, bara det att risken för att något ska pajja inte är så stor om man ger kunden i uppgift att själv översätta.
Det går alltså inte att lägga in "fulkod" eller nått som kan förstöra med en sådan lösning, har jag fattat det som.

Ska försöka hitta lite mer info om andra lösningar.

Medlem sedan feb. 20034 441 inlägg
#6

Nu håller jag på och testar en sak.
Steg ett är att plocka ut alla tillgängliga språk från databasen, spara dessa i en array och när man väljer ett språk med ?lang=xx_xx så ska det alltså kollas om detta finns.
Har gjort såhär:

	$sSql =	 "SELECT "
		."lang_locale "
		."FROM site_language "
		."ORDER BY lang_id ASC";
	$results = mysql_query($sSql, $the_link) or die("<p>Fel:\n" . mysql_error() . "</p>\n");
	$str = "";
	while($rs = mysql_fetch_array($results)){
		$lang_locale = $rs['lang_locale'];
		$str = $str . "\"" . $lang_locale . "\", ";
	}
	$str_array = substr($str, 0, strlen($str) - 2);

	$languages = array($str_array);
//	foreach($languages as $value){
//		print($value . "<br />");
//	}

	if (isset($_GET['lang'])&& in_array($_GET['lang'], $languages)){
		print("Finns");
	} else {
		print("finns inte...");
	}

Problemet är att "finns inte..:" skrivs ut hur jag än bär mig åt, dessa språk som finns, finns alltså _inte_ enl. ifsatsen ovan.
Skriver jag ut min array enl. foreach-loopen ovan får jag:

"sv_SE"
"en_EN"
...

Om jag då skickar med ?lang=sv_SE till sidan så bör ju "finns" skrivas ut av ifsatsen, men det händer aldrig.

Finns det nått fel i min kod ovan?

Tack!

Medlem sedan feb. 20034 441 inlägg
#7

Insåg precis att foreach-loopen ger följande:

"sv_SE", "en_EN", "de_DE", "fr_FR", "es_ES"<br />

Det är ju lite fel... nu finns alltså endast ett värde i min array och då är det inte så konstigt att det inte funkar.

Hur ska jag skriva ut alla värden ut databasen och spara dom som enskilda värden i en array?

Tack!

257 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)