![]() |
Hur gör man enklast en websida tvåspråkig? Inget annat än språken ska variera.
Det handlar om ca 20 undersidor skrivna i php, med diverse formulär och annat meck. Är det lättast att för varje textstycke skapa en variabel, och lagra alla dessa variablar i en separatsida och sedan require ("languagevariables.php"); längst upp i varje php-dokument? Andra tips? |
En kombination av enkelhet och snygghet är väl att göra något istil med detta:
Kod:
language.php |
Jag hade delat upp texterna i XML-filer. Absolut inte en enda stor fil för all text, eftersom det vore onödigt krävande. Sen använder du en sessionsvariabel/cookie för att det ska bli något annat språk än svenska, och beroende på denna cookie så hämtar du olika XML-filer.
|
Ett annat mycket enkelt sätt är att gör en mapp/subdomän som t ex heter ENG (eller vad som önskas) och så lägger du din översättning i denna.
|
Citat:
|
Självklart. det blir dubbelt av allt(bara att kopiera allt till en annan mapp och översätta det som behövs översättas). Men eftersom jag inte har det minsta koll på hur du strukturerat upp din sida vilket jag inte heller kunde utläsa av ditt inlägg) så är mitt exempel nog det "enklaste" inte sagt att det är det effektivaste.
Men har du t ex redan Svenska språket (eller annat 1:a språk) i en databas så är det kanske enklare att bara lägga till ett språk x i databasen och skyffla ut det när det önskas. |
På en sida har jag kod enligt nedanstående, som lösning på detta. $nationality kommer ur http://www.maxmind.com/app/geoip_country men där gör man naturligtvis som man vill.
Är det databasdrivet är det förstås snyggare att sköta det där, men jag tycker detta är rätt okej om man ändå skulle ha texten inline. Separata språkfiler är ju elegantare men kanske overkill i vissa sammanhang. Kod:
<?php |
Snacka om dom flesta här är värdelösa inom optimering...
I ALLA SPRÅK så är IF .. ELSE IF ... ELSE väldigt slött. Har man många IF .. Else If .. Else så är det bättre att använda switch() / Select Case |
Det smidigaste sättet är antagligen att göra som phputvecklarna har tänkt sig att ni ska göra:
http://se.php.net/manual/en/function.define.php |
hint: ha en fil som definerar alla strängar/ord för ett särskilt språk och includa den
|
Citat:
|
Citat:
med "include" läses väl hela sidan in i modersidan? |
Citat:
|
Det här var den flummigaste tråden på länge. Jag har inte ett bra svar men jag vet att det finns ett mycket bra svar sedan gammalt här på WN. Tips för den som inte hittar: kika på hur phpBB & co. gjort.
Skillnaden på include() och require() är att include() genererar en Warning om filen saknas medans require() genererar ett Fatal Error. "In other words, use require() if you want a missing file to halt processing of the page. include() does not behave this way, the script will continue regardless." - se.php.net/include Edit. Att lägga allting i XML låter iofs som en bra metod. |
Citat:
Menar du att du skulle göra en xml-fil för t ex varje undersida? Hur skulle textstyckena/orden lagras och hämtas? Jag tar tacksamt emot ett exempel på hur detta skulle kunna lösas med xml. |
Skapa en fil för varje språk, och includa beroende på vilket man valt.
gb.lang.php: <?php define("_LANG_START_TOPIC", "Welcome"); define("_LANG_START_TEXT", "This is my page"); ?> se.lang.php: <?php define("_LANG_START_TOPIC", "Välkommen"); define("_LANG_START_TEXT", "Detta är min sida"); ?> Sen kan du t.ex requira beroende på vilket land IP är ifrån mha GeoIP: require_once("geoip/geoip.inc"); $ip = $_SERVER['REMOTE_ADDR']; $gi = geoip_open("geoip/geoip.dat",GEOIP_STANDARD); $countrycode = geoip_country_code_by_addr($gi, $ip); geoip_close($gi); $countrycode = strtolower($countrycode); switch($countrycode) { case 'se': // Swedish require_once('languages/se.lang.php'); break; default: // Default to English require_once('languages/gb.lang.php'); break; } Texten bytar du förståss ut mot konstanterna. Sen bör du bygga ut så att man kan välja språk själv, spara valet i en cookie t.ex. Funkar utmärkt även med väldigt mycket besökare, statiska filer går snabbt att ladda jämfört med att t.ex tugga sönder databasen för att hämta konstanterna. |
Har använt XML, dock inte genom att separera sidor, men tekniken jag använt fungerar även med separata översättningar per sida. Nyckeln till lösningen är att använda XPATH för att hämta rätt sträng.
Exempel: Kod:
XML filen: Kod:
/dictionary/page[@name='exempel1']/language[@name='se']/words[@key='WELCOME_MSG'] |
Citat:
Men den lösningen är nog smidigast för större projekt och flera språk. Det tar lite tid att sätta upp det där har jag en känsla av. Jag brukar testa på webläsaren för att bestämma vilket språk som skall visas. Geoip berättar ju bara vilket land surfaren kommer ifrån och sitter jag i kina så är jag tacksam om jag får engelska som visas istället för kinesiska. Sannolikheten för att jag surfar på en dator med en webbläsare vars språk jag förstår är nog större än att jag med säkerhet kan säga att landet=språket. vilket språk ska man visa i Finland, Schweiz eller Kanada? Require-filer med defines eller variabler brukar jag tycka är enkelt. byt språk genom att sätta en ny session bara. Variabler tenderar dock att vara något snabbare än konstanthanteringen i PHP. |
Citat:
|
Gettext var det jag syftade på. Tack för påminnelsen!
|
$_SERVER['HTTP_ACCEPT_LANGUAGE'] är ett väl bästa sättet att gissa önskat språk?
|
Citat:
class labels{ contents = array( "HELLO"=>"Hello world", "WELCOME" => "Welcome to my site"); getString($str){ return this.contents[$str]; } } Sen skapar du olika klasser för olika språk och inkluderar beroende på vilket locale du vill köra. Sen gör du $labels = new labels(); och vidare labels.getString("HELLO") när du vill få "Hello world". Syntaxen i klassdefinitionen kan vara lite kajko. /Z |
Alla tider är GMT +2. Klockan är nu 03:24. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson