webForumDet fria alternativet

Dynamiska texter i översättning

PHPur PHP

7 svar · 451 visningar · startad av Web-Tor

Medlem sedan nov. 200013 890 inlägg
Frågan#1

Jag har en sidan med olika språk (svenska, engelska...). Beroende på vilket språk besökaren har valt så inkluderar jag olika språkfiler. I språkfilerna är varje fras deklarerad så här:

$lang['start_title'] = "Välkommen";

Och på PHP-sidan så visas frasen så här:

<title><?php echo $lang['start_title']; ?></title>

Nu skulle jag behöva få in dynamiska texter i fraserna. Frasen ovan skulle t.ex. kunna vara "Välkommen Kalle" eller "Välkommen Olle".

Medlem sedan juni 20014 290 inlägg
#2

Tre exempel hur man skulle kunna lösa det:

$namn='kalle';
$lang['start_title'] = "Welcome $namn"; 
echo $lang['start_title'];
echo "\n";
 
$lang['start_title'] = "Welcome %s"; 
$namn='kalle';
printf($lang['start_title'], $namn);
echo "\n";

$lang['start_title'] = "Welcome"; 
$namn='kalle';
echo $lang['start_title']." ".$namn;
echo "\n";
Medlem sedan dec. 20003 563 inlägg
#3

Den lösning som jag sett mest och själv använder är:

Språkfilen:

$lang['start_title'] = "Välkommen %name%";

När du hämtar texten ovan så skickar du även med en array där ex Array["name"] -> "Olle" och kör en replace på alla element i den arrayen.

Ex:

$lang["welcome"] = "Hej %name%. Ditt senaste besök var %last_visit% och detta är din %login_number% inloggning."
echo my_lang_function( "welcome", {"name"="Olle","last_visit"="20090101","login_number",2} )

my_lang_function ska hämta $lang["welcome"] samt köra replace på alla index i det andra argumentet.

Reservation för att php-koden är felaktig, men tanken bör fungera.

Medlem sedan juni 20014 290 inlägg
#4

Vilket är ungefär vad printf() funktionen gör :)

$lang["welcome"] = "Hej %s. Ditt senaste besök var %s och detta är din %s inloggning.";

printf($lang["welcome"], "Olle", "20090101",2);

Fördelen, man slipper skriva en egen funktion med massa replace.

Medlem sedan dec. 20003 563 inlägg
#5

GunnarD skrev:

Vilket är ungefär vad printf() funktionen gör :)
...

Yupp. Jag skulle dock vilja dra det en nivå till då jag upplever det enklare om man exempelvis vill visa samma värde två ggr etc.

Jag kikade in lite snabbt på php.net och första kommentaren här tror jag skulle passa som handen i hansken.

$str = "Hello, %(place)s, how is it hanning at %(place)s? %s works just as well";
$find = array(
  'place' => 'world',
  'sprintf',
  'not used'
);
echo dsprintf($str, $find);
// 'Hello, world, how is it hanning at world? sprintf works just as well'

Fördelen som jag ser det att är dels om man vill ändra textsträngen och exempelvis presentera samma sträng på två ställen, så slipper man ändra i någon kod.

$lang["welcome"] = "Hej %s"
printf($lang["welcome"], "Olle");  
...
$lang["welcome"] = "Hej %s, Hur mår du %s?"
printf($lang["welcome"], "Olle", "Olle"); 
... osv

Med ett variabelnamn behöver bara localizationsträngen ändras och inte koden.

$lang["welcome"] = "Hej %name"
my_function($lang["welcome"], Array('name' => "Olle"));  
...
$lang["welcome"] = "Hej %name, Hur mår du %name%?"
my_function($lang["welcome"], Array('name' => "Olle")); 
... osv

Dessutom om man sysslar med dokumentering, översättning till flera språk med kanske en kund och andra personer inblandade, är mitt förslag förmodligen imho många gånger smidigare att underhålla. Dessutom slipper man hålla koll på ordningen av argument, som nämnt duplicering av argument samt att %name% %age% %city% torde vara mer descriptivt än %s %s %s.

Medlem sedan nov. 200013 890 inlägg
#6

GunnarD skrev:

$lang['start_title'] = "Welcome %s"; 
$namn='kalle';
printf($lang['start_title'], $namn);
echo "\n";

Det här fungerar bra för mig men jag har stött på ett problem. På ett ställe skall översättningen skickas vidare till en annan funktion men då returnerar den längden på strängen istället för texten.

mail_P(printf($lang['email_bank_body'],$cid));
Medlem sedan juni 20014 290 inlägg
#7

Ok, då kan man använda sprintf() som returnerar en sträng istället

mail_P(sprintf($lang['email_bank_body'],$cid));
Medlem sedan nov. 200013 890 inlägg
#8

Tack, det verkar fungera!

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