---
title: "Dynamiska texter i översättning"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/180105-dynamiska-texter-i-översättning"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Web-Tor"
published: "2009-09-05T07:57:49.000Z"
updated: "2009-09-05T14:55:43.000Z"
replies: 7
views: 461
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/180105-dynamiska-texter-i-översättning"
---

# Dynamiska texter i översättning

## #1 — Web-Tor, 2009-09-05T07:57Z

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:

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

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

```php
<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".

Permalänk: https://www.webforum.nu/p/180105

## #2 — GunnarD, 2009-09-05T08:25Z

Tre exempel hur man skulle kunna lösa det:

```php
$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";
```

Permalänk: https://www.webforum.nu/p/2200926

## #3 — cyprys, 2009-09-05T08:25Z

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

Språkfilen: 

```php
$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: 

```php
$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.

Permalänk: https://www.webforum.nu/p/2200927

## #4 — GunnarD, 2009-09-05T10:51Z

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

```php
$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.

Permalänk: https://www.webforum.nu/p/2200942

## #5 — cyprys, 2009-09-05T11:19Z

> **[GunnarD skrev:](https://www.webforum.nu/p/1479483)**
>
> 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](http://us2.php.net/manual/en/function.vsprintf.php) tror jag skulle passa som handen i hansken.

```php
$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.

```php
$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.

```php
$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.

Permalänk: https://www.webforum.nu/p/2200944

## #6 — Web-Tor, 2009-09-05T12:04Z

> **[GunnarD skrev:](https://www.webforum.nu/p/1479465)**
>
> ```php
> $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.

```php
mail_P(printf($lang['email_bank_body'],$cid));
```

Permalänk: https://www.webforum.nu/p/2200949

## #7 — GunnarD, 2009-09-05T12:13Z

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

```php
mail_P(sprintf($lang['email_bank_body'],$cid));
```

Permalänk: https://www.webforum.nu/p/2200953

## #8 — Web-Tor, 2009-09-05T14:55Z

Tack, det verkar fungera!

Permalänk: https://www.webforum.nu/p/2200963

---

Tråden på webben: https://www.webforum.nu/amne/php/180105-dynamiska-texter-i-översättning
